File System Auto Mountでの
SDカード抜き差し

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


 File System のマウントに関して、MHCのデフォルトはAuto Mountになっていません。アプリケーションの作成はAuto Mountの方が簡単です。 SDカード抜き差し、ファイルオープン/クローズの簡単な例を紹介します。





<仕様>
・HarmonyのFile System Auto Mountに係るライブラリ関数を初期化の段階で組み込む。
・File Systemがマウントされている場合は LEDを点灯し 非マウントの場合はLEDを消灯させる。
・SDカードが挿入され、File Systemがマウントされたら、/mnt/myDrive1ドライブのルートディレクトリのファイル名"myTestData.txt"を書き込みモードで開く。 ファイルが存在しない場合は、新規作成する。
・ファイルを開いた後には速やかに開いたファイルを閉じる。
・ファイルを閉じた回数をカウントする。
・ファイルを閉じたら、キャラクタ液晶に以下を表示する。
 1行目: "FileOpen_w OK !! "
 2行目: "Num0=XX"

   (注) XXはファイルを閉じた回数とする。

・SDカードを抜き差しした場合
 ➀ SDカードが挿入されるとLEDが点灯し
 ➁ SDカードを抜くとLEDが消灯すること。
   尚、LEDの挿入はLEDが消灯を目視確認後行うこと。
    
・SDカード挿入検出は使用しないこと。 



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

 <外観1>
 PIC32MZ評価ボード(→購入方法)を使った実験品の外観です。 PIC32MZ評価評価ボードにmikro BUS評価ボード(→購入方法)が取り付けられています。 mikro BUS評価ボードには、本テーマと関係ない部品が多々実装されています。
 mikro BUS評価ボードのmikro BUS コネクタCN5には、mikroElectronika(株)のmicro SD clickが実装されています。


