2010-11-28 352 views
4

我有一块基于ST Microelectronics STM32F103VE微控制器的定制板,MiniSD卡插在微控制器的SDIO总线上。电气连接完全按照STM3210E-EVAL board schematics中的规定完成,检查并重新检查,所以我坚信他们是正确的。不幸的是,我没有那个评估板来测试我所遇到的是硬件问题,但看起来并不如此。对于以下测试,我使用随附的MicroSD转MiniSD适配器最近购买的金士顿2GB MicroSD卡(型号MBLYG2/2GB)(因此应符合最新的SD卡规格);还没有测试任何其他卡。由于SDIO总线初始化问题,因SDIO总线初始化问题CRC

我遵循SD卡物理层简化规范来了解发生了什么。我使用的代码是ST Micro为此微控制器提供的标准外设库的示例SDIO代码。它通过发送CMD0(GO_IDLE_STATE),然后发送CMD8(SEND_IF_COND),然后发送ACMD41(SD_SEND_OP_COND)开始,发送CMD55(APP_CMD),然后发送CMD41。时钟线的时钟频率为400 kHz,作为我的调试工作的一部分,我在CMD0和CMD8之间添加了大约100个时钟周期的延迟,因为我已经在某处读取了它的需求,至少在SPI模式。除了下面提到的修改外,代码与示例代码完全相同。

当我第一次尝试运行示例代码时,CMD55出现了一个问题,这是因为单片机缓冲了对CMD8的响应,但示例代码没有检索到CMD8的响应,所以在检查对CMD55的响应时该代码实际上是在查看对CMD8的回应,并因此而感到不安。我通过在发送CMD55之前清除微控制器的SDIO外设上的CMDREND标志来解决此问题,因此当代码检查对CMD55的响应时,不再有CMD8的响应缓冲。

下一个问题和我目前坚持的一个问题是,在对CMD55的响应中,设置了卡状态字段(COM_CRC_ERROR)的位23,这表示前一个命令的CRC检查失败到规范。虽然微控制器自动计算CRC,但我将逻辑分析仪连接到电路以验证它是否正确。我正在使用一个网络应用程序(对不起,因为我是一个新用户而无法链接,但只是Google为“CRC ghsi”而且它是第一个结果)使用多项式x^7 + x ^来验证CRC。 3 + 1根据规范。这是逻辑分析仪输出,格式化,并评论说我:

// uC sends CMD0, CRC OK, no response: 
01 000000 00000000000000000000000000000000 1001010 1 
// uC sends CMD8, CRC OK, check byte = 0xAA: 
01 001000 00000000000000000000000110101010 1000011 1 
// SD card responds to CMD8, CRC OK, check byte echoed back = 0xAA: 
00 001000 00000000000000000000000110101010 0001001 1 
// uC sends CMD55, CRC OK: 
01 110111 00000000000000000000000000000000 0110010 1 
// SD card responds to CMD55, CRC OK, note card status bits 23, 8 and 5 set; 
// bit 23 = COM_CRC_ERROR, bit 8 = READY_FOR_DATA and bit 5 = APP_CMD: 
00 110111 00000000100000000000000100100000 0000100 1 

还要注意的是,如果我试图CMD55后,立即交换以上,咬了第二次23是取消设置:

// uC sends CMD55, CRC OK: 
01 110111 00000000000000000000000000000000 0110010 1 
// SD card responds to CMD55, CRC OK, bits 8 and 5 still set but 23 not set: 
00 110111 00000000000000000000000100100000 1000001 1 

注意在发送CMD55之前,我尝试了两次发送CMD8,但它没有任何区别,第一个CMD55总是返回第23位。每次尝试时我都可以重现这一点,所以我不认为这是一个毛刺或噪音问题。考虑到CRC是由微控制器本身计算的,它们看起来像外部实体(逻辑分析仪)所看到的一样正确,并且已经在我上面提到的网站上得到验证,我不明白该卡的CRC校验是如何失败的。

这是不是预期?也许我应该在每个命令之间等待一定数量的时钟周期(我读过的地方应该是8个周期,我相信我尊重这一点)?如果第一个CMD55出现故障并且正在路上,我是否可以发送第二个CMD55?还是会有任何负面影响?即使解决了这个问题,我也很想知道为什么CRC校验失败了,因为我认为我没有做错任何事情。

回答

3

我发现了这个问题。在我必须修改代码以刷新CMD8响应的缓冲区之后,为了让CMD55读取正确的响应,我做的每个测试都将逻辑分析仪连接到电路。删除逻辑分析仪后,代码开始工作 - 可能是将噪音注入线路。没有延迟是必需的,但为了遵循规范,我在CMD0之前添加了74+个时钟周期延迟。

0

检查STM message boards

AFAIK,这些错误已经在Peripheral Libraries的最新版本(3.4.0)中修复。

+0

我还没有尝试过版本3.4.0,因为我的开发环境没有该版本的准备好运行的项目,但既然你提到它可能是固定的,我会为它创建一个项目。但我应该补充一点,我已经查看了代码的相关部分,但没有注意到可能与我的问题相关的任何更改。 – swineone 2010-11-28 18:26:11