2010-11-28 55 views
4

私は、STマイクロエレクトロニクスのSTM32F103VEマイクロコントローラをベースにしたカスタムボードを持ち、MiniSDカードはマイクロコントローラのSDIOバスに接続しています。電気接続は、STM3210E-EVAL board schematicsに記載されているとおりに正確に行われ、チェックされ、再確認されたので、私は彼らが正しいと確信しています。残念ながら、私は経験していることがハードウェアの問題であるかどうかをテストする評価ボードを持っていませんが、そうは思われません。以下のテストでは、ごく最近購入したKingston 2GB MicroSDカード(モデルMBLYG2/2GB)を使用しています(最新のSDカード仕様に準拠する必要があります)。まだ他のカードでテストしていません。SDカード上でのSDIOバスの初期化問題CRCの不具合のため

私は、SDカードの物理層の簡略化された仕様に従い、何が起こっているのかを理解しています。私が使用しているコードは、このマイクロコントローラ用のST Microの標準周辺ライブラリに付属のサンプルSDIOコードです。それは、CMD0(GO_IDLE_STATE)、CMD8(SEND_IF_COND)、次にACMD41(SD_SEND_OP_COND)を送信することから始まります。これは、CMD55(APP_CMD)に続いてCMD41を送信することによって行われます。クロックラインは400kHzでクロックされており、私のデバッグ作業の一環として、CMD0とCMD8の間に約100クロックサイクルの遅延が追加されています。少なくとも、SPIモード。以下に述べる変更以外のコードは、コード例とまったく同じです。

サンプルコードを最初に実行しようとしたとき、マイクロコントローラがCMD8への応答をバッファリングしていたためにCMD55に問題が発生しましたが、サンプルコードはCMD8の応答を取得しませんでした。 、コードは実際にCMD8への応答を見ていて、それによって動揺しました。この問題は、CMD55を送信する前にマイクロコントローラのSDIOペリフェラルのCMDRENDフラグをクリアすることで解決しました。そのため、コードがCMD55への応答をチェックすると、CMD8の応答はバッファされなくなりました。

次の問題と私が現在立ち往生しているのは、CMD55に対する応答で、カードステータスフィールド(COM_CRC_ERROR)のビット23が設定されています。これは、以前のコマンドのCRCチェックが失敗したことを示します仕様へ。マイクロコントローラは自動的にCRCを計算しますが、ロジックアナライザを回路に接続して、正しいことを確認しました。私は多項式x^7 + x ^を使ってCRCを検証するために、Webアプリケーションを使用しています(申し訳ありませんが、私は新しいユーザーだからリンクできませんが、 "CRC ghsi" 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ビットの第2の時間が設定されていないことに注意してください。

// 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を2回送信しようとしましたが、違いはありません。最初のCMD55は常にビット23を返します。試してみるたびにこれを再現することができるので、グリッチやノイズの問題ではないと私は信じています。 CRCはマイクロコントローラ自体によって計算されるので、外部エンティティ(ロジックアナライザ)が見たように正しく見え、上記のウェブサイトで検証されているので、カードのCRCチェックが失敗する可能性はありません。

これはどういうことですか?多分、私は各コ​​マンドの間に設定された数のクロックサイクルを待つべきです(私は8サイクルでなければならないと思っていますが、それを尊重していると思います)。最初のCMD55が失敗して途中であった場合、または何らかの否定的な結果が出るのであれば、もう1つCMD55を送信することはできますか?それが問題を解決しても、私は何か間違っているとは思わないので、CRCチェックが失敗している理由を知りたいと思っています。

答えて

3

問題が見つかりました。 CMD55が正しい応答を読み込むように、CMD8応答のバッファをフラッシュするようにコードを修正しなければならなかったので、私が行ったすべてのテストでロジックアナライザが回路に接続されました。ロジックアナライザを取り外した後、コードが動作し始めました。おそらく、ラインにノイズが注入されていました。遅延は必要ありませんでしたが、仕様に従うだけで、CMD0の前に74クロックサイクルの遅延を追加しました。

0

STM message boardsを確認してください。

AFAIKは、周辺ライブラリの最新バージョン(3.4.0)で修正されています。

+0

私の開発環境には、そのバージョンのすぐに実行できるプロジェクトがないので、まだバージョン3.4.0を試していませんが、修正される可能性があるので、プロジェクトを作成します。しかし、私は既にコードの関連部分を見て、自分の問題に関連する変更を気付かなかったことを付け加えておきます。 – swineone

関連する問題