<外観2>
 mikro BUS評価ボードのmikro BUSコネクタCN5にはmikro BUS 用 ユニバーサルキバン(→購入方法に 秋月電子の マイクロSDカードスロット DIP化キット(通販コード K-05488)をハンダ付けしたキバンが実装されています。
  




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

     キャラクタ液晶表示
マイクロSDカードを
3回脱着した時
 ・スタンダードSDカードの場合は、カードスロットによってはマウントに失敗し、挿入が検出されない場合が時々あるなど不安定でした。(スタンダードSDはサポート外?)





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

 ■ MHC設定

   Options

項目  ①Configuration
Device & Project Configuration
  > PIC32MZ2048 Device Configuration 
➁SPI設定 1
Harmony Framework Configuration > Drivers
 > SPI
③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 SPI Driver? チェックを入れる
 SPI Module ID: SPI_ID_6 
Clock Mode:
  DRV_SPI_CLOCK_MODE_IDLE_LOW_EDGE_FALL

デフォルトからの変更要領:
 □Use SD card Driver? チェックを入れる
 Chip Select Port: PORT_CHANNEL_C
 Chip Select Port Bit: PORTS_BIT_POS_15
項目 ④FileSystem設定 
Harmony Framework Configuration >
 > SysTem Service > FileSystem 
⑥システムサービス > タイマ
Harmony Framework Configuration >
 > SysTem Service > Timer
⑦Timer設定 
Harmony Framework Configuration > Drivers
 > Timer
MHC
備考 デフォルトからの変更要領:
 □Use File System Service? チェックを入れる
 □Use File System Auto Mount Feature? チェックを入れる
システムサービスのタイマはファイルシステムの中で使われています。 デフォルトからの変更要領:
 □Use Timer Driver? チェックを入れる



■ Pin Settings

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



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



■ app.cに、青字部分を追加します。 

①インクルードファイルを追加します。stdio.hがないと、sprintf( )がコンパイラのバージョンによってコンパイルで警告となることが
  あります。 
  #include "stdio.h"


② 所要の変数、遅延関数を宣言、定義します。
  char Buf[32];
  int delay_Clock = 200000000;
  APP_DATA appData;
  SYS_FS_HANDLE my_fileHandle; //ファイルハンドル
  bool Flag_SdConnected;
  int Num0; //SDカード脱着回数

  void delay_us(volatile unsigned int usec) //1μsec遅延
  {
    volatile int count;

    count = (int)(delay_Clock/20000000)*usec;
  ……
  ……


 APP_SYSFSEventHandler( )はSDカードのマウント有無を調べるコールバック関数です。ファイルシステムのマウントに係る イベントが発生するとこの関数が呼ばれます。,マウントイベントが発生したらどのメディアがマウントされたかチェックを実行します。 "/mnt/myDrive1"であればSDカードです。LEDを点灯します。
 同様にアンマウントイベントが発生したらどのメディアがアンマウントされたかチェックします。"/mnt/myDrive1"であればSDカードです。LEDを消灯します。

  void APP_SYSFSEventHandler(SYS_FS_EVENT event, void * eventData, uintptr_t context) //SDカードのマウント有無を調べるコールバック関数
  {
    switch(event)
    {
      /* If the event is mount then check which media has been mounted */
      case SYS_FS_EVENT_MOUNT:
        if(0 == strcmp((const char *)eventData,"/mnt/myDrive1"))
        {
          Flag_SdConnected = true;
          LATDbits.LATD0 = 1;
        }

        break;

      /* If the event is unmount then check which media has been unmount */
      case SYS_FS_EVENT_UNMOUNT:
        if(0 == strcmp((const char *)eventData,"/mnt/myDrive1"))
        {
          Flag_SdConnected = false;
          LATDbits.LATD0 = 0;
        }

        break;

      case SYS_FS_EVENT_ERROR:
        break;

      default:
      break;
    }
  }


④App_SdMtCheck( )はSDカードのマウント有無を調べるコールバック関数をセットする関数です。
  void APP_SdMtCheck(void)
  {
    /* Set the event handler*/
    SYS_FS_EventHandlerSet(APP_SYSFSEventHandler, (uintptr_t)NULL); //SDカードのマウント有無を調べるコールバック関数をセット
  }


 この関数はAPP_Tasks( )の中で実行されます。SDカードが接続されたらファイルをオープンし、すぐにファイルをクローズします。その後ファイルオープンの回数をインクリメントし、キャラクタ液晶に"FileOpen_w OK !! "とファイルオープン回数を表示します。 そしてアイドルステートに移行してSDカードが抜かれることを監視します。

  void APP_SdTasks(void)
  {
    SYS_FS_RESULT result = SYS_FS_RES_FAILURE;
    /* The application task state machine */
    switch(appData.state)
    {
      case APP_OPEN_FILE:
        /* Wait until MSD is mounted and file search is sucessful */
        if(Flag_SdConnected == true)
        {
          // ファイルを書き込みモードでオープン 但しファイルがなければ新規ファイル作成

          my_fileHandle = SYS_FS_FileOpen("myTestData.txt", (SYS_FS_FILE_OPEN_WRITE));
          if(my_fileHandle == SYS_FS_HANDLE_INVALID)
          { //ファイルオープンエラーの場合
            lcd_cmd(0x80); //1目の先頭へ
            sprintf(Buf,"FileOpen_w failed ");//
            lcd_str(Buf); //液晶表示
            while(1);
          }
          else
          {
            SYS_FS_FileClose(my_fileHandle);

            Num0++;

            lcd_cmd(0x80); //1目の先頭へ
            sprintf(Buf,"FileOpen_w OK !! "); //液晶に"W_ModeOpen OK" を表示
            lcd_str(Buf); //液晶表示
            lcd_cmd(0xC0); //2行目の先頭へ
            sprintf(Buf,"Num0=%d ", Num0); //ysNum:SDカード脱着回数
            lcd_str(Buf); // 開始メッセージ2行目表示

            appData.state = APP_IDLE;
          }
        }
        break;

      case APP_IDLE:
        if(Flag_SdConnected == false) //SDカードを抜くと 挿入検出待ちモードに移行する。
        {
          appData.state = APP_OPEN_FILE;
        }
        else
        {
        }
        break;

      default:
        break;
    }
  }



⑥APP_Tasks( )の中でメインタスクの前に APP_SdMtCheck( )関数でSDカードのチェック脱着チェックを実行します。 

  APP_SdMtCheck(); //SDカードのマウントチェック
  APP_SdTasks(); //SDカードのメインタスク



以下、app.c