こんにちはコハペペです。今日mbedマイコン(LPC1114FN28)でSDカードにアクセスするプログラムを作ったら、うまく動きませんでした。いろいろやってみるとmbedライブラリのリビジョンを古いものに変更することで、対処することができました。その方法の紹介です。
プログラムの作り方と対処の手順は
- プログラムの新規作成
- SDFileSystemのインポート
- プログラムの作成
- mbedライブラリーのリビジョンの変更(137へ)
になります。順番ご紹介していきます。
1.まずは、mbedの開発環境の画面で左上にある「新規」をクリックしてプログラムを新規作成します。ここではテストとして「mbed_SDtest」というプログラム名にしておきます。
2.SDFileSystemライブラリーをインポートします。ここのSDFileSystemのライブラリーのページを開き、右にある「import into compiler」をクリックします。
どのプログラムにインポートするか聞かれるので、先ほど新規作成した「mbed_SDtest」を選択して「Import」ボタンをクリックします。
3.SDファイルを開くテストプログラムを書きます。プログラムは以下の通りです。
#include "mbed.h"
#include "SDFileSystem.h"
//SDFileSystem name(mosi, miso, sck, cs, mount);
SDFileSystem sd( dp2, dp1, dp6, dp4, "sd");
Serial pc(USBTX, USBRX);
int main() {
pc.printf("Hello World!\n");
FILE *fp = fopen("/sd/test.txt", "r"); //ファイルを開く
if(fp == NULL) {
pc.printf("Could not open\n");
}
pc.printf("File Pointer fp is %d\n",fp);
fclose(fp); //ファイルを閉じる
free(fp); //解放
}
このプログラムは、SDカードのファイル(test.txt)をオープンして、openで得られたファイルポンター(fp)の値をUSBシリアル経由で表示します。オープンできればそのアドレスの値が、オープンできなければNULLである0が表示されるという簡単なプログラムです。
SDカードとマイコンの配線は
- SDカードのMOSI LPC1114の2番ピン
- SDカードのMISO LPC1114の1番ピン
- SDカードのSCK LPC1114の6番ピン
- SDカードのCS LPC1114の4番ピン
です。
コンパイルすると、何やらFileSystemで警告が出ています。コンパイルは成功してしまいbinファイルがダウンロードできます。このbinファイルをマイコンに書き込んで実行してみます。
シリアルモニターで確認すると、ファイルがオープンできません。
4.mbedライブラリーのリビジョンを変更する
mbedはコンパイルの時に、mbedライブラリも一緒にコンパイルされます。このmbedライブラリは新しいマイコンへの対応やバグ修正などで、月に2,3回程度更新されているようです。今のリビジョン(バージョン)が何番なのか調べてみましょう。
新規作成した「mbed_SDtest」のツリーの中の「mbed」をクリックします。そして右側の「リビジョン」をクリックしてください。
今のリビジョンは144です。144回もバージョンアップしているんですね。mbedの便利なところは、このリビジョンを過去の物に変更できるんです。好きなリビジョンの行をクリックして、「切り替え」をクリックします。
SDカードに正しくアクセスできるのは、リビジョン番号137でした。138から144はだめでした。なので、137の行でクリックして「切り替え」をクリックします。これで、mbedライブラリーが少し前のバージョンに切り替わりました。コンパイルしてみましょう。
警告がなくコンパイルができました。mbedマイコンに書き込んでプログラムを実行してみます。
ファイルポインターの値が0(NULL)ではなくなり、ファイルがオープンできました。
最近のmbedライブラリではSDカードへのアクセスにバグがあるようですね。mbedライブラリーのリビジョンを過去の物に変更するとこで、対処できることがわかりました。
kohacraftで販売している、SDカードを使った「ドットマトリクスLED実験セット」や「電子ペーパー実験セット」では、サンプルプログラムをインポートしてコンパイルしたときは、このような問題は起きません。これは弊社でサンプルプログラムを作った時のmbedライブラリーが使われるためです。もし、サンプルプログラムを参考に、自分でプログラムを新規作成した時には、最新のmbedライブラリーが使われSDカードにアクセスできないので、mbedライブラリのリビジョン変更をお願いします。
コメント