最近,我购买了一块STM32F746的Nucleo-144开发板。对于我正在从事的项目,我需要获得一致的 >3 MB/s 的 SD 卡写入速度。使用 STM32CubeIDE,我已经能够在轮询和 DMA 模式下全速将 SD 1 位模式与 FatFS 配合使用。然而,切换到 SD 4 位模式后,我在读取时开始收到大量与错误数据 CRC 相关的 IO 错误。
在 SD 4 位轮询模式下,我什至无法读取单个块来正确处理。调用
f_mount
返回 IO 错误,进一步调试发现,第一次调用 HAL_SD_ReadBlocks
(读取扇区 0)失败,错误代码为 SDMMC_ERROR_DATA_CRC_FAIL
:
检查从卡读取的 512 字节数据缓冲区显示数据至少部分完整,其中包含您希望在第一个扇区中看到的一些字符串:
重要的是,在每次运行软件之间,该缓冲区都会以完全相同的方式被损坏。如果是某种电气干扰问题,我希望看到不同的字节被损坏,但我没有。运行之间的缓冲区是相同的。切换回 1 位模式并检查数据缓冲区,它的形状显然要好得多。 4 位缓冲区显然有很多损坏的位和完全丢失的位,抵消了一切。 4 位模式读取的大部分是垃圾,但始终是相同的垃圾。
SDMMC_ERROR_DATA_CRC_FAIL
错误。数据缓冲区看起来更完整,但它显然仍然是垃圾数据。不确定这有多相关,但我想我应该把它包括在内以完成目的。这就是我在原型设计时连接 SD 卡的方式。所有电缆的长度都相同,但即使在如此短的距离内,它们是否也会相互干扰?我还使用 Adafruit SD 卡分线适配器进行测试。
SD卡 | GPIO 引脚 |
---|---|
时钟 | PC12 |
D0 | PC8 |
CMD | PD2 |
D3 | PC11 |
D1 | PC9 |
D2 | PC10 |
对于某些卡,即使在较低的时钟速度下,IO 错误也仅在 SD 4 位模式下非常常见。在更高的时钟速度下,我能够测试的所有卡在 4 位模式下都会出现 IO 错误。然而,在 SD 1 位模式下,即使在最大时钟速度下,我也能很好地读写。
我想利用 4 位模式来获得更快的速度。我究竟做错了什么?是电气方面的问题吗,例如需要更强的上拉电阻或更短的电线?谢谢,我真的很感激!
我在 H743ZI Nucleo 上也遇到了类似的问题。我的代码在另外两个带有板载 SD 卡读卡器的 H743 板上运行良好,但在带有 Adafruit 突破的 Nucleo 上失败。我相信这只是由于信号完整性..
我看到您尝试降低时钟分频器,但是您尝试过较慢的 SDMMC 时钟吗?这就是对我来说与众不同的原因。在 48MHz 时失败,但在 24MHz 及更低且 0 分频器时正常。