2010-11-28 355 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