前回利用したSDカードはFAT12というとても古いフォーマットです。

容量も16MBと近年のものに比較するとかなり小さくなります。

その小さいおかげも手伝ってPICからファイルを作成するプログラムも小さくて済みました。

仕様もミニマムです。

 

すでにFAT12でフォーマットされたSDカードを分析して乗っ取ります^^

図中のアドレスやセクタの大きさは、今回のSDカードを分析した結果であり参考例です。

 

セクタ0x00(マスターブートレコード)をまず読み、BPB(BIOSパラメータブロック)のセクタ番号を拾います。

BPBからFAT(ファイルアロケーションテーブル)の大きさやセクタ番号を拾い(計算し)ます。

さらにBPBからRDE(ルートディレクトリエントリ)の大きさやセクタ番号を拾い(計算し)ます。

SDカード中のファイル情報は、RDEに32バイト/1ファイルで格納されており、1セクタは512バイト、32セクタのRDEに格納できるファイル数は512個になります。

1ファイルエントリ中には、名前や日時やサイズ、中身の先頭の場所を示すFAT番号がかかれています。

実はFAT番号だけから計算で先頭データのありかはわかります。が、ファイルが大きくなってくると次はどの領域を使っているのか、場合によっては他のファイルとの兼ね合いでSDカード上に散在することになるためアロケーションテーブル(FAT)が必要になります。

FATには次のFAT番号が書かれているか、終端を示す0xFFFが書かれているかのどちらかになっています。(チェーン構造:デフラグツールなどで見たことがあるのでは)

 

今回は、

ファイルオープンで、

ルートディレクトリエントリに見つけた最初のファイルを、RDE先頭にコピーして残りのエントリは消してしまいます。→SDカード上、ファイルは1つだけ存在するように見えます。

FATを書き換えて、このファイル1つでSDカード全体を占めているようにします。(チェーンがFAT最初から最後までつながっていることを示すようにする=最大長のチェーンを作る)

このファイルのサイズをSDカード上に可能な最大サイズに修正します。

この仕様の別目的:オープンだけしてPICの電源を落とすとSDカード上の全データがPCから読めます^^。

 

ファイル書き込みで、

ユーザデータ領域から連続でデータを書き込みます。

実際には512バイトのバッファがいっぱいになったところでSDカードに書き出します。

チェーンは順番にできているので、途中FATを見る必要がありません。
セクタ終端に行ったら先頭データセクタから書くようにします(リングファイル、上書き)。→この場合、ファイルは最大サイズで作られているので特にクローズ処理は不要。

 

ファイルクローズで、

書き込みサイズをファイルサイズに反映させ、FATも合わせて修正します。

 

クローズ処理が実行されないとバッファ上のデータをロストするのでいつ呼んでもよいフラッシュ関数も作りました。フラッシュ関数はクローズ処理の最初でも実行されます。

 

もともとRAMが小さいPIC用なのでマルチストリームは不可能、PICから1ファイルがSDカード上に作成できてPCから読めればOK、な仕様です。なのでファイル読み込み機能は作りませんでした。GPSを外に持ち出せる日が近づいてきました。