こんなことで困っていませんか?
SDカードI/Fで書込みリトライができない!!

こんなことで困っていませんか?<br>SDカードI/Fで書込みリトライができない!!

この記事で紹介している製品

こんなことで困っていませんか?

SDカードI/Fで書込みリトライができない!!

SDカードにデータを書き込んでいる際に通信エラー(CRCエラー)が発生。
通信の世界ではよくある出来事かと思います。
このような場合、エラー処理として同じコマンドの再送(書込みリトライ)を行う事で、エラーを回避することが一般的かと思います。

よし、SDカードもコマンドを再送すれば・・・
 あれ?コマンド送信エラーになる。
もう1度・・・
 やっぱり、コマンド送信エラーになる・・・

SDカードI/Fは一度CRCエラーが発生したら、リセットするしか復旧させる術は無いのでしょうか?
そんなことはございません、SDカードI/Fだってちゃんと書込みリトライは可能です。
書込みリトライの方法が間違っているため、コマンド送信エラーになっているだけです。
今回は、SDカードI/Fのリトライ方法について少し触れてみようと思います。


おさらい

SDカードI/Fの通信プロトコルについて

SDカードI/Fの通信プロトコルは、ホスト機器(パソコン等)からSDカードにコマンドを送信し、SDカードからレスポンスを返す、いわゆるコマンド/レスポンス方式で通信を行います。

また、SDカードの動作はステートマシン*により制御させてます。
SDカードが現在どのステート状態にあるのかにより、ホスト機器から受け取れるコマンドに制限がかかります。

SDカードの動作ステートについて

SDA(SD Association)発行の規格書にはSDカードのStateは下記のように定義されています。

TransferState  :書込みコマンドや、読出しコマンドを待ち受けるStateです。
Receve-dataState  :書込みデータ送信Stateです。受け取りコマンドに大きく制限を受けます。
ProgramingState:データ書込みStateです。受け取りコマンドに大きく制限を受けます。


SDカードにデータの書込む際の流れ

SDカードにデータを書込む際の流れ

SDカードにデータを書き込む際の流れを見て見ましょう。
 ( 今回は説明の為に簡略化してます、実際のコマンド書式、引数などは規格書をご参照ください )
例として、連続ブロック書込みコマンドで8ブロック(セクタ)のデータ書込みを想定します。

① Host機器より書き込みコマンド CMD25を発行

② Hostより書き込みデータを送信

③ 送信終了コマンド CMD12 発行

④ プログラム Busy待ち

⑤ 次のコマンド待ち受け


書込みリトライの間違い

書込みリトライができない!!

ようやく本題の書込みリトライについてです。冒頭に述べたリトライが失敗する例について記載します。

NG① Host機器より書き込みコマンド CMD25を発行

NG② Hostより書き込みデータを送信中にCRCエラー発生

NG③ Host機器より書込みコマンドを再送

書込みコマンド CMD25は、SDカードのステートがTransferStateのときしかSDカードはコマンドを受け取ることができません。CRCエラー発生時SDカードのステートは、Receive-dataStateとなっており、
この状態では、いくらHOST機器から書込みコマンド CMD25を再送しても、SDカードはコマンドを受け取ることができません。冒頭の例に記載した、書込みリトライを実施してもコマンドエラーとなってしまうケースは、このような状態に陥っている可能性が高いです。

では、どのようにすれば正しく書込みリトライを実施できるのでしょうか?


書込みリトライ方法

書込みリトライの例

正しく書込みリトライを実施できる一例を記載します。

OK① Host機器より書き込みコマンド CMD25を発行

OK② Hostより書き込みデータを送信中にCRCエラー発生

ここまではNG例と一緒

OK③ 送信終了コマンド CMD12 発行

OK④ State遷移待ち

OK⑤ 書込みコマンドのリトライ (以降は通常書込みの流れです)


最後に

如何でしたでしょうか?
今回は、お客様よりよく問い合わせを受ける事例について記載してみました。

まとめ
・SDカードの動作はステートマシンにより制御されている。
・現在のステートにより、受け取れるコマンドが異なる。 (詳細は規格書をご参照ください)
・書込みリトライを行う際は、書き込みコマンドが受け取れる状態に遷移させる必要がある。
・読出しリトライも同様の考え方。

(少し乱暴な)まとめ
・データ転送中にエラーが発生したら、CMD12でデータ転送のステートから抜けましょう
・読書きの際はステータス確認コマンド CMD13で Transfer Stateであることを確認しましょう

おまけ

ステートマシンとは?
ステートマシンとは、変化に必要な条件を満たすとある状態から別の状態に遷移する
イベント駆動型のシステムを表現したものです。
 余計にややこしくなりましたよね。。。

ステートマシンの説明として、よく例に使われるのがジュースの自動販売機です。
自動販売機は、硬貨を入れられるまでずーっと待っています。(State:待ち)
硬貨が投入されると、購入ボタンを点灯して、ジュースが選ばれるのを待ちます。(State:選択)
ジュースが選択されると、お釣りを返却し、商品を提供します。(State:会計)
お釣りの返却と商品の提供が終わると、最初の待ち状態に戻ります。
これを、図で表現してみると、下の図のようになります。
このように、ある条件を満たすと状態が変わる制御のことをステートマシン制御と呼びます。

他社商標について
記事中には登録商標マークを明記しておりませんが、記事に掲載されている会社名および製品名等は一般に各社の商標または登録商標です。

記事内容について
この記事の内容は、発表当時の情報です。予告なく変更されることがありますので、あらかじめご了承ください。

お問い合わせ

本件に関するお問い合わせは以下までお願いいたします。
各拠点配属のFAEが課題解決をお手伝いします。