PICで気圧、温度、湿度計 by 24FJ64GA004 SDカードに記録する その3
FAT16ファイルシステムを狙い撃ちする実験


PIC24FJ64GA004で、Microchip社提供の強力で巨大なAPI「Memory Disk Drive File System Library」を使って、SDメモリーカード上のFAT16ファイルシステムにアクセスしようと試みましたが、いくらやってもうまくいきません。どうしてもMMCモードからSPIモードへの移行が出来ないのです。私のPICやC言語に対する未熟さが露呈してしまった感じです。

ところが、同じハードウエアで、同じTranscend社の2GB SDメモリーカードに、個人のサイトで公開していた512バイトブロックリードライトのサンプルプログラムならば、ちゃんとMMCモードからSPIモードへ移行でき、さらに、512ブロックのリードもライトも問題なく出来てしまうのです。

しかも、512バイトのダミーデータを8192回分(1.58MB)連続書き込みが完全に問題無しで実行できる事も確かめました。

SDメモリーカードは短期間に進化を遂げたので、その容量は数MBから最大2GB(SDHCを除く)まで様々な種類がありますが、現在はGB以下の容量の少ないものは殆ど生産が終了し、手に入れる事が困難です。また、使用する機器との相性(?)がある様ですが、幸いにも私がたまたま手に入れてていた Transcend社製の 2GB SDメモリーカードは、自分の様々な自作パソコンと相性(?)が良く、今回のPIC24FJ64GA004でも使える事が解りました。

参考にしたソフトを独自に修正して、2011年8月15日現在、SDHDを除く殆ど全てのSDカードを読み書きできる様になりました。)

    
※ Transcend社製の 2GB SDメモリーカード 「TS2GSDC」 に加えて、Transcend社製のmicroSD 1GBカード「TS1GUSD」& MmicroSD Adater、Transcend社製のmicroSD 2GBカード「 TS2GUSD-2」& MmicroSD Adater、GreenHouse社の 2GB SDメモリーカード 「GH-SDC2GG」 も使用可能である事が確かめられました。ただし、それぞれのメーカーやカードの種類によって先頭ファイルの開始アドレスは異なりますので、ご注意下さい。最終的には、この先頭ファイルの開始アドレスもPIC内ソフトウエアにてSDカードから情報をPIC自身でよる事で算出できますが、知識として知っておいた方が良いでしょう!

今回のSDメモリーカードインターフェース実験用サンプルプログラムは、Microchip社提供の強力で巨大なAPI「Memory Disk Drive File System Library」を一切使用しません。

このライブラリーを取り込むだけで、PICのプログラムメモリー資源の大半を使い果たしてしまうだけでなく、そのライブラリーの中で何が起きているのか何も分からない上に、何か不都合があってエラーが返されても、その詳しい原因調査をライブラリーというブラックボックス内を追う事ができず、手も足もでなくなってしまうのです。

ライブラリーを使わない方法は、プログラムサイズがコンパクトで済む反面、パソコン側でちゃんとSDカード内のデータを後から読み取れる様に準備をして置かなくては成りません。

PICでSDメモリーカードに巨大なAPIライブラリーを使用しないでデータを書込む時は、SDメモリーカード上にあらかじめ必要な容量を満足するダミーファイルをパソコン側でSDカードに書込んでおき、そのファイルめがけてPIC側でデーター狙い撃ちで上書きします。

この方法は、FATファイルシステムの構造をある程度知っていないと、PICでデータは書けても、FATシステムを使用しているパソコン側では、PICで書いた情報を読めない事になってしまいます。

つまり、PIC用の巨大なAPIの代わりに、人力(もしくはPIC内の簡単なプログラム)で今から使おうとしているSDメモリーカード内のFATファイルシステムを前もって調べておき、その情報を元にPICをプログラムして置くのです。PIC側でのファイルの追加や削除等は一切出来ない分、巨大なAPIライブラリーが不要なのです。

また、複雑なファイル構造には対応できません。ルート階層にだけファイルが存在しない様なファイル構造となります。

このファイル構造のSDカードをあらかじめ「ディスクダンプエディタ(※1)」等で調べておいたファイルの先頭アドレス値を使って、PICから狙い撃ちしてデータを書込む事が可能です。また、最終的にはPIC内に簡単なプログラムを組んで、調べさせる事も出来ます。

