This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

[参考译文] SDSPI 驱动程序和 SWISSBIT SD 卡问题

Guru**** 2538955 points


请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/699823/sdspi-driver-and-swissbit-sd-card-issue

器件型号:F28M35H52C

工具/软件:TI-RTOS

您好!

我们已经使用了 TI SDSPI 驱动器、在 Concerto (M3侧)上使用了 FatFS、并使用了商用 SD 卡、效果很好。

现在、我们要使用工业级 SD 卡、更具体地说、SWISSBIT S-450u 8Go (部件号 SFSD8192N1BM1MT-I)。 现在、卡上出现了大量 IO 错误、并且文件未正确写入和读取。 小文件(~40KB)通常可以毫无问题地写入(10倍中的9倍)、但对于较大的文件、在传输过程中的某个阶段、它不再工作。 有时会出现"SDSPI:(%p) send_cmd:SD 卡等待时间已过期"错误。 其他时候、没有错误消息、但是对于写入的字节数、FatFS f_write 函数返回0。

我们听说、SWISSBIT 卡可能使用具有不同时序的非标准协议。 我们尝试增加 SDSPI 驱动器中的所有延迟、但没有成功。

是否有人在使用这些 SD 卡时遇到过此类问题? 有什么关于如何调整驱动器的想法?

感谢您的帮助、

