代码之家  ›  专栏  ›  技术社区  ›  Ron

使用SPI接口初始化microSD卡

  •  16
  • Ron  · 技术社区  · 16 年前

    我用的是一个 microSD 嵌入式设计中的卡。该卡通过SPI接口连接到微控制器。它适用于我以前使用过的所有卡,但现在我的新卡无法初始化。该卡为超越2GB microSD卡(TS2GUSD)。

    1. CMD0(参数0,CRC 0x95)->;响应0x01->好啊

    2. CMD8(参数0x000001AA,CRC 0x87)>响应0x01 0x000001AA->表示它是SDC V2+卡,支持2.7V-3.6V的电压范围->好啊

    然后我应该发送ACMD41命令,但是当发送必须在CMD41之前的CMD55(参数0,CRC 0)时,我得到响应0x05->非法命令。 我也尝试发送CMD1(用于MMC卡),但它给出了类似的结果

    如何解决此问题?

    5 回复  |  直到 13 年前
        1
  •  17
  •   Peter Mortensen Pieter Jan Bonestroo    13 年前

    我似乎发现了这个问题。当我为CMD55计算正确的CRC并发送该CRC而不是伪CRC时,该命令被接受(结果0x01)。如果你看 the physical layer specification 第7.2.2节明确规定:

    这一系列超越卡似乎并非如此,因此违反了规范。此外,在CRC错误的情况下,回复应为0x09而不是0x05。我曾尝试使用CMD59显式关闭CRC检查,但似乎没有帮助。

    =>为(all?)命令计算正确的CRC使卡工作。

    请注意,我以前使用过其他2GB超越卡,但它们是在台湾制造的,而新的是在韩国制造的(似乎是三星卡(MMAGR02GUDCA))。

        2
  •  2
  •   Luke Peterson    14 年前

    我几乎有同样的问题。发送ACMD41时,我发送了CMD55,后面跟着CMD41。CMD55的响应为0x01,指示空闲状态并运行初始化过程(我认为这是正常的)。CMD41将以0x05响应,表示命令非法。事实证明,我的特定卡在默认情况下执行CRC检查,即使是在SPI模式下,也会将CRC错误误报为非法命令(即,它不符合SD规范)。当我计算正确的CRC时,它工作得很好。以下是我使用的CRC7计算代码,它对我来说运行良好:

    https://github.com/hazelnusse/crc7

        3
  •  2
  •   Aleksi Torhamo    12 年前

    你说你用过 CRC 0 对于失败的命令。我想你的意思是你把最后一个字节都作为 0x00 . 请注意,CRC7只是最后一个字节的前7位,即调用的最后一位 end bit 应该永远是 1 . 所以如果你是在发送 0 作为最后一位,失败是可以理解的,甚至错误代码也是有意义的。如果你发送 作为最后一点,它应该会起作用 0x01 0xFF

        4
  •  1
  •   jpinto3912    16 年前

    CMD58还可以帮助您检查是否提供了正确的电压水平(有时插座存在接触问题)。

        5
  •  1
  •   ACG    11 年前

    仅使用芯片选择(0)发送CMD0不会在SPI模式下初始化卡。这仅设置SPI模式。 在ACMD41返回“已接受”之前,卡不会初始化。默认情况下,CRC处于关闭状态。

        6
  •  0
  •   akwky    6 年前

    在CMD55(0xFF发送+接收)之后和CMD41之前插入几个虚拟SPI周期。

    注意:我意识到我参加聚会已经很晚了,但我希望这会对将来的人有所帮助。