单片机为STM32F103RBT6,SD卡为金士顿8G。
在SD卡初始化通过后,在挂载SD卡时,遇到了问题,挂载部分代码如下:
// exfuns_init(); //为fatfs相关变量申请内存
while(FR_OK != f_mount(pfs[0],"0:",1)) //挂载SD卡
{
printf("SD Mount Failed !
");
LED1=!LED1;//DS1慢闪烁
delay_ms(800);
}
如上所示,挂载函数总是返回 FR_DISK_ERR,错误信息为底层IO的硬件错误,具体一点,是在find_volume()函数的读取0扇区(检查 FAT boot sector)处返回了3号错误:
既然是硬件IO错误,那么就应该首先想到的是SD卡模块或者单片机的SPI模块的问题,经过尝试后的解决方法为,
降低SPI通信速度!!!!!!之前初始化完成后,将SPI速度提升到了36M,设置如下:
//SD卡正常工作的时候,可以高速了
void SD_SPI_SpeedHigh(void)
{
SPI_SetSpeed(SPI_BaudRatePrescaler_2,SD_SPI);//设置到高速模式
}
从而导致了在传输数据过程中发生了硬件错误,将速度降为18M及以下,成功挂载并读取卡信息!
挂载失败排查方法:
检查SD卡是否插好。
检查SD卡是否已经挂载。如果已经挂载,先卸载再重新挂载。
尝试手动挂载SD卡。使用以下命令:
sudo mount /dev/sdb1 /mnt/sdcard
其中,/dev/sdb1应根据系统实际情况修改,/mnt/sdcard为挂载点目录。
disk_initialize()函数失败移植不成功。
检查文件系统格式是否正确。SD卡可支持的格式包括FAT、FAT32和exFAT。使用以下命令检查SD卡格式:
sudo fdisk -l
如果SD卡格式不正确,需要重新格式化SD卡。使用以下命令格式化SD卡:
sudo mkfs.vfat -F 32 /dev/sdb1
其中,/dev/sdb1应根据系统实际情况修改。
检查外部保护器件用法,是否用错导致检测引脚电平出错。
如果以上方法都无法解决问题,尝试更换SD卡或更换读卡器。
下一篇:SDNAND存进的数据导出方法