用LPC2478自带模块控制TFT和SDRAM,在使用中读取文件数据时有时会出现个别数据(可能是1个或者几个,几十K的文件大小,全局变量全部放在SDRAM中)会出现错误。查了很长时间没发现问题出在哪里。后来做了个测试程序,只留下基本的TFT驱动和SDRAM的测试<br />当把LCD功能屏蔽或只显示基本色时,SDRAM读写正常。<br />当显示一幅图片(或只显示几个小图片时)SDRAM中的个别数据会错误。错误的地址没有规律(整屏图片时出错的数据较多,小图片时出错的数据较少)<br />测试程序为: 定义一个1M字节的数组(SDRAM中),依次写入0~255,全部写完后再去读取数据是否为0~255,这时可能会出错上述情况。但是在写完一个数据马上读取这个数据时是正常的,说明出错情况可能是在写后面的数据时把前面的某个数据改掉了。在测试程序中关中断也试过无好转。<br />#define FILE_DataLen 1048576<br />uint8 FileData[FILE_DataLen]; // 1M Byte<br />uint32 SdRam_Test(void)<br />{<br />uint32 i,j;<br />uint32 error1,error2;<br /> Dis_Strings(" ",30,30,C_Black,C_Black);<br /> Dis_Strings(" ",30,50,C_Black,C_Black);<br /> error1=0;<br /> error2=0;<br />//IRQDisable(); //无效果<br />//LCD_CTRL&=(~1); //关TFT时,读写正常<br /> for(i=0;i<(FILE_DataLen/256);i++)<br /> {<br /> for(j=0;j<256;j++)<br /> {<br /> FileData[i*256+j]=j;<br /> if(FileData[i*256+j]!=j)<br /> {<br />error1++; //这一步设断点不会进<br /> }<br /> if(j>0)<br /> {<br /> if(FileData[i*256+j-1]!=(j-1))<br /> {<br />error1++;//会进但比error2的次数少很多<br /> }<br /> }<br /> }<br /> }<br />//LCD_CTRL|=1;<br /> for(i=0;i<(FILE_DataLen/256);i++)<br /> {<br /> for(j=0;j<256;j++)<br /> {<br /> if(FileData[i*256+j]!=j)<br /> {<br />error2++; //会进<br /> }<br /> }<br /> }<br />//IRQEnable();<br /> Dis_NumAll(error1,30,30,5,C_Red,C_Black);<br /> Dis_NumAll(error2,30,50,5,C_Red,C_Black);<br /> return(error2);<br />}<br />通过View Memory查看SDRAM相应的值确实错误<br />当把屏幕分别刷成全黑,全白,全红,全绿,全黄。。。时测试正常<br /><br />怀疑是否会是LPC2478的TFT和SDRAM频繁操作时总线冲突造成的??????<br />ADS1.2编译,TFT为640*480 |
|