STM32F746 - SD 卡 CRC 在 4 位模式下失败,但在 1 位模式下工作正常

问题描述 投票:0回答:2

最近,我购买了一块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 位模式读取的大部分是垃圾,但始终是相同的垃圾。

我尝试过的事情

  1. 轮询和 DMA 模式。
    • 两者都以类似的方式失败,尽管调试 DMA 更困难。
  2. 将 SDMMCCLK 时钟分频器一直降低到 255,这是它将达到的最高分频器(和最低时钟速度)。
    • 在我的较旧、更便宜的 Lexar SD 卡上,在此模式下读/写可以完美地工作(尽管非常慢)。
    • 在我的较新、更昂贵的三星 SD 卡上,读/写仍然失败,并出现
      SDMMC_ERROR_DATA_CRC_FAIL
      错误。数据缓冲区看起来更完整,但它显然仍然是垃圾数据。
  3. 带 GPIO 上拉电阻的传输应用于所有 SD 引脚(时钟除外)以及不带上拉电阻的传输。
    • 没有变化,至少据我所知。
  4. 使用多个不同的SD卡。
    • 具体来说,Lexar“300x”32 GB 卡和 Samsung“EVO Plus”128 GB 卡。
    • 如前所述,降低时钟速度可以让我的两张卡中的一张正常工作。
    • 但是,即使以最低速度,我的更高质量的卡在第一次读取时仍然失败。

接线

不确定这有多相关,但我想我应该把它包括在内以完成目的。这就是我在原型设计时连接 SD 卡的方式。所有电缆的长度都相同,但即使在如此短的距离内,它们是否也会相互干扰?我还使用 Adafruit SD 卡分线适配器进行测试。

SD卡 GPIO 引脚
时钟 PC12
D0 PC8
CMD PD2
D3 PC11
D1 PC9
D2 PC10

总结

对于某些卡,即使在较低的时钟速度下,IO 错误也仅在 SD 4 位模式下非常常见。在更高的时钟速度下,我能够测试的所有卡在 4 位模式下都会出现 IO 错误。然而,在 SD 1 位模式下,即使在最大时钟速度下,我也能很好地读写。

我想利用 4 位模式来获得更快的速度。我究竟做错了什么?是电气方面的问题吗,例如需要更强的上拉电阻或更短的电线?谢谢,我真的很感激!

embedded storage stm32 hardware
2个回答
0
投票

我在 H743ZI Nucleo 上也遇到了类似的问题。我的代码在另外两个带有板载 SD 卡读卡器的 H743 板上运行良好,但在带有 Adafruit 突破的 Nucleo 上失败。我相信这只是由于信号完整性..

我看到您尝试降低时钟分频器,但是您尝试过较慢的 SDMMC 时钟吗?这就是对我来说与众不同的原因。在 48MHz 时失败,但在 24MHz 及更低且 0 分频器时正常。


© www.soinside.com 2019 - 2024. All rights reserved.