初级会员

- 积分
- 160
- 金钱
- 160
- 注册时间
- 2019-5-20
- 在线时间
- 50 小时
|
1金钱
如题:关于stm32 spi+dma+fat读取sd卡容量FATFS_GetFree("0:",&sd_total,&sd_free)出错,返回结果是0x0d,也就是没获取到系统文件
很奇怪没使用dma传输时,fat读取一切正常,可以获取sd卡容量,可以正常读卡文件,
[22:39:00.412]收←◆SD Card OK!
SDV2HC OK!
Fat初始化内存成功
SD卡 FAT ok!
SD Total Size: 3720MB
SD Free Size: 3660MB
加入dma以后就出现异常了。
[22:39:07.572]收←◆SD Card Deceting!
SD Card OK!
SDV2HC OK!
Fat初始化内存成功
SD卡容量检测中
SD卡 FAT 错误!
也无法获取容量大小。
加入的dma部分代码如下
//从sd卡读取一个数据包的内容
//buf:数据缓存区
//len:要读取的数据长度.
//返回值:0,成功;其他,失败;
u8 SD_RecvData(u8*buf,u16 len)
{
if(SD_GetResponse(0xFE))return 1;//等待SD卡发回数据起始令牌0xFE
//*********非DMA代码*************************************/
/* while(len--)//开始接收数据
{
*buf=SPI2_ReadWriteByte(0xFF);
buf++;
}*/
//*********非DMA代码*************************************/
//*********DMA代码*************************************/
DMA1_Star_SPI_RX(buf,len);
//*****************************************************/
//下面是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)//不是结束指令
{
//*********非DMA代码*************************************/
//for(t=0;t<512;t++)SPI2_ReadWriteByte(buf[t]);//提高速度,减少函数传参时间
//*********非DMA代码*************************************/
//*********DMA代码*************************************/
DMA1_Star_SPI_TX(buf);
//*****************************************************/
SD_SPI_ReadWriteByte(0xFF);//忽略crc
SD_SPI_ReadWriteByte(0xFF);
t=SD_SPI_ReadWriteByte(0xFF);//接收响应
if((t&0x1F)!=0x05)return 2;//响应错误
}
return 0;//写入成功
}
//读SD卡
//buf:数据缓存区
//sector:扇区
//cnt:扇区数
//返回值:0,ok;其他,失败.
u8 SD_ReadDisk(u8*buf,u32 sector,u8 cnt)
{
u8 r1;
long long lsector=sector;
if(SD_Type!=SD_TYPE_V2HC) lsector <<= 9;//转换为字节地址
if(cnt==1)
{
r1=SD_SendCmd(CMD17,(u32)lsector,0X01);//读命令
if(r1==0)//指令发送成功
{
r1=SD_RecvData(buf,512);//接收512个字节
}
}else
{
r1=SD_SendCmd(CMD18,lsector,0X01);//连续读命令
do
{
r1=SD_RecvData(buf,512);//接收512个字节
buf+=512;
}while(--cnt && r1==0);
SD_SendCmd(CMD12,0,0X01); //发送停止命令
}
SD_DisSelect();//取消片选
return r1;//
/************************************非dma
u8 r1;
if(SD_Type!=SD_TYPE_V2HC)sector <<= 9;//转换为字节地址
if(cnt==1)
{
r1=SD_SendCmd(CMD17,sector,0X01);//读命令
if(r1==0)//指令发送成功
{
r1=SD_RecvData(buf,512);//接收512个字节
}
}else
{
r1=SD_SendCmd(CMD18,sector,0X01);//连续读命令
do
{
r1=SD_RecvData(buf,512);//接收512个字节
buf+=512;
}while(--cnt && r1==0);
SD_SendCmd(CMD12,0,0X01); //发送停止命令
}
SD_DisSelect();//取消片选
return r1;//
************************************/
}
请各位老大指点一下迷津,小的不才新菜一名。。。。。。
|
|