YS電子工作ラボ

ファイル読み書き
(→プロジェクトファイル(Harmony Ver.2.04版 ) ダウンロード
               


SDカードのファイルを読み書きする例を紹介します。 Harmonyでは ロングファイル名が使用できます。


<仕様>
 ・SDカードに ファイルをつくり "Hellow World !!"と書き込み、これを読みだす。
  詳細手順は以下とする。
  ① ファイルシステムをマウントする。
     マウンドできたら キャラクタ液晶に"SD mounted"と表示する。
     マウントできない場合は "SD notMounded"と表示する。
  ② ファイル名"myTestData.txt"のファイルをオープンする。ファイルが存在しない場合は新規作成する。
     成功したら、キャラクタ液晶に"FileOpen_w OK !!"と表示する。
     失敗した場合は "FileOpen_w failed !!"と表示する。
  ③ オープンしたファイルに "Hellow World !!"と書き込む
     成功したら キャラクタ液晶に"Write OK !!"と表示する。
     失敗したら "Write NG !!"と表示する。
  ④ ファイルを閉じる。
  ⑤ ファイル"myTestData.txt"を読み出しモードでオープンする。
     失敗したら"FileOpen_r failed"と表示する。
  ⑥ ファイルを1バイトづつファイルエンドまで読みだす。
  ⑦ 開いているファイルのファイル名を取得する。
  ⑧ ファイルを閉じる。
  ⑨ 読みだした ファイルの内容とファイル名を表示する。

 ・ファイルのフォーマットはFAT32とする。


<回路図> (→ PDFファイル



<外観> PIC32MZ評価ボード(→購入方法)を使った実験品の外観です。



<動作結果> (→ 動画:1080pのHD動画を見ることができます。)

       キャラクタ液晶表示
①起動直後 
②SDカード(ファイルシステム)が
 マウントされているかチェック中 
③SDカード(ファイルシステム)が
 マウント完了
④ファイルを書き込みモードで
 オープン成功
 
⑤ファイルに書き込み成功  
⑥ファイルを読みだしモードで
 オープン成功
  ファイル内容("Hellow World !!")を
 読みだして上段に表示、 下段には
 ファイル名を表示
 


<解説> 記載してある内容は要点だけです。 詳細はプロジェクトファイルを精読願います。
         (以下は、Harmony v2.04 をもとに作成しています。最新のバージョンは異なることがあるかもしれませんので注意してください。)


 ■MHCの設定
  Options

項目 ①Config設定 
Device & Project Configuration
  > PIC32MZ2048 Device Configuration
②FileSystem設定 
Harmony Framework Configuration >
 > SysTem Service > FileSystem
③SD Card設定 
Harmony Framework Configuration > Drivers
 > SD Card
MHC
備考 デフォルトからの変更要領:
 FPLLIDIV: DIV3
 FPLLICLK: PLL_POSC
 POSCMOD: EC

システムクロック周波数: 200MHz
外部OSC: 24MHz
タイマ用ペリフェラルクロック
     周波数(PBCLK3): 100MHz


#pragma config FNOSC = SPLL
#pragma config POSCMOD = EC
#pragma config FPLLIDIV = DIV_3
#pragma config FPLLICLK = PLL_POSC
#pragma config FPLLMULT = MUL_50
#pragma config FPLLODIV = DIV_2 
デフォルトからの変更要領:
 □Use File System Service? チェックを入れる
デフォルトからの変更要領:
 □Use SD card Driver? チェックを入れる
 Chip Select Port: PORT_CHANNEL_B
 Chip Select Port Bit: PORTS_BIT_POS_13
項目 ④SPI設定 1
Harmony Framework Configuration > Drivers
 > SPI
⑤SPI設定 2
Harmony Framework Configuration > Drivers
 > SPI
⑥Timer設定 
Harmony Framework Configuration > Drivers
 > Timer
MHC
備考 デフォルトからの変更要領:
 □Use SPI Driver? チェックを入れる
デフォルトからの変更要領:
 SPI Module ID: SPI_ID_6 
Clock Mode:
  DRV_SPI_CLOCK_MODE_IDLE_LOW_EDGE_FALL


 
デフォルトからの変更要領:
 □Use Timer Driver? チェックを入れる
項目 ⑦システムサービス > 割り込み
Harmony Framework Configuration >
 > SysTem Service > Interrupt
⑧システムサービス > タイマ
Harmony Framework Configuration >
 > SysTem Service > Timer
 
MHC  
備考 システムサービスの割り込みは ファイルシステムの中で使われています。  システムサービスのタイマはファイルシステムの中で使われています。  



  ■ Pin Settings

項目 ⑨ポート設定
MHC
備考 デフォルトからの変更要領:
 RF12/Function: GPIO_IN
        (CD用入力ポート設定)
 RB13/Function: GPIO_OUT
        (CS用出力ポート設定)
 RF13/Function: SDI6
        (SPI6のSDI設定)
 RB15/Function: SDO6
        (SPI6のSDO設定)
 RD15/Function: SCK6
        (SPI6のSCK設定)


■ キャラクタ液晶表示のライブラリ 1lcd_lib_XC32.h と 1lcd_lib_XC32.cを main.cと同じフォルダにコピーして、プロジェクトに追加します。
     (詳細→ キャラクタ液晶表示方法 参照




■ app.cに、青字部分を追加します。
 ① stdio.h、1lcd_lib_XC32.hのインクルード 及び所要の変数を定義します。
    #include "stdio.h"
    #include "1lcd_lib_XC32.h"

    char Buf[17]; //液晶表示バッファー
    ……
    ……


 ② NOPを利用した μsec、msecの遅延関数 delay_us( )、delay_ms( )を定義します。
    void delay_us(volatile unsigned int usec) //1μsec遅延
    {
       volatile int count;

    ……
    ……

 ③ 実際に SDカードを読み書きする関数SD_RW( )を作成します。
    void SD_RW(void) //SDカード 挿入・ライトプロテクトチェック、及び 読み書き
    {
      switch(SdMode)
      ……
      ……


 ④ SDカードが挿入されていて、ファイルシステムがマウントされるまでSYS_FS_Moun( )が実行されます。
    mmcblka1は、SDカードを表します。マウント名(ユーザが任意に命名可)の前に/mnt/は必須です。
    case 0: //カード挿入検出・ライトプロテクトチェック
      if(SYS_FS_Mount("/dev/mmcblka1", "/mnt/myMountName", FAT, 0, NULL) != 0) //SYS_FS_RES_SUCCESS = 0
           //SYS_FS_Mount("/dev/デバイス名", "/mnt/マウント名", ファイルシステムタイプ, Reserved, Reserved)
           // /dev/と/mnt/は、名前の前に必ずつけること
     ……
     ……

 ⑤ ファイルを書き込みモードでオープンします。成功すると戻り値としてファイルハンドルが返されます。ファイルが存在しない
   場合は、新規にファイルが作成されます。
    case 1: // ファイルを書き込みモードでオープン 但しファイルがなければ新規ファイル作成
      fileHandle = SYS_FS_FileOpen("myTestData.txt", (SYS_FS_FILE_OPEN_WRITE));
      if(fileHandle == SYS_FS_HANDLE_INVALID)
    ……
    ……


 ⑥ ファイルに文字列 Hellowを書き込みます。 正常に書き込みが行われると書き込み回数が、失敗すると-1が戻り値として
   返されます。
     case 2: //データの書き込み
      N_Write = SYS_FS_FileWrite(fileHandle, Hellow, sizeof(Hellow));//ファイルにデータ書き込み
      if(N_Write != -1) //正常な場合:書き込み回数が返ってくる
    ……
    ……



 ⑦ 書き込みが終わったらファイルを閉じて、今度は読み出しモードでファイルをオープンします。
    case 3: //読出しファイルオープン
     fileHandle2 = SYS_FS_FileOpen("myTestData.txt", (SYS_FS_FILE_OPEN_READ));
     if(fileHandle2 == -1) //ファイルオープン 失敗の場合
     ……
     ……


 ⑧ ファイルを1バイトづつ、ファイルエンドまでよみだします。
    case 4: //ファイル読出し・表示
      do
      {
        SYS_FS_FileRead(fileHandle2, tempBuf, 1); //1バイトづつ読出し
        eof = SYS_FS_FileEOF(fileHandle2); //EOFチェック
        ……
        ……


 ⑨ オープンしているファイルファンドルのファイル名を取得します。
     SYS_FS_FileNameGet(fileHandle2, str_FileName, 32 ); //ファイル名取得

 ⑩  キャラクタ液晶の1行目に読み出したファイル内容を、また2行目に取得したファイル名を表示します。
    lcd_cmd(0x80); //1目の先頭へ
    sprintf(tempBuf3,"%s ",tempBuf2);
    lcd_str(tempBuf3);
    ……
    ……



以下、app.c