做数据采集,原来规划每20mS保存一扇区的数据。
测试中发现大部分TF卡会出现丢写数据的问题,仅有两张卡没有问题。
用逻辑分析仪抓5秒的波形,分析波形,
正常的每个扇区写入时间为两三个毫秒(因为怀疑通信速率是否太高,已经将SPI时钟降到1MHz)。
出现异常的地方扇区写入的时间特别长,二三十毫秒,甚至八九十毫秒。
致使后面采集的数据来不及写入,而丢失。
从波形看,出现问题没有什么特别规律,
同样出问题的卡,这次5秒也许没有出现异常波形,后面一次5秒采集就出现5、6个异常。
不过,会出问题的卡,每5秒的采集大部分都是会出现异常,5秒内不出现异常的相对少。
没有两张问题的卡,绝大部分情况下都不会出现异常,但偶尔也会看到异常。
仿真分析依次从SD.C里下面函数深入: SD_WriteDisk、SD_SendCmd、SD_Select、SD_WaitReady
最后确定在SD_WaitReady函数下这个while循环语句占用了很长时间。
从抓到的SPI波形看,SD_SPI_ReadWriteByte(0XFF)返回的都是0x00。
这个出现异常的轮询时间不固定。
unsigned char SD_WaitReady(void)
{
unsigned int t=0;
do
{
if(SD_SPI_ReadWriteByte(0XFF)==0XFF)
{
return 0;
}
t++;
}while(t<0XFFFFFF);
return 1;
}转载
|