※1:Vector で入手できる有料ソフト、Windows 95/98/Me/NT4/2000/XP/Vistaのブロックデバイス(ハードディスク・CD-ROM等)のセクタをバイナリエディタ感覚で直接編集するツール。
http://www.vector.co.jp/soft/win95/util/se091045.html

ディバイス内のファイルシステム情報に関係なく直接デバイス内のデータを読み書きできる為、内部のファイルシステムの構造を調べる為には必須です。

ただし、書込み操作については十分な知識が無い場合には、ファイルシステムそのものを書換えてデバイス全体が読めなくなり、デバイスの再フォーマットが必要になるので取り扱いには十分注意すること。
もっとも、今から行おうとしているSDメモリーカード上にそのファイルめがけて狙い撃ちでデーターを上書きする方法も、結果的には誤った指令をすれば、ファイルシステムそのものを書換えてSDメモリーカード全体が読めなくなり、SDメモリーカードの再フォーマットが必要になる事は同じですから、FAT16に関する十分な理解が必要です。

参考にしたサイト:FATファイルシステムは、本来はMicroSoft社が本家本元なのですが解り難いし、なかなか無償では資料が見つかりません。私なりにPIC用に調べて参考になったのは下記サイトです。

◎天姫さんの「電子工作の工場」
http://amahime.main.jp/
の「PIC24Fを使ってみよう+SDカード」と、特に参考になったのは「FATファイルシステム」です。

◎PIC マイコンを便利に使うページ
http://www.mars.dti.ne.jp/~m7030/index.html
の「ちょっと一息(SDカードとFATについて)」と、「FAT32について」。

◎kunioのホームページ
http://www.cek.ne.jp/~kunio.h/index.htm
の「FATについて」基本用語が詳しく載っています。「FATについて2」、「FATについて3」

◎そして、英文ですがMicrochip社のライブラリー解説書 AN1045「File I/O Functions Using Microchip's Memory Disk Drive File System Library」です。
http://www.microchip.com/stellent/idcplg?IdcService=SS_GET_PAGE&nodeId=1824&appnote=en532040

また、PIC24FJ実験用のサンプルソフトウエアの元は、
◎浅草ギ研さん
http://www.robotsfx.com/index.html
の、使い方とサンプルプログラム>「A33FでMicroSDカードにアクセスしてみる(SPIインターフェイスの使い方)」です。

今回使用しているSDメモリーカードインターフェース実験プログラムは、この「浅草ギ研」さんが公開している、dsPIC33FJ256GP710を使用したSDカードへのインターフェース・サンプルプログラムを、私がPIC24FJ64GA004用に移植したものです。

いままで自分なりに、様々な書籍やサイトで公開されているPIC24FJ系の「SDメモリーカードインターフェースのサンプルプログラム」を試してみましたが、実際にPIC24FJ64GA004でSDカードにSPIモードでプロックリード・ブロックライトが確認できたのは、「浅草ギ研」さんが公開しているサンプルプログラムを、自分でPIC24FJ64GA004用に移植したものだけでした。

2011年8月15日現在、「浅草ギ研」さんが公開しているサンプルプログラムを私が独自に修正し、SDHDを除く殆ど全てのSDカードを読み書きできる様になりました。

なお、ハードウエアは前回と同じですが、一応載せておきます。
(Jan. the 16th 2011)

 
今回実験で使用しているのは、Transcend社製の 2GB SDメモリーカードですが、SDHCを除く2GB以下の容量の物ならば何でも良いはずです。問題は相性(誠に曖昧な言葉で、具体性を欠いていて大嫌いな言葉ですが・・)だけです。

8MB、128MB、miniSD8MB等を試してみましたが、残念ながら今の所、今回のハードとソフトの構成で、アクセスに成功したのは、幸か不幸か前述の3種類だけです・・・

まず、SDHCを除く買って来たばかりの生(新品)のSDメモリーカードならばそのままで、すでに何か書き込んだりしている場合には、FAT32、eFAT以外でフォーマットして下さい。FAT12、FAT16、FAT32、eFAT等4種類のFATファイルシステムが存在していますが、SDメモリーカードのルートディレクトリーにたった1個のファイルを存在させてそのファイルの先頭アドレスを狙い撃ちするので、実はどの方法でフォーマットされていても構いません。ただし、今回は使用するソフトの都合上、FAT12や、FAT16でフォーマットされた物を扱って説明いたします。(MacOSX でこの2GBのSDカードに通常のフォーマットをするとFAT32に成り、FAT16でフォーマットできません。それは、MacOSX 用のファイル管理用隠しファイルの名称の都合でそうなります。)

