单片机为STM32F103RBT6,SD卡为金士顿8G。
在SD卡初始化通过后,在挂载SD卡时,遇到了问题,挂载部分代码如下:
// exfuns_init(); //为fatfs相关变量申请内存
while(FR_OK != f_mount(pfs[0],"0:",1)) //挂载SD卡
{
printf("SD Mount Failed ! \r\n");
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及以下,成功挂载并读取卡信息!
经验总结:工科男免不了与各种各样的BUG打交道,一定要认真阅读官方给出的错误说明,从错误产生的最可能原因一一排除,提高排错效率!!!