初级会员

- 积分
- 108
- 金钱
- 108
- 注册时间
- 2015-8-20
- 在线时间
- 19 小时
|
最近移植原子哥mini板SD卡驱动,移植完成后,初始化都正常,读CSD和扇区时候,返回成功,但是读取到的数据全是0xFF,找了半天眼睛都花了,终于找到原因了。
mini板使用的是SPI1,而我的板子使用的是SPI3,在MMC_SD.C中做的如下改动。前几个函数封装为SPI3的接口函数。
u8 SD_SPI_ReadWriteByte(u8 data)
{
return SPI3_TxRx(data);
}
//SD卡初始化的时候,需要低速
void SD_SPI_SpeedLow(void)
{
SPI3_SetSpeed(SPI_BaudRatePrescaler_256);//设置到低速模式
}
//SD卡正常工作的时候,可以高速了
void SD_SPI_SpeedHigh(void)
{
SPI3_SetSpeed(SPI_BaudRatePrescaler_4);//设置到高速模式
}
//SPI硬件层初始化
void SD_SPI_Init(void)
{
SPI3_Init();
SD_CS_H;
}
如此修改之后,就出现初始化正常,读到扇区内容和CSD等数据返回成功,但是数据都是0xFF,检查读写函数发现接收函数和读扇区函数有如下问题:函数中标红色的地方是直接调用的SPI1读写,而不是上面封装的SD_SPI_ReadWriteByte函数,此处修改之后,读写正常。
//从sd卡读取一个数据包的内容
//buf:数据缓存区
//len:要读取的数据长度.
//返回值:0,成功;其他,失败;
u8 SD_RecvData(u8*buf,u16 len)
{
if(SD_GetResponse(0xFE))return 1;//等待SD卡发回数据起始令牌0xFE
while(len--)//开始接收数据
{
*buf=SPI1_ReadWriteByte(0xFF);
buf++;
}
//下面是2个伪CRC(dummy CRC)
SD_SPI_ReadWriteByte(0xFF);
SD_SPI_ReadWriteByte(0xFF);
return 0;//读取成功
}
//向sd卡写入一个数据包的内容 512字节
//buf:数据缓存区
//cmd:指令
//返回值:0,成功;其他,失败;
u8 SD_SendBlock(u8*buf,u8 cmd)
{
u16 t;
if(SD_WaitReady())return 1;//等待准备失效
SD_SPI_ReadWriteByte(cmd);
if(cmd!=0XFD)//不是结束指令
{
for(t=0;t<512;t++)SPI1_ReadWriteByte(buf[t]);//提高速度,减少函数传参时间
SD_SPI_ReadWriteByte(0xFF);//忽略crc
SD_SPI_ReadWriteByte(0xFF);
t=SD_SPI_ReadWriteByte(0xFF);//接收响应
if((t&0x1F)!=0x05)return 2;//响应错误
}
return 0;//写入成功
}
|
|