dm642_HPI调通并boot成功

一直在折腾前段时间画好的dm642+lpc4357板子,说明下这个板子的结构:

  • 主芯片为DM642,这个片子很老了,但因为对这个片子熟悉,别折腾
  • 没有给DM642加FLASH,配了一片LPC4357,DM642的代码需要它HPI来加载,至于为何选这个芯片,
    主要是它带有USB2.0的PHY,关键是之前使用的时候都还算顺利(我都使用eclipse+arm gcc)
  • 两路视频输入(不能同时输入,支持切换)
  • 一路LCD显示(AT070TN92的屏)
  • DM642上的一路以太网(10M/100M)
  • LPC4357上的USB2.0,RS485以及RS232(这个主要调试时用下)

真是好事多磨,之前因为焊接问题搞了一阵子,后来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的时序,折腾几晚(晚上弄的,不是公事)都不行,简单的东西不通真是想破脑袋,分析理顺了一下:

  1. 读HPIC的时候值正确,说明OE和CS及部分数据线(HPIC不是每个位都可以在DSP端写,不能都测试)没有问题;
  2. 读其它寄存器的时候虽然不正确,但不是HPIC的值,说明地址线至少有变化,时序值得怀疑;
  3. 但是写HPIC不成功,很有可能HRW或者WE的问题,当然还有可能是时序问题;
  4. 仔细看了HPI的线,似乎都没有上下拉,说明HRW悬空的可能性不大;

好吧,三个方面:时序问题、焊接问题(之前出过问题总会不那么信任),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),成功!

你可能感兴趣的:(Boot)