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