2021年10月23日

PIC32マイコンSDカード読み書き

今回はPIC32MX270F256BをターゲットにMPLAB X v5.45+Harmony3+XC32 v2.50を使用して、PIC32マイコンにSDカードを接続して読み書きする方法について紹介します。

Harmony3を用いることでSPI接続で簡単にSDカードの読み書きを実装することが可能です。Harmony3のプロジェクトグラフは下記の通りです。

sd_spi1.jpg

今回はSPI1をSDカード用に割り当てました。

sd_spi4.jpg

SPI1の設定はデフォルトのままで問題ありません。

sd_spi3.jpg

SD Card設定ではSDカードのチップセレクトをどのポートにするか設定します。他の設定はそのままで問題ありません。



sd_spi2.jpg
FILE SYSTEMの設定はそのままで問題ありませんが、32GB以上のSDカードを使用する場合は「Enable exFAT ~」にチェックを入れます。

sd_spi5.jpg

最後に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)
{
  SYS_DEBUG_PRINT(SYS_ERROR_DEBUG, "Mount ERR\r\n",res);
  return;
}
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;
}
//ファイルクローズ
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;
  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;
  return (time.packedTime);
}


設定によってはすんなりビルドが通らない等ありましたが、比較的簡単にPIC32マイコンにSDカードを接続して読み書きすることができました。その他の注意点としてSDカードの読み書きとconsoleを有効にしただけでプログラムメモリ120kB程度(最適化レベル1)が既に使用済となりました。SDカードの読み書きをする場合は256kB以上のプログラムメモリが大きなPIC32マイコンを選択する必要があります。
posted by Crescent at 00:00| Comment(0) | 組込ソフト | このブログの読者になる | 更新情報をチェックする
この記事へのコメント
コメントを書く
お名前:

メールアドレス:

ホームページアドレス:

コメント:

※ブログオーナーが承認したコメントのみ表示されます。