今天编写了一段程序验证FLASH读写,编译后下到DSP板上执行,发现写FLASH没有成功。下面是一段写FLASH的函数:
void DM642_FLASH_write(Uint32 src, Uint32 dst, Uint32 length)
{
Uint8 *psrc, *pdst;
Uint32 i;
/* Establish source and destination */
psrc = (Uint8 *)src;
pdst = (Uint8 *)dst;
for (i = 0; i < length; i++)
{
/*Program one 8-bit word*/
*((Uint8 *)EVMDM642_FLASH_CTLAAA) = 0xaa; //A句
*((Uint8 *)EVMDM642_FLASH_CTL555) = 0x55; //B句
*((Uint8 *)EVMDM642_FLASH_CTLAAA) = 0xa0; //C句
*pdst = *psrc; //D句
/* Wait for operation to complete*/
while(1)
if (*pdst == *psrc)
break;
pdst++;
psrc++;
}
*((Uint16 *)EVMDM642_FLASH_BASE) = 0xf0;
}
主程序中调用函数如下:
DM642_FLASH_write(0x80000000, 0x90000100, 0xffff);
该段代码将SDRAM中开始的64K数据写入FLASH中。看程序没有问题,而板上的CPLD是经过仿真验证的。为定位问题,测量FLASH的WE脚和一根数据线。
代码前3句(A、B、C)三句是FLASH写“解锁”(29LV320:BYTE模式)。每个循环应当是四次写操作,而在示波器上只有三个低电平。然后单步执行,在B、C、D句执行后都能看到WE脚上的低电平。而一次循环结束后不是返回执行A句而是返回到B句,A句根本就没有执行。看编译后的代码,A句没有对应的代码。于是认为应当是CCS编译器的问题。突然想到A句、C句目的地址相同,也许是编译过程中自动优化把A句省掉了。于是在CCS编译器中寻找编译优化的相关配置,之后在project->Build Options的Compiler栏里找到了对应项--“Opt Level”,默认优化等级为3级(-o3),将此项改为“None”。重新编译程序,将程序下载到DM642单板,运行即看到A句能够执行,FLASH写读均正常。
将问题记录到日志,一方面如果以后再遇到此问题可以找回解决方法,另一方面也会对一些和我一样对DSP编程不熟悉的朋友有一些帮助(也可以通过命令对单句进行禁止编译优化来解决该问题)。
至今天中午,由偶单独开发的DM642硬件系统32MB SDRAM(133M)、GPIO、FLASH均验证OK,小系统部分验证完成,下一步调试图像采集部分:)
有奖活动 | |
---|---|
【有奖活动】分享技术经验,兑换京东卡 | |
话不多说,快进群! | |
请大声喊出:我要开发板! | |
【有奖活动】EEPW网站征稿正在进行时,欢迎踊跃投稿啦 | |
奖!发布技术笔记,技术评测贴换取您心仪的礼品 | |
打赏了!打赏了!打赏了! |