1. 项目概述
在嵌入式信号处理系统的开发中,如何让一个强大的外部主机(比如ARM、FPGA或者PC)与一颗高性能的DSP芯片高效、稳定地“对话”,一直是个既基础又关键的问题。你肯定不希望主机和DSP之间用串口慢悠悠地传数据,更不希望写一堆复杂的驱动去直接操作DSP的内存总线。这时候,一个设计良好的专用并行主机接口就显得尤为重要。德州仪器(TI)的TMS320C6472和TCI6486这两款多核DSP,就内置了这样一个接口:主机端口接口,也就是我们常说的HPI。
简单来说,HPI就是DSP专门开给外部主机的一扇“后门”。通过这扇门,主机可以像访问自己的内存一样,直接读写DSP内部的RAM、外设寄存器,甚至是DSP芯片外挂的SDRAM。这为系统设计带来了极大的灵活性:主机可以实时地向DSP加载新的算法代码、传输待处理的批量数据(如图像帧、音频流),或者读取DSP处理完的结果。整个过程不需要DSP内核(CPU)的频繁干预,由HPI模块内部的DMA逻辑自动完成,实现了高效的数据搬运。
我手头这份TI的官方用户指南,详细描述了C6472/TCI6486上HPI16接口的工作原理。所谓HPI16,指的是数据总线宽度为16位,并且地址和数据是复用的——也就是说,主机只用16根数据线(HD[15:0]),既传地址也传数据,通过控制信号来区分当前总线上的信息类型。这种设计极大地节省了DSP的引脚资源,但也对时序和控制逻辑提出了更精细的要求。文档里涵盖了从信号连接、寄存器配置、读写操作时序,到FIFO缓冲、突发传输乃至主机与DSP相互中断的完整机制。对于正在或即将基于这些DSP进行系统设计的硬件和底层软件工程师而言,吃透这份指南,意味着能搭建出稳定可靠的主从通信链路,避免在调试阶段陷入时序混乱、数据错位的泥潭。
2. HPI核心架构与工作模式解析
要理解HPI,不能只把它看成一堆信号线和寄存器,得先看清它的整体定位和内部架构。在C6472/TCI6486的系统里,HPI被设计为一个主设备(Master)。这一点至关重要。这意味着HPI拥有独立的DMA控制器(即文档中提到的HPI DMA逻辑),可以主动发起对DSP内部交换中心资源(SCR)的访问,去读写内存,而不需要依赖DSP上另一个通用的EDMA3控制器。这种设计让HPI的数据传输路径更直接,延迟更低,效率更高。
2.1 系统连接与数据流全景
我们可以把HPI想象成DSP和主机之间的一个“智能邮局”。主机是发件人/收件人,DSP的内存是仓库,而HPI就是这个邮局,负责接收指令、暂存包裹、并安排“邮差”(HPI DMA)把包裹送到正确的仓库货架,或者从货架上取货。
核心组件有三个:
- HPIC (Host Port Interface Control Register):控制寄存器。主机和DSP的CPU都能访问(但权限不同),是双方的“控制面板”。在这里可以设置半字顺序、选择HPIA模式、查询状态(如HRDY),更重要的是,可以相互“敲门”通知对方——即产生中断。
- HPIA (Host Port Interface Address Register):地址寄存器。这是“仓库货架号”。主机通过它告诉HPI,数据要存到哪里,或者从哪里取。C6472/TCI6486的HPI更精细,它有两个独立的HPIA:HPIAW专用于写操作(主机→DSP),HPIAR专用于读操作(DSP→主机)。这种分离设计为某些高效的数据流模式提供了可能。
- HPID (Host Port Interface Data Register):数据寄存器。这是“邮局的前台柜台”,所有进出DSP的数据都要在这里暂存一下。主机写入的数据先放到HPID,然后由HPI DMA搬走;主机要读的数据,也是由HPI DMA先取到HPID,然后主机再从这里拿走。
数据流的典型过程如下:
- 主机写数据到DSP:主机通过控制信号(HCNTL[1:0]=01或11, HR/W=0)发起一个HPID写周期,将16位数据(半字)放到HD总线上。HPI在合适的时钟边沿将数据锁存进HPID。随后,HPI DMA逻辑自动读取HPIAW中的地址,将HPID中完整的32位字(由两个连续的16位半字组成)写入DSP内存的对应位置。
- 主机从DSP读数据:主机发起HPID读周期(HCNTL[1:0]=01或11, HR/W=1)。HPI DMA逻辑根据HPIAR中的地址,从DSP内存中读取一个32位字,拆分成两个16位半字后放入HPID。主机再分两次(通过HHWIL信号区分先后)将这两个半字从HD总线上读走。
整个过程中,HRDY(HPI Ready)信号是关键的“流量灯”。当HPI内部正在忙(比如DMA正在搬运数据,FIFO满了或空了),HRDY会输出高电平,告诉主机“别急,我还没准备好”。主机必须检测到HRDY变低,才能完成当前的总线周期。这是硬件握手的基础。
2.2 关键配置:HPIA的单/双模式与半字顺序
在深入时序之前,有两个全局配置必须在初始化阶段就确定好,因为它们直接影响所有后续访问的语义。
HPIA模式选择(DUALHPIA位)这是HPIC寄存器中的一个控制位,由主机配置。它决定了主机如何看待和使用HPIAW和HPIAR这两个地址寄存器。
- 单HPIA模式(DUALHPIA = 0):对主机而言,HPIAW和HPIAR是“绑定”的,表现为一个统一的HPIA。主机写HPIA时,会同时更新HPIAW和HPIAR;主机读HPIA时,读到的是HPIAR的值(理论上应与HPIAW相同)。在自动增量(Auto-increment)模式下,两个寄存器会同步增加。这种模式简单,适用于主机读写操作交替不频繁,或者总是成对出现的场景。
- 双HPIA模式(DUALHPIA = 1):HPIAW和HPIAR对主机完全独立。主机通过HPIC中的另一个位HPIARWSEL来选择当前操作的是读地址寄存器(HPIAR)还是写地址寄存器(HPIAW)。这带来了巨大的灵活性。例如,主机可以预先设置好一片内存区域的起始读地址(HPIAR)和起始写地址(HPIAW),然后在后续操作中,读和写可以完全独立、交替进行,互不干扰,地址指针也不会混乱。这对于实现“乒乓”缓冲、流水线处理等复杂数据流非常有用。
重要经验:在切换DUALHPIA模式后,必须重新初始化(写入)HPIAW和HPIAR。因为模式切换不会自动同步两个寄存器的值,如果不重新设置,DMA可能会从错误的地址开始存取数据。同样,在单HPIA模式下,如果主机进行了一系列读操作后想改为写操作,也最好重新写入一次HPIA,以确保HPIAW和HPIAR指向同一个 intended 地址。
半字顺序(HWOB位)由于HPI16是16位总线,而DSP内部是32位架构,所以一个32位的“字”需要分两次(两个“半字”)传输。这就产生了字节序(Endianness)问题:先传高16位(MSHalf)还是低16位(LSHalf)?
- HWOB = 0:低半字优先(Little-Endian for halfwords)。在传输一个32位字时,第一个半字(HHWIL=0)是低16位,第二个半字(HHWIL=1)是高16位。
- HWOB = 1:高半字优先(Big-Endian for halfwords)。第一个半字是高16位,第二个半字是低16位。
这个配置必须在进行任何HPID或HPIA访问之前,由主机写入HPIC设定好。一旦设定,所有通过HPI传输的32位数据都将遵循这个顺序。主机和DSP端的软件必须对这个顺序有一致的理解,否则读回来的数据高低位全是反的。HWOB的当前状态可以通过读取HPIC的bit 0或bit 8(HWOBSTAT)来获取。
3. 信号定义与硬件连接实战
纸上谈兵终觉浅,要把HPI用起来,第一步就是根据你的主机类型,正确连接物理信号线。C6472/TCI6486的HPI16接口信号不算多,但每个都有其特定作用,接错了轻则通信失败,重则可能损坏器件。
3.1 信号全解与主机适配
下表是HPI16所有信号的“简历”,连接前务必核对清楚:
| 信号名称 | 方向 | 描述与连接要点 |
|---|---|---|
| HD[15:0] | 双向 | 16位复用数据/地址总线。需连接至主机的数据总线。注意上拉/下拉电阻配置,避免未驱动时悬空。 |
| HCNTL[1:0] | 输入 | 访问类型控制线。这是HPI的“指令解码器”。主机通过这2根线告诉HPI当前要操作哪个寄存器(HPIC, HPID, HPIA)以及是否自动增量。通常连接到主机的地址线或通用GPIO。 |
| HR/W | 输入 | 读写方向控制。高电平表示主机读HPI,低电平表示主机写HPI。连接主机的读/写信号线或地址线。 |
| HCS | 输入 | 片选信号。低电平有效。只有HCS为低时,HPI才会响应HDS1/HDS2的选通。可以常低,也可以由主机控制。关键:它参与内部选通信号HSTRB的生成,并门控HRDY输出。 |
| HDS1, HDS2 | 输入 | 数据选通信号。这两个信号经过内部逻辑组合,产生实际的内部选通信号HSTRB。它们的连接方式最为灵活,取决于主机提供的选通信号类型。 |
| HHWIL | 输入 | 半字标识。仅在16位复用模式有效。低电平表示当前传输的是一个32位字的第一个半字;高电平表示第二个半字。必须按0->1的顺序严格交替。 |
| HAS | 输入 | 地址锁存使能(可选)。当主机总线是典型的地址/数据复用时,通常将主机的ALE信号接至此引脚。其下降沿用于提前锁存HCNTL[1:0]、HR/W和HHWIL的状态。如果不用,必须接高电平(VCC)。 |
| HRDY | 输出 | 就绪信号。低电平表示HPI已准备好完成当前主机周期(数据有效可读,或可接收数据)。高电平表示HPI忙,主机必须等待。这是实现可靠硬件握手的核心。 |
| HINT | 输出 | 主机中断。低电平有效。当DSP的CPU写HPIC的HINT位为1时,此引脚变低,可用于中断主机处理器。 |
3.2 选通信号(HDS1/HDS2)的连接艺术
HDS1和HDS2的连接是硬件设计中的一个关键点,它直接决定了主机如何“敲门”让HPI响应。内部逻辑是:HSTRB = !(HCS & (HDS1 ^ HDS2))。也就是说,只有当HCS有效(低)且HDS1和HDS2电平不同时,内部才会产生一个有效的低脉冲(HSTRB下降沿和上升沿)。
根据主机接口类型,你有以下几种接法:
主机有独立的读选通(RD#)和写选通(WR#)信号(均低有效):
- 推荐接法:将主机的
RD#接HPI的HDS1,WR#接HDS2。这样,主机读操作时,RD#变低而WR#保持高,满足HDS1 != HDS2,产生读选通;写操作时亦然。此时,HPI的HR/W信号可以固定接高或接低(如果主机没有单独的R/W线),或者也可以将HR/W连接到主机的一条地址线上,由软件控制。这是最清晰、最推荐的方式。
- 推荐接法:将主机的
主机只有一个数据选通信号(DS#),另有一个方向信号R/W#:
- 接法:将主机的
DS#接HPI的HDS1(或HDS2),将另一个未用的HDS引脚(HDS2或HDS1)通过电阻上拉到VCC(逻辑1)。主机的R/W#信号连接到HPI的HR/W。 - 工作原理:无论读写,主机发出的
DS#脉冲都会在接通的HDS引脚上产生下降沿和上升沿。由于另一个HDS被固定为高,HDS1和HDS2的电平在选通期间必然不同,从而产生有效的HSTRB。读写方向则由HR/W区分。
- 接法:将主机的
将HCS作为一个选通信号使用(不推荐):
- 有些设计为了节省主机信号线,会将HCS和HDS1短接,共同由主机的一个选通信号驱动。这样,选通信号变低时,同时完成了片选和选通。
- 风险提示:这种方式下,HRDY信号会被HCS门控。当这个复合的选通/片选信号变高(取消片选)时,无论HPI内部是否真的准备好,HRDY都会立即变低。如果主机在HRDY变低后立即开始下一个周期,而HPI内部尚未就绪,就会导致数据错误。因此,除非主机有完善的等待状态插入机制,否则这种接法需谨慎评估时序。
实操心得:在新设计上,强烈采用第一种方式(独立RD#/WR#)。它逻辑清晰,时序最易满足,调试也最简单。如果使用的是现成主板或FPGA IP,需要仔细查阅其主机接口时序图,确定其选通信号的行为,再对照上表选择连接方式。用示波器同时抓取HCS、HDS1、HDS2和内部希望锁存的信号(如HD数据),是调试连接是否正确的最直接手段。
3.3 地址锁存使能(HAS)的使用场景
HAS信号是为具有典型复用总线的主处理器(如某些ARM或旧款x86处理器)准备的。这类处理器在总线周期开始时,先输出地址和周期类型(放在地址线上),然后发出一个ALE高脉冲;在ALE下降沿,外部逻辑(如锁存器)应锁存地址信息;随后,处理器将地址线切换为数据线,进行数据传输。
- 使用HAS:将主机的ALE接至HPI的HAS。在ALE下降沿,HPI会锁存住此时HCNTL[1:0]、HR/W、HHWIL的状态。这样,主机可以提前释放这些控制线(比如让它们切换为输出数据),为数据传输留出更长的建立时间,对时序紧张的系统有帮助。
- 不使用HAS:如果主机没有ALE,或者时序裕量充足,可以将HPI的HAS引脚直接通过电阻上拉到VCC(接高电平)。此时,控制信息(HCNTL[1:0], HR/W, HHWIL)的锁存将发生在内部选通信号HSTRB的下降沿。
如何选择?如果你的主机有ALE信号,就用上它,这是最标准、最可靠的接法。如果没有,直接拉高即可,HPI完全支持这种模式。绝对不要让HAS悬空。
4. 寄存器访问与读写操作时序详解
理解了信号连接,我们深入到最核心的部分:主机如何通过操作HPI的寄存器,来完成一次具体的数据读写。这个过程就像一套精心设计的“暗号”交接流程。
4.1 访问类型解码:HCNTL[1:0]与HR/W
主机通过驱动HCNTL[1:0]和HR/W这组信号,来告诉HPI它想干什么。这个“指令”必须在数据相位开始前被HPI锁存。
| HCNTL1 | HCNTL0 | HR/W | 操作类型 | 说明 |
|---|---|---|---|---|
| 0 | 0 | 0 | 写HPIC | 主机配置控制寄存器(如设置HWOB, DUALHPIA)。 |
| 0 | 0 | 1 | 读HPIC | 主机读取控制寄存器状态(如查询HRDY bit, HWOBSTAT)。 |
| 0 | 1 | 0 | 写HPID(自动增量) | 主机写数据到HPID,写完后HPIAW(或HPIAR)自动+1。 |
| 0 | 1 | 1 | 读HPID(自动增量) | 主机从HPID读数据,读完后HPIAR(或HPIAW)自动+1。 |
| 1 | 0 | 0 | 写HPIA | 主机设置地址寄存器(HPIAW或HPIAR)。 |
| 1 | 0 | 1 | 读HPIA | 主机读取当前地址寄存器的值。 |
| 1 | 1 | 0 | 写HPID(非增量) | 主机写数据到HPID,地址寄存器不变。 |
| 1 | 1 | 1 | 读HPID(非增量) | 主机从HPID读数据,地址寄存器不变。 |
关键点解析:
- HPIC访问:通常用于初始化和状态查询。注意HPIC是32位寄存器,但在16位模式下,主机只需访问其低16位(通过一个单半字周期即可,见后文)。
- HPIA访问:用于设置或读取当前操作的DSP内存地址。地址是字地址(32位单位)。
- HPID访问(自动增量):这是实现突发传输(Burst)的关键。主机连续进行此类读写时,地址会自动递增,从而快速访问连续的内存块。HPI内部的FIFO会在此模式下发挥作用以提升性能。
- HPID访问(非增量):用于随机访问或重复访问同一地址。
4.2 16位复用模式下的数据传输协议
在HPI16模式下,任何32位数据的传输(无论是HPIA的地址值,还是HPID的实际数据)都需要两个连续的16位半字传输来完成。HHWIL信号在这两个周期中扮演着“节拍器”的角色:
- 第一个半字传输时,主机必须驱动
HHWIL = 0。 - 第二个半字传输时,主机必须驱动
HHWIL = 1。
这两个传输合起来称为一个“主机周期”。在一个主机周期内,HCNTL[1:0]和HR/W必须保持不变。主机必须在完成第一个半字传输后,紧接着发起第二个半字传输,不能插入其他操作。
传输顺序示例(假设HWOB=0,低半字优先):主机要写入一个32位数据0x12345678到HPID。
- 第一个半字周期:主机驱动
HCNTL[1:0]=01(自动增量写),HR/W=0,HHWIL=0,在HD总线上放置低16位数据0x5678。 - HPI在内部HSTRB的上升沿锁存
0x5678到HPID的低半字位置。 - 第二个半字周期:主机驱动
HCNTL[1:0]=01,HR/W=0,HHWIL=1,在HD总线上放置高16位数据0x1234。 - HPI锁存
0x1234到HPID的高半字位置。至此,完整的0x12345678被存入HPID。随后,HPI DMA逻辑启动,将此数据写入HPIAW指向的DSP内存地址。如果这是自动增量写,完成后HPIAW地址自动加1(指向下一个字)。
4.3 关键时序图解读与HRDY握手
时序是接口工作的灵魂。我们结合文档中的图5(使用HAS的读周期)和图6(使用HAS的写周期)来理解。
读周期时序要点:
- 建立阶段:主机先使能HPI(
HCS拉低),然后输出控制信号(HCNTL[1:0],HR/W=1,HHWIL=0)和地址(如果使用复用总线,地址也出现在HD上)。接着,主机发出HAS下降沿(如果使用),HPI在此刻锁存控制信息。 - 选通与等待:主机发出数据选通(
HDS1/HDS2产生差异,形成内部HSTRB下降沿)。HPI在HSTRB下降沿后,根据锁存的地址和控制信息,开始准备数据。如果数据未就绪(例如需要从DSP内存读取),HRDY输出高电平,主机必须等待。 - 数据采样:当HPI将数据准备好并驱动到HD总线上后,
HRDY变低。主机检测到HRDY为低后,在HSTRB上升沿之前采样HD总线上的数据(第一个半字)。 - 第二个半字:主机保持
HCNTL/HR/W不变,将HHWIL驱动为1,再次发出选通。重复等待HRDY和采样数据的过程,获取第二个半字。 - 周期结束:主机释放选通,
HSTRB变高。HCS可以继续保持低(连续访问)或变高(结束访问)。
写周期时序要点:
- 建立与锁存控制:同读周期,主机设置控制信号和地址,用
HAS或HSTRB下降沿锁存。 - 提供数据与等待:主机将第一个半字数据驱动到HD总线上。然后发出选通(
HSTRB下降沿)。HPI此时可能因为内部FIFO满等原因无法立即接收数据,会拉高HRDY。主机必须等待HRDY变低。 - 数据锁存:当HPI内部准备好接收数据时,
HRDY变低。主机应在HRDY变低后,确保数据在HD总线上保持稳定,直到HSTRB上升沿。HPI在HSTRB上升沿锁存HD总线上的数据。 - 传输第二个半字:过程类似,主机更新
HHWIL=1和第二个半字数据,重复步骤2-3。 - 数据写入内存:两个半字都锁存入HPID后,HPI DMA在后台将其写入DSP内存。主机可以立即开始下一个周期(如果FIFO未满)。
避坑指南:HRDY的等待策略永远不要忽略
HRDY。主机的HPI驱动代码必须包含对HRDY信号的查询或硬件等待机制。一种简单的软件轮询方法是:在发起选通后,循环读取HPI的某个状态(实际上,对于主机,查询HRDY状态需要通过一次HPIC读操作,这本身也是一个HPI访问周期,需要小心处理以避免死锁)。更高效的方式是利用主机总线控制器硬件支持插入等待状态的功能,将HRDY连接到主机的READY或WAIT#引脚,让硬件自动插入等待周期。这是保证大数据量传输稳定性的基石。
5. FIFO、突发传输与性能优化
HPI并非简单地来一个数据搬一个,其内部集成了读写FIFO(先入先出缓冲区),这是实现高性能突发传输和优化总线效率的核心。
5.1 FIFO工作机制与深度
根据文档,HPI内部包含读FIFO和写FIFO。但文档没有明确给出FIFO的具体深度,这通常需要查阅芯片的勘误表或更详细的技术参考手册。对于C6472/TCI6486,常见的HPI FIFO深度是4个或8个32位字。我们以深度为4为例进行说明。
- 写FIFO:当主机执行HPID写操作(无论是否自动增量)时,数据被锁存到HPID后,并不是立即写入DSP内存,而是先被送入写FIFO。HPI DMA逻辑则从写FIFO的另一端取出数据,写入HPIAW指向的DSP内存。只要写FIFO未满,主机就可以连续快速地写入多个数据,而无需等待每个数据都完全写入内存。这有效地“吸收”了主机总线速度与DSP内存访问速度之间的差异。
- 读FIFO:当主机执行HPID读操作时,如果读FIFO为空,HPI DMA逻辑会预先从HPIAR指向的DSP内存中读取一个数据块(比如4个字)填充到读FIFO中。随后主机发出的读请求,可以直接从读FIFO中快速获取数据,直到FIFO快空时,DMA再预取下一批数据。
5.2 突发传输(Bursting)的实现与优势
突发传输是提升HPI数据吞吐量的关键技术。它依赖于两个机制:
- 自动地址增量:当主机使用
HCNTL[1:0]=01(自动增量)模式访问HPID时,每完成一次32位字的传输,对应的HPIA寄存器(读用HPIAR,写用HPIAW)会自动加1,指向下一个连续的字地址。 - FIFO缓冲:如上所述,FIFO允许主机在DMA忙于搬运前一个/后一个数据时,继续发送/接收后续数据。
突发写流程:
- 主机先通过一次HPIA写操作,设置好起始地址到HPIAW。
- 主机开始一系列
HCNTL[1:0]=01, HR/W=0的HPID写操作。 - 主机可以连续写入多个字(比如4个),速度很快,因为数据只是被快速填入写FIFO。
- HPI DMA在后台,依次将FIFO中的数据写入以HPIAW起始的连续内存中,每写一个字,HPIAW自动加1。
- 当主机写入速度持续超过DMA写出速度,写FIFO最终会满。此时,主机再发起写操作时,HPI会立即拉高
HRDY,迫使主机等待,直到FIFO有空间。
突发读流程:
- 主机设置好起始地址到HPIAR。
- 主机发起第一次
HCNTL[1:0]=01, HR/W=1的HPID读操作。由于读FIFO初始为空,HPI会拉高HRDY,同时DMA启动,从内存预读多个字(如4个)填充读FIFO。 - 预读完成后,
HRDY变低,主机读取第一个字。 - 后续的连续读操作会非常快,因为数据直接从读FIFO中取出,直到FIFO即将被读空,DMA会再次触发预读,此时可能伴随短暂的
HRDY等待。
性能调优经验:
- 最大化突发长度:在传输大块连续数据时,务必使用自动增量模式(
HCNTL[1:0]=01),并让主机尽可能连续访问,填满或清空FIFO,减少DMA启动次数和HRDY等待。- 关注FIFO刷新条件:文档提到FIFO在特定条件下会被刷新(Flush),例如在HPI软件复位(HPIRST)或硬件复位期间,以及当主机切换访问类型(如从读HPID切换到写HPID)时。这意味着,在改变数据传输方向后,最初的几次访问可能会因为FIFO为空/满而产生额外的HRDY等待,性能不是最佳的。对于时间敏感的代码段,需要考虑这个因素。
- 双HPIA模式的优势:在双HPIA模式下,主机可以独立维护读和写的地址指针。这样可以在读FIFO被DMA预取数据占用时,主机同时向写FIFO写入数据,实现读写操作的真正并行,进一步挖掘HPI的带宽潜力。
5.3 软件握手:查询HRDY状态位
除了硬件信号HRDY,HPI还提供了通过软件查询“就绪”状态的方法。在HPIC寄存器中,有一个HRDY位(具体位置需查寄存器描述)。主机可以通过读取HPIC来获取这一位的值。
- HRDY位 = 0:表示HPI就绪,可以完成当前类型的访问周期(与硬件
HRDY信号状态相关但不完全等同,更多反映内部FIFO/DMA状态)。 - HRDY位 = 1:表示HPI忙。
软件握手通常作为硬件握手的补充或备用方案。例如,在某些不支持硬件等待信号的主机平台上,驱动程序可以通过轮询HPIC中的HRDY位来决定何时发起下一次访问。但要注意,读取HPIC本身也是一个HPI访问周期,如果HPI正忙,这个读操作也可能被HRDY信号阻塞。因此,软件轮询策略需要精心设计,避免陷入死循环。
6. 主机与DSP的交互:中断与复位
HPI不仅是数据通道,也是主机和DSP CPU之间的控制与状态交互通道。
6.1 中断机制
HPI支持双向中断:
- 主机中断DSP:主机通过向HPIC寄存器的DSPINT位写1,可以触发一个中断到DSP的CPU。DSP CPU需要在其中断服务程序(ISR)中处理这个事件,例如读取HPI传递过来的命令字。主机在DSP处理完中断后,通常需要再次写DSPINT位来清除中断标志(具体需参考芯片手册,有些设计是写1清除,有些是自动清除)。
- DSP中断主机:DSP CPU通过向HPIC寄存器的HINT位写1,可以将HPI的HINT输出引脚拉低,从而中断主机处理器。主机在中断服务程序中,可以通过读取HPIC来获知是HPI产生的中断,并进行相应处理。主机必须通过向HINT位写1来清除这个中断,这将使HINT引脚恢复高电平。
重要提示:HPIC寄存器对于主机和DSP CPU的访问权限是不同的。例如,HINT和DSPINT这两个中断位,双方都可以读写,从而实现了中断的触发和清除。但其他一些配置位可能只允许主机写入。在编写双端代码时,必须严格参照寄存器描述表(如文档中的Table 8),明确各方的读写权限,避免误操作。
6.2 复位与初始化序列
一个可靠的HPI驱动,必须以正确的复位和初始化序列开始。
- 硬件复位后:DSP上电或硬件复位后,HPI模块处于复位状态(HPIRST位可能为1)。此时,所有主机访问都会被挂起,
HRDY可能始终为高。主机此时不应尝试访问HPI。 - DSP CPU初始化:DSP的启动代码或应用程序,在早期需要清除HPI的复位状态。这通常通过清除PWREMU_MGMT或HPIC寄存器中的HPIRST位来实现。具体操作需查阅器件数据手册。
- 主机初始化配置:确认HPI已退出复位后,主机应执行以下配置序列:
- 步骤一:写HPIC,配置HWOB。根据主机和DSP软件约定的字节序,设置HWOB位(0或1)。这一步必须在任何HPID或HPIA访问之前完成!
- 步骤二:写HPIC,配置HPIA模式。根据应用需求,设置DUALHPIA位,决定使用单HPIA还是双HPIA模式。如果选择双HPIA模式,同时设置HPIARWSEL位来选择初始操作的地址寄存器。
- 步骤三:初始化HPIA寄存器。通过HPIA写操作,向HPIAW和/或HPIAR写入起始地址。如果是在单HPIA模式下切换了数据方向,或者改变了DUALHPIA模式,必须重新初始化HPIA。
- 开始数据传输:完成以上步骤后,主机就可以通过HPID寄存器进行正常的数据读写操作了。
调试惨痛教训:最常见的HPI初始化问题就是HWOB设置错误或设置时机太晚。如果主机和DSP对于32位数据的高低半字顺序理解不一致,那么所有传输的数据都是错的。另一个常见问题是忘记在模式切换后重新初始化HPIA,导致DMA从错误的地址开始存取数据,造成内存覆盖或读取到错误数据。务必把初始化序列作为固定模板写在代码里。
7. 常见问题排查与实战技巧
即使按照手册连接和编程,在实际调试中仍会遇到各种问题。下面是一些典型故障现象和排查思路。
7.1 问题排查速查表
| 现象 | 可能原因 | 排查步骤 |
|---|---|---|
| 主机读写HPI无任何反应,HRDY常高。 | 1. HPI未退出复位状态。 2. HCS信号连接错误或未被拉低。 3. 电源、时钟、引脚复用配置错误。 | 1. 确认DSP软件已清除HPIRST位。 2. 用示波器测量HCS引脚在访问期间是否为低电平。 3. 检查DSP的HPI相关时钟是否使能,引脚是否正确配置为HPI功能(非GPIO)。 |
| 主机可以读/写HPIC,但访问HPID时HRDY一直等待或数据错误。 | 1. HWOB位设置错误或未设置。 2. HPIA寄存器未初始化或初始化值错误。 3. HHWIL信号时序错误,未按0->1交替。 4. 访问了DSP内存中无效或受保护的地址空间。 | 1. 确保在访问HPID前已正确配置HWOB。 2. 单步调试,检查主机写入HPIA的值是否正确(是字地址)。 3. 用逻辑分析仪抓取HHWIL信号,看是否严格交替。 4. 确认HPIA指向的地址是DSP内存的有效可访问区域(如内部RAM)。 |
| 突发传输时,前几个字正常,后续数据错乱。 | 1. FIFO刷新条件未考虑。切换访问类型后性能下降。 2. 在自动增量模式下,主机意外打断了突发序列(插入其他类型访问)。 3. 主机等待HRDY的策略有缺陷,在FIFO满时未正确等待。 | 1. 在改变数据流方向(读->写或写->读)后,预期并容忍最初几次访问的延迟。 2. 确保突发传输过程中,HCNTL[1:0]和HR/W信号保持稳定。 3. 强化主机端的HRDY等待机制,确保硬件或软件能可靠响应。 |
| DSP无法通过HINT中断主机。 | 1. HINT引脚连接错误或主机中断配置错误。 2. 主机未正确处理或清除HINT中断。 3. HPIC中的HINT位写入后,主机端未及时读取状态。 | 1. 测量HINT引脚电平,看DSP写HPIC后是否变低。 2. 检查主机中断控制器配置,确认HINT引脚对应的中断已使能。 3. 主机中断服务程序中,必须读取HPIC并向HINT位写1以清除中断。 |
| 使用双HPIA模式时,读写地址指针混乱。 | 1. 未正确设置或切换HPIARWSEL位。 2. 在单/双HPIA模式切换后,未重新初始化HPIAW和HPIAR。 | 1. 在每次进行HPIA访问前,确认HPIARWSEL位指向了正确的寄存器(读用HPIAR,写用HPIAW)。 2. 在设置DUALHPIA=1后,立即分别对HPIAW和HPIAR进行写入初始化。 |
7.2 实战技巧与心得
- 上电先读后写:在主机驱动初始化时,可以先尝试进行一次HPIC的读操作。如果成功,说明基本通信链路是通的。然后再进行配置写入。这是一种简单的链路测试。
- 利用HRDY进行超时处理:即使在硬件等待模式下,也建议在主机软件驱动中加入超时机制。如果一次访问等待HRDY的时间超过预期(例如1ms),则判定为HPI错误,进行错误恢复或日志记录,防止系统死锁。
- 地址对齐:HPI访问的地址是字地址(32位对齐)。主机在计算地址时务必注意。例如,想访问DSP内存的字节地址
0x80000000,则HPIA应写入0x20000000(右移2位)。 - 性能评估:不要期望HPI能达到DSP内部总线的理论峰值带宽。实际带宽受限于主机总线频率、HPI时钟频率、DSP内存访问竞争以及FIFO深度。通过测量传输一大块数据(如1MB)的总时间来计算实际带宽,作为系统设计的依据。
- 逻辑分析仪是你的好朋友:调试HPI这种并口时序问题,一个多通道的逻辑分析仪至关重要。同时抓取HCS, HDS1, HDS2, HR/W, HCNTL[1:0], HHWIL, HRDY, HAS以及HD[15:0]数据线,对照时序图分析,绝大多数问题都能一目了然。