2008年02月27日

電子工作と FLASHメモリ

電子工作で大容量のデータを扱いたい場合のひとつの選択枝は、SD/MMC カードを使うことだ。

  • MMCの使い方のページがいちばん判りやすくかつ詳しいと思う。この中の端子処理と活線挿抜も要チェック。

  • SD/MMC カードの接続例(OLIMIX SAM7-P256の回路図より)

    - この回路でも、VCC に LC フィルタを入れて対策している。このとおりの回路にする必要はないが、対策はした方が良さそうだ。


いまは、ビット単価がすさまじく下がっているので、実際に使うのは microSD が良いと思う。microSD のほうが一般に消費電力が少ないらしい。実際に調べたわけではないが、突入電流も少ないのではないだろうか。

SD のスロットでよいなら、秋月でも取り扱っている。-- (150円の安い方は)あまりよい品ではないらしい。220 円の ヒロセ製の方が安心。

microSD 専用にしたいなら、コネクタもデジキーで入手できる。DM3AT-SF-PEJとかDM3B-DSF-PEJとか。microSD は、1.1mm ピッチだから手半田でもなんとかなるかも知れない。

西川部品でも DM3A-SF-PEJを扱っている(315円)。-- ゆきの研究室つれづれ日記より

秋月でも DM3AT-SF-PEJを扱いだした。200円。
ちなみに MINI-SD 用スロット(DM2A-SFW-PEJ-S)も。200円。


さて、そんなに大容量である必要がなく、PCからの読み書きも必要ない場合はどうだろう。

残念ながら、あまり選択枝はない。特に ADC からキャプチャーするなど、高速かつ定期的にデータを書き込みたい場合は、ダブルバッファが必要でさらに選択枝が少なくなる。

以前さがして、そういう目的に合いそうなデバイスを1つ見つけたので紹介しようと思う。

それは、AT45DB081D -- デジキーで 213円

インターフェイスは SPI で 8-soic パッケージがあるので、秋月の変換基板で DIP としても使える。

1MB だから GBクラス の microSD の 1/1000 以下だが、目的によっては大きすぎる場合もあるはず。書き換えも 10万回できる。

書き込みに向いていると思ったのは、256B の ページWrite が比較的早い(2ms Typ/4ms Max) だけでなく、バッファを 2組持っているためだ。

バッファを 2 つ持っていると、ページWrite している間も書き込みができるので、AVR 側にバッファを持たずにすむし書き込み時間も隠蔽されてしまう。ページWriteの時間だけが、書き込み性能を規定する。

4ms あたり 256B 書けることが保証されているのであれば、8bit ならば、64k sps でデータを書き込みしてもデータ落ちがないということである。AVR のADC の 上限 77 k sps にかなり近い。10 bit だと、15 k sps でしか取れないから、2バイトづつ書いても十分間に合う。

ちなみに、AT45DB081B というデバイスもあるが、ページWriteが遅い。AT45DB041D は容量だけ違うので良いのだが、すぐ買えないかも知れない。AT45DB021D は、バッファを 1つしかもっておらずキャプチャーに向いていない。
AT45DB161D も 276 円と安く良い。ページサイズが 512B で ページWrite時間が 3ms Typ/6ms Max なので、若干帯域が高い。

上記は、Write だけをする場合。Erase には時間がかかるのであらかじめ Erase しておくのを前提にしている。Erase and Programming だと、Typ 14ms/Max 35ms になる。この場合の上限は、7.3KB/sec ほど。

Write と違って Read は制限がほとんどない。バッファに読み出す時間は 0.2 ms でしかも 2つあるから無視できそうだ。SPI クロックの上限は 66Mhz で 純粋に AVR 側の SPI 性能で決まる。たとえば ATmega88 とか AT90USB162 とかは、SPI を持っていて、さらに USART も SPI として使える。上限は 1/2 CPU CLOCK なので、CPU CLOCK が16MHz だとすれば、8MHz 。連続で読み出す場合 1MB/sec 弱で読み込めるはずだ。

まぁ、書き込みが高速といってもこの程度だし入手性も問題がある。1MB ほどしか必要なくても、いっそのこと microSD にしてしまうのも良いのではないかと思う。

