MMC/SDのSPIモードでのbusy信号
以前『SDカードとの闘い』という記事でオシロでSDの様子を見てみたい、ということを書きましたが、実際に計測してみました。前の記事では、データ落ちが発生するのはSDの書込み性能の違いからくるものであり、公称性能が違うSDカードを、書込み時のビジー(busy)が出力される長さをオシロで計測することで評価してみようという趣旨だったと思います。ところが、ELMの『MMCカードの使い方』をよく読んでみると、このようなことが書いてありました。
原則として、ひとつのトランザクションの間はCSをアサートに保たなければなりませんが、カードがビジー状態の間は、CSをデアサートしてSPIバスを解放することができます。次にCSをアサートしたときまだビジー状態ならカードは再びDOをLowに駆動します。そこで、ビジーチェックを先チェック(コマンドおよびデータブロック送信の直前にビジーチェックを入れる)にすると、転送直後にMCUを解放でき、時間を有効に使えます。
今まで実はbusyの間はポーリング、つまりbusyの出力が停止するまでずっとCPUをSDの監視に割り当てていたのですが、ここに書いてあるようにbusyの評価を先送りにできるのなら、その開いた時間でデータを取りこぼしなく確実に取得できることになります。そこで、そのビジーの遅延評価をオシロを利用して詳しく分析してみることにしました。
長いので詳細は続きにてどうぞ。
busyの遅延評価を行った場合の全体図を示します。
busyが出力されてCSをデアサートする部分。SDのDOUTを確実に解放するためにはCSデアサート後、CLKを適度に送る必要があります(ここでは8clk)。
busyの遅延評価(CSを再アサートし、DOUTの出力を見る)を行っている部分。busyの場合はCSアサート後、1clk後にDOUTがbusyを出力します。
ついでにbusy遅延評価を行いながら、1セクタ(512byte)の連続書込みをした場合の信号の変化を捉えてみました。カードはTECIC MicroSD 512MBですが、これによるとbusy出力は約0.99msecであり書込み1サイクルあたり1.68msecでした。よって、これから推算される書込み能力は(1000 / 1.68 * 512) = 305 KByte/secで、僕の用途では十分に高速です。なお、SPIのクロックは24MHzです。
文献にもあたったところ、SandiskのSDのマニュアルを読むと、このbusyの遅延評価について100ページの5.4.3 Data Writeに明確に書いてありました。このマニュアルですが、どうやら本家からはデットリンクになっているようなのでコピーを落とせるようにしておきます、問題がある場合は直ちに削除します。
コメント
コメントする
- 匿名でのコメントは受け付けておりません。
- お名前(ハンドル名可)とメールアドレスは必ず入力してください。
- メールアドレスを表示されたくないときはURLも必ず記入してください。
- コメント欄でHTMLタグは使用できません。
- コメント本文に日本語(全角文字)がある程度多く含まれている必要があります。
- コメント欄内のURLと思われる文字列は自動的にリンクに変換されます。
- 投稿ボタンを押してエラーがでなければ、投稿は成功しています。反映されるまでには少し時間がかかります。