32KBしかSRAMを積んでいないAT91SAM7A3ですが、スペクトラムの表示機能まで入れてもまだ、半分の16KBも使っていません。まだまだ、RAMには余裕があります。そこで、AT91SAM7A3の特色でもあるMCI (Multimedia Card Interface)を使ってSDカードへのアクセスを実験することにします。
まずはハードウェアの準備から。MCIでは6本の信号が用意されていますので、これを下図のようにSDカードソケットにつないでやります。最初はマイクロSDにしようかと思っていたのですが、ソケットの実物を見たら手ハンダする自信が失せたので、SDカードに変更しました。SDカード自体は9ピンですが、残りの3本はVCCとVSS 2本です。ソケットにはカード検出用とライトプロテクト用のピンも用意されていますので、必要であればこれらはGPIOにつなぐわけですが、今回は省略しています。
トラ技とかインタフェースの製作記事や解説記事ではSPIモードを使ってのSDカードへのアクセスはしばしば解説されているようですが、SDバスを使った場合については、あまり説明されていないように思われます。安価なマイコンではSPIしか使えないのが大きな理由でしょうが、SDカードの詳細技術仕様についてはライセンスが必要ということも、しばしば指摘されているようです。そこで、SD AssociationのHPを確認してみたところ、現在では物理層仕様の簡易版であればダウンロード可能であることを知りました。この仕様書にざっと目を通したところ、SDバスのビット幅の切り替え方やSDHCカードの場合のブロックアドレスの指定方法を理解することができました。このドキュメントはSD関連技術資料の一部でしかありませんが、SDカードをストレージとして使う我々アマチュアの用途には必用十分な情報が記載されていると言えます。
SDバスモードを使うことによる優位性は、上図のようにSPIモードは1ビットのシリアルでしか入出力ができないのに対し、SDバスではDAT[0]~DAT[3]を使って、一度に4ビット転送できることです。電源投入時はSDカードはDAT[0]だけを使う1ビット幅のモードで動作しているので、初期化手順の中でACMD6コマンドを投入して4ビット幅に切り替えてやるようです。
SDカードのバスとプロトコルの仕様はわかったので、次はMCIを使ってSDカードにアクセスするためのドライバです。仕様書とAT91SAM7A3のデータシートを元に自分で書いてもいいのですが、今回はATMELが提供してくれているSoftware Packageに含まれているソースを流用することにしました。RTOS無しの環境で動作するコードになっていますが、ちゃんと割り込みを使って処理するコードになっており、構造も素直でわかりやすく書かれているので、ちょっと手を入れるだけですぐに使えそうだからです。
この続きは、また次回。
まずはハードウェアの準備から。MCIでは6本の信号が用意されていますので、これを下図のようにSDカードソケットにつないでやります。最初はマイクロSDにしようかと思っていたのですが、ソケットの実物を見たら手ハンダする自信が失せたので、SDカードに変更しました。SDカード自体は9ピンですが、残りの3本はVCCとVSS 2本です。ソケットにはカード検出用とライトプロテクト用のピンも用意されていますので、必要であればこれらはGPIOにつなぐわけですが、今回は省略しています。
トラ技とかインタフェースの製作記事や解説記事ではSPIモードを使ってのSDカードへのアクセスはしばしば解説されているようですが、SDバスを使った場合については、あまり説明されていないように思われます。安価なマイコンではSPIしか使えないのが大きな理由でしょうが、SDカードの詳細技術仕様についてはライセンスが必要ということも、しばしば指摘されているようです。そこで、SD AssociationのHPを確認してみたところ、現在では物理層仕様の簡易版であればダウンロード可能であることを知りました。この仕様書にざっと目を通したところ、SDバスのビット幅の切り替え方やSDHCカードの場合のブロックアドレスの指定方法を理解することができました。このドキュメントはSD関連技術資料の一部でしかありませんが、SDカードをストレージとして使う我々アマチュアの用途には必用十分な情報が記載されていると言えます。
SDバスモードを使うことによる優位性は、上図のようにSPIモードは1ビットのシリアルでしか入出力ができないのに対し、SDバスではDAT[0]~DAT[3]を使って、一度に4ビット転送できることです。電源投入時はSDカードはDAT[0]だけを使う1ビット幅のモードで動作しているので、初期化手順の中でACMD6コマンドを投入して4ビット幅に切り替えてやるようです。
SDカードのバスとプロトコルの仕様はわかったので、次はMCIを使ってSDカードにアクセスするためのドライバです。仕様書とAT91SAM7A3のデータシートを元に自分で書いてもいいのですが、今回はATMELが提供してくれているSoftware Packageに含まれているソースを流用することにしました。RTOS無しの環境で動作するコードになっていますが、ちゃんと割り込みを使って処理するコードになっており、構造も素直でわかりやすく書かれているので、ちょっと手を入れるだけですぐに使えそうだからです。
この続きは、また次回。
のページに当り興味深く拝見させて頂きました。ところで、そのatmelのソースとは、どれを
さすのでしょうか??
SD部分のソースを入手したいです。
fatfsを移植してFAT32を実現したいと考えてます。
いろいろと情報を教えて下さい。 敬具
サンプルのソースは評価ボードのページからたどることができます。SAM7A3なら、AT91SAM7A3-EKのページに関連ソフトウェアが置いてあります。
http://www.atmel.com/dyn/products/tools_card.asp?tool_id=3783
サンプルのソフトウェアと、それらが使用しているライブラリのソースは
http://www.atmel.com/dyn/resources/prod_documents/at91sam7a3-ek.zip
に含まれています。ATMELのソースは、もともとfatfsを使用していますから、OS無し環境を想定するのであれば、そのまま使えるかもしれません。