次に、FAT12や、FAT16でフォーマットの済んだSDメモリーカードへ、データ狙い撃ちで書込みする為のダミーデータを、「メモ帳」等でテキストファイルを1つだけ作って用意し、SDメモリーカード上へコピーして下さい。


そのファイルの中身は何でも構いませんが、ファイルの先頭アドレスを探るのに解りやすい英文字(例えばAir3とか)を4文字程先頭に使っておいて下さい。ファイルのそのものの大きさは何でも良いですが、1ファイルの大きさが数メガバイトを超える様な大きなテキストファイルや、改行(LF,CR)を途中に含まない数キロバイト以上のテキストファイル等は、そのファイルをエディター自身が処理できなくなったり、OS自身がファイルの大きさを正しく把握できなくなってしまう事がありますのでご注意下さい。ファイル名は何でも良いですが英数字で短めの物にしておいて下さい。


いよいよ、ディスクダンプエディタを起動して、Generic USB SD Reder を選択してSDメモリーカードを表示させてみましょう。


アドレス0が表示されます。殆ど00ばかりで、一部に何か書かれています。ここのアドレス0x01C6、0x01C7、0x01C8、0xC9の内容は重要な意味が有りますが、まだ、FATファイルシステムの事を何も知らないのですから、とりあえずどうでも良いです。


オプションのアドレス表示をデバイス単位にしておいて下さい。


そして、編集>検索で「次のセクタも検索する」をチェックを入れておいて、ファイルの先頭アドレスを調べる為に、先ほどSDメモリーカードに書き込んでおいたファイルの内容の先頭の何文字か(例えばAir3)を検索して下さい。


チョロチョロチョロっと検索が進んで、ファイルの先頭が現れるはずです。文字データーがASCIIコードで表現されて格納されていますね。この時の左端に表示されている値が、このSDカードメモリーに書かれたファイルの先頭アドレスです。この値は、同じカードであっても、フォーマットする機器の都合によって様々な値に成ります。カードの容量が異なれば、全く違う値に成ります。


Transcend 2GB SDメモリーカードをWindowsXP Pro. SP3 でFAT(FAT16)でフォーマットした場合でも、それ以前に別の機器でフォーマットされていれば異なる値に成ります。 例えば、この例ではSDメモリーカードを買ったままで何もフォーマットを行わないでファイルを1つコピーした場合ですが、1つ目のフィルの先頭アドレスは0x50000でした。ところが、他のパソコンでFAT32でフォーマットして使った後で、再びWindows XP Pro. SP3 でフォーマットした物では0x48E000とか、0x47E000とかの値になりました。いずれにしても、この値こそが、知りたかったSDメモリーカード上のファイルの先頭アドレスなのです。

この先頭アドレスが解ってしまえば、他の事は殆どどうでも良いのです。この値をPICのソフトウエア上で使用して、SDメモリーカードへデーターを狙い撃ちで順番に書き込んで行けば良いのです。ただし、同一の会社の同一のSDカードであっても、フォーマットの経過によっては1つ目のファイルの先頭アドレスは異なる場合がありますので、事前に調べておかなくてはいけません。

PIC自身でファイルの先頭アドレスを探させれば、こんな事はしなくても良いのですが、その分プログラムが複雑になり、プログラム容量が増してしまいます。SDメモリーカードの再フォーマットさえ行わなければ、ファイルの先頭アドレスは変わりませんから、1回だけ人力で調べておけば良いのです。何処まで人任せで、どこからPICにやらせるか?ただそれだけの事です・・・

そうは言っても、実際にパソコンはどうやって、ファイルを探しているのか気になります。

今回はファイルの先頭の4文字をあらかじめ知っていたので、検索を利用して探しましたが、パソコンはFATファイルシステムから得られる情報を元にしてファイルを操作しています。

このFATファイルシステムの概要を知っておいた方が、今後の為にも良いと思います。

次回は、そのFATファイルシステムの仕組みを私なりに解析(?)した結果を元に説明(?)してみようと思います。
(Jan. tha 19th 2011)

注意事項
General disclaimer
トッ プページへ

なお、当ホームページで公開しているデーター(写真、音声)等を個人の枠を超えて複製・転用する事はご遠慮下さいませ。
ご意見/苦情/ご感想はこちらまで