自作電子小物/TIPS/簡易SDカードサポート/AVR

 
 

アトメル社のマイクロコントローラのAVRシリーズ用の、最低限の機能に絞ったSDカードの入出力サブルーチンです。FATファイルシステムを含んだ機能を持っていますので、これだけでSDカードへのファイル読み書きが出来る様になります。PSoC用に作ったものをATmega328Pに移植しました。ATmega168等の他のAVRデバイスでもプログラムメモリ容量が8kB、RAM容量が1kB以上であれば、そのまま動くと思います。

このライブラリは、少しでも安く済まし、使用メモリ容量が少なくなるように機能を限定して実装したものです。同様なライブラリは世界中沢山ありますが、その実装例の一つです。

Easy SDcard FAT Library for AVR

2010年7月16日

これはPSoC版からの移植で、HAL(ハードウエアインタフェース層)を更新したのみで、主なコードは全く変更せずにテスト完了出来ました。コードの隅々まで見直した訳ではありませんので、バグがある可能性は高いです。


主な仕様

 対応CPU: ATMEL社ATmega328P

 開発環境: AVR Studio 4.18.700 + WinAVR-20100110(GCC 4.3.3)

 使用プログラムメモリ量: 読込みのみ:4.6k、書込み=6.5k、最大=6.8kバイト/最適化あり(-Osオプション)

 使用データメモリ量: 688バイト

 書込み性能: 約1.5kバイト/秒(CRCあり、SCLK=128kHz,CPU=1MHz,レコード長12バイト時の参考)

 書込み性能: 約2.6kバイト/秒(CRC無、SCLK=128kHz,CPU=1MHz,レコード長12バイト時の参考)

 記録フォーマット: マスタブートレコードの付いたFAT12とFAT16ファイルシステム(※1)

     扱えるファイルはルートディレクトリ直下のショートファイル名(8.3)のみ

 API (アプリケーションプログラムインタフェース)

   
一般
int sd_mount(void);
int sd_unmount(void);
int sd_open(char *filename, int oflags, int attr);
int sd_close(int fd);
int sd_read(int fd, char *buf, int bufsize);
int sd_write(int fd, char *buf, int bufsize);
int sd_lseek(int fd, long offset, int whence);
int sd_sync(int fd);
int sd_unlink(char *filename); 
通常のコール順は、sd_mount() → sd_open() → sd_read(),sd_write() → sd_close() → sd_unmount() です。sd_syncはクローズと同じく書込みを確定させます。極端にコールしすぎると、通常の磁気ディスクと違い、メディアの寿命が縮む(書込み回数制限に達する)ので要注意です。

   
ディレクトリ操作
SD_DIR *sd_opendir(char *dirname);
struct sd_dirent *sd_readdir(SD_DIR *dirp);
int sd_readdir_r(SD_DIR *dirp, struct sd_dirent *entry, struct sd_dirent **result));
long sd_telldir(SD_DIR *dirp);
void sd_seekdir(SD_DIR *dirp, long loc);
void sd_rewinddir(SD_DIR *dirp);
int sd_closedir(SD_DIR *dirp);
int sd_dirfd(SD_DIR *dirp);

   
タイムスタンプ操作
SD_SET_DATE(year,month,day)
SD_SET_TIME(hour,min,sec) 
このAPIで逐次日時を設定する事で、ファイルのタイムスタンプが正しく設定されます。

注意:

1 基本的には、SDカードの規格を決めているSDアソシエーションが提供するユーティリティ・SDフォーマッターをお使い頂き、FAT16で初期化して下さい。Windows用、Mac用の両方があります。Windows自体が持つフォーマット機能を使用する場合は、FAT32にならない様に注意して下さい。Mac OS Xの付属のディスクユーティリティは、FAT16でフォーマットが出来ないようです。2GB以下のSDカード購入時のフォーマットはFAT16になっている事がほとんどのようなのでそのまま使えると思います。


ダウンロード

関連ソース全てとサンプルプログラムが入ったAVR Studioプロジェクトファイル

Easy_SDcard_FAT_Library_for_AVR_files/SDcm02_sample.zip
SDcm02_sample.zip(132kB)  V0.2

ソースコードはPSoC1,PIC18,AVR版で同一です。#defineでプロセッサの違いを認識し、対応したコードがコンパイルされるようになっています。


サンプルの動かし方

・回路は下の物を用意。

・ダウンロードしたzipファイルを、適当なディレクトリに展開し、AVR Studioでプロジェクトとして開く。

・プロジェクトメニューからビルドして、デバイスへのプログラムの書込みを行う。

・電源3.3Vを与える。

LEDが最初点灯し、正常だと消え、問題があると点滅します。点滅パターンにより問題のある箇所が特定出来ます。正常の場合、SDカードに”test.txt”のファイルに”01234567890”を100行書込みます。具体的にはメインプログラムのソースコードSDcm02_sample.cを参照して下さい。


ユーザアプリケーションプログラムでの使い方

  1. (1)必要となるソース・ヘッダファイルをプロジェクトディレクトリにコピーしておき、プロジェクトメニューから、このソースファイルを全部ADDします。ソースツリーに追加表示されます。

  2. (2)sd_config.hとdelay.hを修正。必要なオプションの#defineを有効/無効にする。

  3. (3)以上でビルド出来る様になる。

無事動いた様に見えても、たまに誤動作する事があるようでしたら、まず以下の点を確認して下さい。

・ファイルシステムが破壊されている。Windowsのファイルプロパティのツールで修復して見て下さい。壊れていても何もメッセージは出ませんが修復されますので、再現するか確認して下さい。壊した原因が他にあるはずです。根源となったトラブルを探す必要が有ります。

・電源ラインの能力不足。SDカードの種類によっては、書込み時100mA級の電流が流れる事があります。これで、瞬間電源電圧が大きく下がる場合、SDカードが誤動作するか、マイコンがBORブラウンアウトリセットが発生するケースです。

・スタックオーバフローの可能性。使用メモリ量を減らすと安定する場合このケースだと思われます。


ライブラリ内部について

 PSoC1版をご参照下さい。


余談

待望の、AVR版です。移行は大変だろうなあと思っていましたが、開けてみればリコンパイルだけで済んだ様なものでした。やはりGCCは素晴しい。本来あるべき言語仕様を体現しています。自分の間違った認識も正してくれます。一番嬉しいのは、コード最適化で、ICC(ImageCraft C Compiler/最適化なし/PSoC Designer)比で約半分、こんなに小さくなるとは思っても見ませんでした。

SDカードでプログラム書換えが出来るブートローダも用意しました。合わせてご活用下さい。(2010.9.4)