通过SPI写入SDHC卡时数据未对齐

时间:2015-10-04 20:27:37

标签: microcontroller sd-card spi electronics

我正在使用微控制器(PIC18F26J50)与G.Skill 4GB microSD卡连接。

  • SD卡初始化成功,我从接收0x01(空闲)R1令牌转到0x00(就绪)R1令牌。
  • 读取数据块有效,我能够读取分区1的位置并读取该分区的第一个扇区

但是,在尝试编写块时,我从未看到响应令牌。将原始块倾倒在卡上。我看到数据确实写了,但它没有正确对齐......最好的解释方法是使用实​​际图片

This should be filled with 0x01, 0x02, 0x03, and so on up to 0xFF before repeating

这应填充0x01,0x02,0x03,依此类推至0xFF,然后重复

此卡在Windows中工作得非常好。我能够正确地读取和写入数据。

调查,我发现我得到的响应是0XCA,如果你右移你得到0xE5,一个正确的响应令牌。数据本身未对齐左侧。此外,似乎还写入了两个虚拟字节和令牌。纠正你得到的转变:

FF FF FE 00 01 02 03 04 05 06 07 08 09 0A 0B 0C

所以我删除了代码来写2个虚拟字节和0xFE令牌,而且s *#$卡片在命令后立即开始写入数据,我相信这违反了规范!任何人都可以确认这是否是SDHC卡的预期行为?或者这张卡只是运行一个真正的s *#$ ty SD控制器? (后者我怀疑是因为我有一张16GB的卡正常工作)

1 个答案:

答案 0 :(得分:0)

我遇到了完全相同的问题,结果证明这不是SD卡的问题,而是我的SPI接口问题。

我正在使用的特定芯片(飞思卡尔KL03)将保留当前接收到的字节,直到您读取它为止,即使在您开始发送下一个字节之后也是如此。我不同步,所以每次我写一个SPI字节,等待传输然后从缓冲区读取,我实际上得到的是先前的结果,而不是当前的结果。因此,每次SPI事务都会出现单字节延迟。

因此,我的范围显示我正在用卡片交换以下内容:

MOSI: 58 00 00 00 01 00 00 00 00 7E nn nn nn ...
MISO: FF FF FF FF FF FF FF 00 FF FF FF FF FF ...

导致您遇到的错位。应该是这样的:

MOSI: 58 00 00 00 01 00 00 00 7E nn nn nn nn ...
MISO: FF FF FF FF FF FF FF 00 FF FF FF FF FF ...

总之,请确保在写入命令的00响应之后立即发送7E