一直在折腾前段时间画好的dm642+lpc4357板子,说明下这个板子的结构:
真是好事多磨,之前因为焊接问题搞了一阵子,后来HPI也遇到问题,终于弄通了,记录下!
通过LPC4357的EMC连接DM642的HPI16,测试硬件自然力求简单,超简单的程序(本来HPI的结构也很简单):
void HPI_test(void)
{
volatile uint32_t pdat;
HPI_Init(LPC_EMC_BASE);
volatile uint32_t *pAddr=(volatile uint32_t*)HPIC_ADDR_RBASE;
uint32_t x;
while(1)
{
pAddr=(volatile uint32_t*)HPIC_ADDR_RBASE;
pdat = *pAddr;
pAddr=(volatile uint32_t*)HPIA_ADDR_RBASE;
pdat = *pAddr;
pAddr=(volatile uint32_t*)HPIDI_ADDR_RBASE;
pdat = *pAddr;
pAddr=(volatile uint32_t*)HPIDF_ADDR_RBASE;
pdat = *pAddr;
HPI_Write(0x22,0x12345678);
x=HPI_Read(0x22);
}
}
通过单步调试来查看变量值来验证正确性。一开始不如所意,偶然发现读HPIC的值是正确的,但其它的就不行了,
调整EMC的时序,折腾几晚(晚上弄的,不是公事)都不行,简单的东西不通真是想破脑袋,分析理顺了一下:
好吧,三个方面:时序问题、焊接问题(之前出过问题总会不那么信任),WE(严重怀疑)。异步读写是最简单的操作,
我把各个寄存器的时间都设置成最长,那么时序问题的可能性很小了,WE能有什么问题呢,想不明白。
只好继续看参考手册,又去看数据手册,想找找波形图,找到了个很简陋的波形图,发现PB=0的时候WE没有动作,而PB=1
的时候WE动作了,那么问题来了,仔细地把STATICCONFIG中的PB一个单词不放过地看,终于找到问题了:
** Remark: When PB is set to 0, the WE signal is undefined or 0.
You must set PB to 1, to use the WE signal. **
坑爹啊,本来看这个位的名称就是Byte lane state,跟WE又扯上关系了!设置好后,所有问题解决。后来HPI BOOT的问题就一次测试搞定了:
写了个小python程序将DM642的代码(中断向量需要在0地址)生成的.out文件中需要加载的段转化成c程序,并组成一个链表,然后通过HPI
写到DSP中并给一个DSPINT(需要设置DM642的启动方式为HPI),成功!