SD/MMC カードを使う場合、FAT をサポートするのが望ましい。1MB しか必要ないのに 1GB 全体を占有するのは気がひける。
でも AVR などコード領域が少なく FAT をサポートしきれない場合はどうしたらよいのだろう。

案1)あらかじめ用意した固定名のファイルの中だけを使う。

FAT16のみを使用して、アロケーションサイズも 32KB 固定にすることを前提にしてみる。

- こういうことは、Linux では簡単にできる。mkfs.msdos のパラメータを設定するだけだ。

- Windows XP だと 2GB(弱)なら FAT を選択するだけで自動的に 32KB になる→ 参考 : FAT および NTFS のデフォルトのクダスタサイズ
- 1GB だと 16KB になるだけで、残念ながら普通の方法では無理。
面倒だが、コントロールパネル→ コンピュータの管理→DISKの管理→領域選択→プロパティで FAT とアロケーションユニットサイズ を選択することで FAT16で32KB に設定可能。
- 4GB の microSD は存在しない。microSDHC になる。


こういうことを前提にできるなら、1MB でも 32個 64B の変換マップを作れば良いので なんとかなるのではないだろうか?

ちなみに、microSD の 1GB と 2GB のみを対象とした理由

- メモリカードの販売価格の推移を見ていると 1000円を大幅に切るまで安くなったものは、やがて市場から消えていく運命にある。
- 1GB の価格はすでに 600円台。たぶんやがて消える。
- 2GB は SD 規格の最大容量だから、結構しぶとく残るのではないか? (ただし、どこまでも安くなるとは思えない。500円〜1000円のどこかで安定するような気がする。) 
- そうだとして microSD は miniSD/SD に変換できるから、2G 以下の miniSD/SDもやがて消えていくのではないか? 
- そういうわけで、今からものを作るのであれば、2GB のみを対象にすれば良さそう。(1GB はおまけ)



案2) パーティションの隙間を使う。

案1を実装するだけのコード領域がないから FAT を無視して連続した領域を使いたいという場合でも 先頭から使うのだけはやめたほうが良い。

先頭の 512B さえあければパーティションをずらして作ることで、他の領域を他の目的に使えるからだ。

- これも Linux なら実に簡単だ、fdisk するときにパーティションの先頭をデフォルトから変更するだけ。
- Windows ではどうしたらよいのだろう? 商用ソフトなら、いくつか存在するのだろう。しかし、これだけのために商用ソフトを進めるわけにはいかない。
- FIPS かつては定番ツールだったらしい。今使えるのかどうか不明。
→ (MD5) 0e69615d799a6dc7309cbc07a4539426 fips20.zip
ソース付きなので、いろいろできるかも。


さて、どれだけずらせばよいのだろう? 一応 16セクタ(先頭から 16x 512B) ずらすことをお勧めする。

なぜか? たいした理由ではないのだが、あるシステムと同じだから。-- あるシステムって何? 誰でも知っているものだけど秘密です。


追記:09/10/02

SD/MMC カードの接続なのだが、ELM: 8ピンICで作る SDオーディオ・プレーヤ回路図を見ると .. プルアップが全部省略されている。DAT1/DAT2/CD が無接続。プルアップ必須だとばかり思っていたので、少々驚いた。

それはともかく、最近の microSD は 2GB/4GB でも MLC 化しているようだ。そうなると 内部の消去ブロックのサイズが 大きくなる。これが実に 2MB ぐらいありそうだ。

microSDの耐久テストをしていて思ったのだが、このサイズ 2MB 内なら 一気に書けるようだ。

キャプチャーするには最適かも知れない。

ちなみに、お勧めは SanDisk 。ウェアレベリングが効くので あまり寿命を心配する必要もない。
posted by すz at 21:28| Comment(0) | TrackBack(0) | 日記
この記事へのコメント
コメントを書く
お名前:

メールアドレス:

ホームページアドレス:

コメント: [必須入力]

認証コード: [必須入力]


※画像の中の文字を半角で入力してください。
この記事へのトラックバックURL
http://blog.sakura.ne.jp/tb/30760448
※ブログオーナーが承認したトラックバックのみ表示されます。

この記事へのトラックバック