フラッシュのメモリカードは様々あります。
今回は手持ちのSDカードを選んでみました。
まずは実験用のエレキです。
マイコンはPIC16F877を使い、外部とデバッグ用のデータをやり取りするためにシリアルのレベルコンバータを付けています。
また、ファーム書き込みはチップの抜き差しが面倒なためISPで行います。
SDカードのスロットは最安値のUSBカードR/Wから剥ぎ取りました(;´Д`)
常套手段ではありますが。
PICは3.3Vで20MHz駆動しています。
低電圧だとクロックを落とさないとダメ、といった情報があったような気がしましたが、今のところは問題なく動いています。
もしかするとチップの個体差でNGのものもあるかもしれませんが‥
あと、低電圧で動かすときの注意としては、BROWNOUTをDisableにしておく必要があります。これを忘れるとPICが低電圧を検知するため動きません。
試行錯誤の結果、なんとかSPIモードへ移行できたようです。
SDカードから期待したレスポンスが返ってきただけで感動(;´Д`)
夜中にもかかわらずシャウトしてしまいました(w
ひとまず、それらしいデータが読み込めました。
かなり不安定ですが‥
しかし、どうも良く分からない。
最初の辺りはデータがゼロばっかりで、かなり進んだところからそれらしいデータが出てきます。
アドレス0からブートセクタが来ると思っていたのですが‥
PCからダイレクトにディスクを見ると「MSDOS5.0」みたいな感じで読めるので‥
まずはカード内のデータ構成やFATから勉強する必要がありますね。
また色々と試行錯誤して、ルートディレクトリにあるファイルのリストまでできるようになりました。
次はデータの読み込みですね。
毎晩の帰宅が零時過ぎなので、イマイチ進めません‥
さて、書き込みを考えると、チープなマイコン単体で実現するのは無理です。
というのも、SDの読み書き単位は512バイトです。
例え1バイトのデータ変更でも、512バイトでデータを書き込まなければなりません。
ということは、一旦512バイト読んでバッファに溜め、そのバッファ中のデータを変更した後にカードへ書き込む必要があります。
PIC16F877では512バイトのRAMは使えないため、256kbitのSRAMを増設。
(修正:2011/04/09)
上ではSDの読み書き単位は512バイトと記述しましたが、カードにアクセスする際のブロックサイズ(だったかな?)を変更すれば、512バイト単位でなくてもいいようです。これならRAMの少ないマイコンでも処理できますね。
この情報はかなり前に知っていたのですが、更新するのを忘れていましたw
新たに作ったエレキ
線材での配線は、HDDのATA133用フラットケーブルをバラして使いました。
かなり細いので山盛りになりません。
UEWを使えばいいのかもしれませんが‥