HPI称为主机接口,是dsp与主机CPU相连接的一个并行通信口,外部的主机CPU可以通过这个接口直接访问DSP的储存器空间。还记得bootloader有个引导模式是HPI接口引导,就是事先把程序写在外主机的flash中,上电后通过HPI接口将flash中的程序写入dsp的内存去运行,若该程序是bootloader引导程序,那么可以实现二次引导。
相比之前介绍的EMIF、EDMA,HPI接口简单的多。相关的只有三个寄存器,HPID存放读写的数据,HPIA存放访问的地址,HPIC控制寄存器。重点在于如何访问这三个寄存器,注意到DSP和主机CPU连接的三条地址线是HCNTL[1:0]和HHWIL。其中HCNTL[1:0]可以构造4个地址,分别是:
HCNTL1 HCNTL0
功能
0 0
HPIC
0 1
HPIA
1 0
HPID地址自动增加模式
1 1
HPID固定地址模式
关于最后两个模式,我目前只把它当成两个HPID寄存器...
因此与主机的地址线相连,主机便可以知道寄存器的地址了,一般用宏先定义比较方便。四个地址分别命名为HPIC_addr、HPIA_addr、HPID_addr、HPID_AUTO_addr。
具体到每个引脚的时序也不去细究了,只需要知道访问寄存器的顺序是:
1、初始化HPIC;
2、初始化HPIA;
3、对HPID进行读写操作。
读写程序(以自动地址增加模式为例):
void HPI_write(Uint32 addr, Uint32 *buf, Uint32 len)
{
Uint32 i;
HPIC_addr = 0x00000000;
//唯一不懂的是这里,到底有什么用,其它地方也很少用的感觉
HPIA_addr = addr;
for(i = 0;i<len;i++)
HPID_AUTO_addr = buf[i];
//因为是自动增地址,不用++
}
void HPI_read(Uint32 addr, Uint32 *buf, Uint32 len)
{
Uint32 i;
HPIC_addr = 0x00000000;
//又来
HPIA_addr = addr;
for(i = 0;i<len;i++)
buf[i] = HPID_AUTO_addr;
}
注意以上程序包括读写的main函数是放在主机CPU中的例如单片机、ARM或其它dsp。