打印

SPI读写SD卡问题,发送CMD24指令后出错.

[复制链接]
6461|3
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
yanjinbin|  楼主 | 2012-7-5 21:20 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 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.自己这么都想不通,请高手指点。谢谢
沙发
yanjinbin|  楼主 | 2012-7-9 08:49 | 只看该作者
谁有思路啊。

使用特权

评论回复
板凳
yanjinbin|  楼主 | 2012-7-10 17:11 | 只看该作者
太难过了,无解了吗。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

2

主题

50

帖子

0

粉丝