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

 
 

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

通常は、Microchip社が標準ライブラリを提供していますので、特に理由がなければそっちをお勧めします。ただ、必要なメモリ容量の制約があり、使えるデバイスが限られます。特に旧型のPICでは使えない事が多いです。(メモリ容量に関してはアプリケーションノートAN1045参照)どうしても動かしたい場合、使用メモリ量を減らしたこのライブラリが使えるかもしれません。

Easy SDcard FAT Library for PIC18

2010年1月22日

主な仕様

 対応CPU: Microchip社PIC18F2550, PIC18F4550

    PIC18F25J50, PIC18F26J50, PIC18F45J50, PIC18F46J50 (2011.3.21追加)

 開発環境: MPLAB IDE 8.36, C18 C Compiler v3.33(academic version)

 使用プログラムメモリ量: 読込みのみ=11.2k、書込み=15.4k、最大=18.7kバイト/最適化なし

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

 記録フォーマット: マスタブートレコードの付いた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で逐次日時を設定する事で、ファイルのタイムスタンプが正しく設定されます。

 (char *)は文字列リテラルを直接指定すると正しく動きません。ROMにバインドされないようにして下さい。


注意:

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


ダウンロード

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

Easy_SDcard_FAT_Library_for_PIC18_files/SDcm01c_sample.zip
SDcm01c_sample.zip(144kB)  V0.1c(2010.4.2更新)
Easy_SDcard_FAT_Library_for_PIC18_files/SDcm03_PIC18F26J50.zip
SDcm03_PIC18F26J50.zip(156kB)  V0.3(PIC18F26J50用 2011.3.21追加、2011.11.1更新)

 sd_config.hでSD_OPT_STRING_Hオプションを有効にした場合、既存ファイルをオープン出来ない事がある不具合を対応しました。ファイルにアーカイブ属性が付いていたりすると発生します。

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


テスト回路のEagleファイル

Easy_SDcard_FAT_Library_for_PIC18_files/SDcm_sample_eagle.zip
SDcm_sample_eagle.zip(160kB)


サンプルの動かし方

・回路は下の物を用意。

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

・プロジェクトメニューからビルドして、デバイスへのプログラムの書込みを行う。(エラーになる場合*1)

・電源3.3Vを与える。(PIC18LF2550が必要ですが、CPUクロックを下げると大体動きます)

LEDが最初全て点灯し、処理が進むにつれ消灯位置がずれていきます。

*1: メッセージ“usb_common.h:367:syntax error”が出る場合は、ビルドオプションのインクルードパスの定義に “c:\MCC18\h” と ”c:\Microchip Solutions\Microchip\include” をこの順になる様に登録すると回避できます。順番が重要です。


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

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

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

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


ソースファイル

sd_L1.c

sd_L2.c

sd_L3.c

sd_common.c

delay.c

ヘッダファイル

sd_config.h

sd.h

sd_L1.h

sd_L2.h

sd_L3.h

sd_common.h

delay.h


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

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

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

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


ライブラリ内部について

 PSoC1版をご参照下さい。