今回はPIC32MX270F256BをターゲットにMPLAB X v5.45+Harmony3+XC32 v2.50を使用して、PIC32マイコンにSDカードを接続して読み書きする方法について紹介します。
Harmony3を用いることでSPI接続で簡単にSDカードの読み書きを実装することが可能です。Harmony3のプロジェクトグラフは下記の通りです。
今回はSPI1をSDカード用に割り当てました。
SPI1の設定はデフォルトのままで問題ありません。
SD Card設定ではSDカードのチップセレクトをどのポートにするか設定します。他の設定はそのままで問題ありません。
FILE SYSTEMの設定はそのままで問題ありませんが、32GB以上のSDカードを使用する場合は「Enable exFAT ~」にチェックを入れます。
最後にSPI1のIOとSDのCSのポートを忘れずに設定します。SPI1のIOとCSをGPIO OUTPUTに設定します。なお、SDI1とSDO1をプルダウン有効にしていますが、必須ではありません。
Harmony3の設定完了後、Generate Codeボタンでコードを生成します。コード生成後、app.cのAPP_Tasks内にファイル書き込みのテストコードを追加します。
SYS_FS_HANDLE fileHandle;
char hello[] = "Hello World !!";
int res;
//SDカードマウント
res=SYS_FS_Mount("/dev/mmcblka1", "/mnt/myDrive1", FAT, 0, NULL);
if(res!= 0)
{
res=SYS_FS_Mount("/dev/mmcblka1", "/mnt/myDrive1", FAT, 0, NULL);
if(res!= 0)
{
SYS_DEBUG_PRINT(SYS_ERROR_DEBUG, "Mount ERR\r\n",res);
return;
}
else
{
SYS_DEBUG_PRINT(SYS_ERROR_DEBUG, "Mount OK\r\n");
}
}
else
{
SYS_DEBUG_PRINT(SYS_ERROR_DEBUG, "Mount OK\r\n");
}
//ファイルオープン
fileHandle = SYS_FS_FileOpen("TestData.txt", (SYS_FS_FILE_OPEN_WRITE));
if(fileHandle == SYS_FS_HANDLE_INVALID)
{
SYS_DEBUG_PRINT(SYS_ERROR_WARNING, "FileOpen Error\r\n");
return;
}
//ファイル書き込み
res= SYS_FS_FileWrite(fileHandle, hello, sizeof(hello));
if(res!= -1) //OK
{
SYS_DEBUG_PRINT(SYS_ERROR_WARNING, "File Write OK\r\n",);
}
else//NG
{
SYS_DEBUG_PRINT(SYS_ERROR_WARNING, "FileWrite NG\r\n");
return;
}
if(fileHandle == SYS_FS_HANDLE_INVALID)
{
SYS_DEBUG_PRINT(SYS_ERROR_WARNING, "FileOpen Error\r\n");
return;
}
//ファイル書き込み
res= SYS_FS_FileWrite(fileHandle, hello, sizeof(hello));
if(res!= -1) //OK
{
SYS_DEBUG_PRINT(SYS_ERROR_WARNING, "File Write OK\r\n",);
}
else//NG
{
SYS_DEBUG_PRINT(SYS_ERROR_WARNING, "FileWrite NG\r\n");
return;
}
//ファイルクローズ
SYS_FS_FileClose(fileHandle);
マウントからファイル操作、ファイルクローズまでの一連の流れは上記の通りです。
ディレクトリを生成する場合は
SYS_FS_DirectoryMake(dirname);
でdirnameに文字列を渡すことでフォルダの生成ができます。
生成したフォルダに移動する場合は
SYS_FS_DirectoryChange(dirname);
でdirnameに文字列を渡すことでそのフォルダに移動します。
逆にルートフォルダに戻る場合は
SYS_FS_DirectoryChange("/");
でルートフォルダに戻ることが可能です。
FILE SYSTEMの設定で「Enable exFAT ~」にチェックを入れることで32GB以上のSDカードに対応できますが、そのままではビルドに失敗します。ff.hで「#error exFAT feature wants C99 or later」のエラーが発生します。XC32コンパイラはexFATで使用するint64等の変数定義に対応していますが、XC32内でstdバージョン定義がされていないようです。
ff.hの37行目に
#define __STDC_VERSION__ 199902L
を追記して強制的に定義を変更します。
ファイルシステムの時刻がデフォルトは固定となっているため、RTC機能等を実装している場合はapp.cやmain.c等のユーザー側で下記の関数を追加することでファイル生成時やフォルダ生成時に日時が反映されます。なお、GetRtcDateTimeは自作の関数で必要に応じて外付けのRTC等から日時を取得する関数を実装してください。
DWORD get_fattime(void)
{
SYS_FS_TIME time;
time.packedTime = 0;
{
SYS_FS_TIME time;
time.packedTime = 0;
uint8_t year, month, day, hour, min, sec;
GetRtcDateTime( &year, &month, &day, &hour, &min, &sec);
// All FAT FS times are calculated based on 0 = 1980
time.discreteTime.year = (2000+ year - 1980);
time.discreteTime.month = month;
time.discreteTime.day = day;
time.discreteTime.hour = hour;
time.discreteTime.minute = min;
time.discreteTime.second = sec;
GetRtcDateTime( &year, &month, &day, &hour, &min, &sec);
// All FAT FS times are calculated based on 0 = 1980
time.discreteTime.year = (2000+ year - 1980);
time.discreteTime.month = month;
time.discreteTime.day = day;
time.discreteTime.hour = hour;
time.discreteTime.minute = min;
time.discreteTime.second = sec;
return (time.packedTime);
}
}
設定によってはすんなりビルドが通らない等ありましたが、比較的簡単にPIC32マイコンにSDカードを接続して読み書きすることができました。その他の注意点としてSDカードの読み書きとconsoleを有効にしただけでプログラムメモリ120kB程度(最適化レベル1)が既に使用済となりました。SDカードの読み書きをする場合は256kB以上のプログラムメモリが大きなPIC32マイコンを選択する必要があります。