RIL

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    RIL、

    我认为 C2000组中的任何人都没有对该特定器件型号有任何经验。 我必须申请 Swissbit 帐户才能访问 DS、以查看我们的设备之间是否存在任何计时不兼容问题。 我正在等待启用该帐户、以便可以下载数据表... 最多可能需要24小时。  

    一般来说、这种类型的故障在我看来与硬件时序有关。 SD 卡预期的 SPI 时钟频率是多少? 降低时钟速率是否有帮助? Swissbit SD 卡的时钟极性和相位要求是什么? 命令之间的延迟。 不同的 SPI 从器件可能需要不同的命令时序、例如为了锁存或检索数据、必须在'y'命令之后将芯片选择切换为高电平并保持'x us'。 或者、某些器件可能要求芯片选择在整个命令期间保持有效。  

    从情况说明书中可以看出、SD 卡应该与现有的 SD 卡标准兼容、因此我不一定认为命令结构中存在任何差异。 只是需要注意的一点。

    Swissbit 帐户激活后、我将回复我对 DS 的分析。 这种情况不会发生在星期一最早的时候。

    同时、您是否可以尝试改变时钟速率、确认时钟极性和相位要求、并尝试 SD 卡的基本命令、同时观察示波器上的行为以确保它们按预期工作?

    谢谢、

    标记

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    Mark、您好!

    感谢您的回答。

    我还在等待我的 Swissbit 帐户验证、以便我可以下载 DS。 这需要相当多的时间!

    我不知道 SD 卡需要什么样的 SPI 帧、但我可以向您展示一些示波器捕获。 在所有采集中、我们都有:

    D0:CS

    - D1:CLK (400kHz 时钟,不会将时钟重新配置为12.5MHz 的部分

    -D2:MOSI

    D3:MISO

    发送 CMD0 (0x40:GO_IDLE_STATE):

    -代码:send_cmd (hwAttrs、CMD0、0)

    这会持续几毫秒、直到我们得到:

    SDSPI:(4000b000) SEND_cmd:SD 卡等待时间已过期

    SDSPI:(4000b000)磁盘初始化失败

    SDSPI:(4000b000) SEND_cmd:SD 卡等待时间已过期

    因此、看起来从不发送 acual CMD0、因为它未通过 SDSPI 驱动程序中的'WAIT_READY'步骤。

    如果我通过注释 return 语句来绕过 WAIT_READY 步骤、我们得到:

    我不确定2个光标之间的小毛刺脉冲来自哪里。 我的示波器只有50MHz 的带宽、这些脉冲宽度为~4ns。但如果我重复该步骤、我将得到完全相同的迹线...

    发送 CMD8 (0x48:SEND_IF_COND):

    -代码:send_cmd (hwAttrs、CMD8、0x1AA)后跟4* rxSPI (hwAttrs)

     

    发送 CMD55 (0x77:APP_CMD):

    -代码:send_cmd (hwAttrs、CMD55、0)

    发送 CMD41 (0x69:SEND_OP_COND (ACMD)):

    -代码:send_cmd (hwAttrs、CMD41、0x40000000)

    当我撰写第一篇文章时、有时文件传输会起作用、但今天、即使我尝试使用相同的代码和卡、文件传输也完全不起作用。 我不明白发生了什么变化。

    希望您能在我等待 Swissbit 支持时给我一些指导。

    谢谢。

    RIL

    编辑:

    嗯、我刚刚意识到、现在我可以再次传输一些小文件。 我确实会遇到无法预测的行为:

    有时 WAIT_READY()函数会被阻止,而在其他时间,它会正常运行。 这似乎是随机的。

    当它运行正常时、我可以传输一些数据。 我使用 fatfs API 将文件作为4096字节的块传输、在块传输(或调用 f_write/f_read)之间有1ms 的延迟。 对于前几个块(有时是前100个块、有时是前50个块...)、情况良好 然后、f_write 返回0作为传输的字节数。 此时、我不再看到任何 SPI 流量。

    如果我将调用之间的延迟更改为 f_write/f_read 至10ms、则一切都将完美。

    下面是两个显示写入和读取帧的捕获。 数据是0、1、2、3、4、5…… 在 SPI 帧上、极性和相位方面一切看起来都很好。 BTW、当没有 WAIT_READY 错误时、时钟被重新配置为12.5MHz。

    我还尝试将时钟保持在400kHz、而不是将其重新配置为12.5MHz、但我观察到同样的行为。

    感谢您的支持。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    RIL、

    对我来说、您的软件似乎很好。 SD 卡需要的批量传输之间的最小延迟是多少? 如果在连续命令之间提供额外的延迟有效、那么这可能是一个时序问题。

    这些4ns 脉冲是相关的、如果数据线路上有脉冲、则可能会损坏需要传递的数据。 我建议您举手使用更高的 BW 范围、以便更清楚地查看交易。

    是否在命令之间切换芯片选择? 如果您在操作期间根本不切换芯片选择、则有可能噪声会为 SPI 从器件提供额外的时钟边沿、并且在下一次切换之前整个通道会变得不同步。 SD 卡可能不同步、然后您没有提供从这种情况中恢复的方法。

    SD 卡写入时、系统中是否有其他任何内容正在运行? 如果是、您是否移除了其他操作以隔离可能导致故障的任何问题?

    在故障发生的确切时间获取交易的捕获是值得的。 是否有任何问题看起来不合适? (可能在其中一个 SPI 通道上看到的最后一个边沿触发、正如您所说的、SPI 在故障后停止运行)

    -Mark
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    Mark、您好、感谢您的回答。

    [引用 user="Mark Labbato"]RIL、

    对我来说、您的软件似乎很好。 SD 卡需要的批量传输之间的最小延迟是多少? 如果在连续命令之间提供额外的延迟有效、那么这可能是一个时序问题。

    [/报价]

    我在 DS 中没有找到有关这方面的任何信息、但我会问 Swissbit。

    [引用用户="Mark Labbato"]

    这些4ns 脉冲是相关的、如果数据线路上有脉冲、则可能会损坏需要传递的数据。 我建议您举手使用更高的 BW 范围、以便更清楚地查看交易。

    [/报价]

    我确实使用了更好的 BW 示波器、实际上、它没有干扰。 这是命令的 CRC、是正确的。

    [引用用户="Mark Labbato"]
    是否在命令之间切换芯片选择? 如果您在操作期间根本不切换芯片选择、则有可能噪声会为 SPI 从器件提供额外的时钟边沿、并且在下一次切换之前整个通道会变得不同步。 SD 卡可能不同步、然后您没有提供从这种情况中恢复的方法。

    [/报价]

    我曾尝试在块(扇区)写入之间切换 CS 引脚。 结果相同。 它在使用商用 SD 卡(SanDisk)时工作正常、因此我不会因为这个问题而出现。

    [引用用户="Mark Labbato"]

    SD 卡写入时、系统中是否有其他任何内容正在运行? 如果是、您是否移除了其他操作以隔离可能导致故障的任何问题?

    [/报价]

    只有一个小型 Modbus 服务器、我用来与电路板通信并开始一些操作。 同样、使用常规 SD 卡时工作效果完美。

    [引用用户="Mark Labbato"]

    在故障发生的确切时间获取交易的捕获是值得的。 是否有任何问题看起来不合适? (可能在其中一个 SPI 通道上看到的最后一个边沿触发、正如您所说的、SPI 在故障后停止运行)

    [/报价]

    我尝试捕获 SPI 事务的结束。 我认为下面的捕获显示了当它开始失败时会发生的情况:

    主机会不断地发送两条相同的命令、直到它超时。

    我们在 MOSI 和 MISO 上添加了10k 上拉电阻。 从那时起、我们不再遇到初始化问题。

    剩余的问题是传输在几个块后停止。 在块写入/读取之间添加延迟有助于实现。

    我还与 Swissbit 的一名工程师联系、希望能获得更多信息。

    感谢你的帮助。

    RIL

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    由于这可以与另一个 SD 卡配合使用、并且增加延迟会有所帮助、因此听起来它确实与该 SD 卡有一定的关系。 我很想听听你对 Swissbit 的调试结果。 请在解决问题后将其发布回此处。

    -Mark