本帖最后由 yanjinbin 于 2012-7-5 21:26 编辑
1.同一个SPI读写SD程序,使用FAT_FS文件系统,使用STM32F205芯片。
2.当使用IAR 6.10编译时,SD卡读写正常。
3.当使用IAR 6.30编译时,SD卡写入数据出错.
4.出错代码深入解析:
f_mount(1, &wav_fs); //正常
f_open(&File,(char const *)Name,FA_CREATE_ALWAYS|FA_READ|FA_WRITE) //正常
f_write(&File,Buffer,5,&Bw)//出错
5.在深入f_write()出错地方研究:
f_write()
->create_chain(fp->fs, 0)
->get_fat(fs, ncl)
->move_window(fs, fs->fatbase + (clst / (SS(fs) / 4)
->disk_write(fs->drv, fs->win, wsect, 1)
->SD_WriteDisk((u8*)buff,sector,count)
->r1=SD_SendCmd(CMD24,sector,0X01) //发送CMD24指令正常
r1=SD_SendBlock(buf,0xFE);
->SD_SPI_ReadWriteByte(0xFF); //最后发送两字符crc
->t=SD_SPI_ReadWriteByte(0xFF); //接收响应-这里出错应该返回0xE5的,但是这里总是返回出错代码(例如:0xE7或0xFF)。
if((t&0x1F)!=0x05)return 2;//响应错误
此时函数如下:
u8 SD_SPI_ReadWriteByte(u8 TxData)
{
u8 retry=0;
/*!< Loop while DR register in not emplty */
while (SPI_I2S_GetFlagStatus(SPI3, SPI_I2S_FLAG_TXE) == RESET) //检查指定的SPI标志位设置与否:发送缓存空标志位
{
retry++;
if(retry>200)return 0;
}
/*!< Send byte through the SPI3 peripheral */
SPI_I2S_SendData(SPI3,TxData); //通过外设SPIx发送一个数据
retry=0;
/*!< Wait to receive a byte */
while (SPI_I2S_GetFlagStatus(SPI3, SPI_I2S_FLAG_RXNE) == RESET) //检查指定的SPI标志位设置与否:接受缓存非空标志位
{
retry++;
if(retry>200)return 0;
}
/*!< Return the byte read from the SPI bus */
return SPI_I2S_ReceiveData(SPI3); //返回通过SPIx最近接收的数据
}
为什么这里会这么诡异呢,同样的代码。
自己研究如下:
1.以为是优化导致的问题,设置优化为NONE问题依旧。
2.查看SD_SPI_ReadWriteByte汇编代码,发现在IAR 6.30 下就多一句:SECTION_TYPE SHT_PROGBITS, 0
3.对比SPI口配置寄存器,发现都是一样的。
4.自己这么都想不通,请高手指点。谢谢 |