/*******************(abc914-18857a.c)***
 *  SDカードの読み書き   [改良版]
 *  (EUSART割り込み有り)
 ***************************************/
#include "mcc_generated_files/mcc.h"
#include <stdio.h>
//--- File Systme 変数
FRESULT  result;                    // FatFs処理結果
FATFS    drive;                     // ファイルsysオブジェクト
FIL      file;                      // ファイル構造体
		
//--- アプリ変数
char     FilNam[13] = "LOGDATA.TXT";// ファイル名(8.3)
uint16_t Length[2];                 // 送受信用文字数格納配列
char     Buffer[80];                // データ受信用バッファー
char     Msg[40];                   // コメント等送信用文字列
uint8_t  tFlag;                     // タイマーフラグ
uint16_t Counter;                   // タイマーカウンタ
/***************************************
 *  タイマ0 Callback関数 (1秒周期割り込み)
 ***************************************/
void TMR0_Process(void){
    tFlag = 1;                      // フラグセット
}
/***************************************
 *  文字列バッファ出力関数
 ***************************************/
void StrWrite(char * str){
    while(*str != 0){               // '\0'(文字列終り)まで繰り返し
        EUSART_Write(*str++);       // 1文字バッファに出力(送信)
    }
}
//--- EUSARTへ文字列送信(改行付)
void US_Puts(char * str){
    StrWrite(str);
    EUSART_Write('\n');
}
/***************************************
 *  SDカード用汎用関数
 ***************************************/
//--- SDカードのマウント
FRESULT SD_Mount(void){
    uint8_t i = 0;
    FRESULT res;
    do{
        res = f_mount(&drive,"0:",1);     
        i++;
        EUSART_Write('-');
    }while((res != FR_OK) && (i < 10));    // 10回まで試みる
    
    if(res != FR_OK){                      // マウント失敗なら
        US_Puts("** SD Not Mounted !!");
    }else{
        US_Puts("SD Mount OK!");
        LED_SetHigh();
//        __delay_ms(100);
    }
    return res;	
}
//--- SDカードのクローズとアンマウント
void SD_All_Close(void){
    f_close(&file);                         // ファイルクローズ
    f_mount(0, "0:", 0);                    // アンマウント
    US_Puts("closed & Un_Mounted"); 
    LED_SetLow();	
}
/***************************************
 *  コマンド処理
 ***************************************/
//--- SDカードテストコマンド (兼テンプレート)
void SD_cmd_T(void){
    US_Puts("Start Command T");
    if(SD_Mount() == FR_OK){                // SDマウント
    //  set custom function  ------   ここから
        __delay_ms(2000);
    //  ---------------------------   この間にユーザプログラムを記述
        f_mount(0, "0:", 0);                // アンマウント
        US_Puts("Un_Mounted");
    }
    LED_SetLow();
}
//--- SDカードから読込コマンド
void SD_cmd_R(void){
    FRESULT res;
    US_Puts("Start Command R");
    if(SD_Mount() == FR_OK){
        res = f_open(&file, FilNam, FA_READ);       // ファイルオープン
        if(res == FR_OK){
            sprintf(Msg,"Open %s",FilNam);
            US_Puts(Msg);
            do{
                f_read(&file, Buffer, 64, (UINT *)Length); // SDから読込む
                Buffer[Length[0]] = 0;
                US_Puts(Buffer);
            }while(Length[0]!=0);
        }else{
            sprintf(Msg,"** Can't open %s !!",FilNam);
            US_Puts(Msg);           
        }
        SD_All_Close();             // ファイルクローズ&アンマウント
    }
//    LED_SetLow();
}
//--- SDカードへデータ書込コマンド
void SD_cmd_W(void){
    FRESULT res;
    US_Puts("Start Command W");
    if(SD_Mount() == FR_OK){
        res = f_open(&file, FilNam, FA_WRITE | FA_OPEN_APPEND); // ファイルオープン
        if(res == FR_OK){
            sprintf(Msg,"Open %s",FilNam);
            US_Puts(Msg);
            sprintf(Msg, "%07d,", Counter);
            f_write(&file, Msg, 8, (UINT *)Length);   // SDへ書込
            US_Puts(Msg);
        }else{
            sprintf(Msg,"** Can't open %s !!",FilNam);
            US_Puts(Msg);           
        }
        SD_All_Close();       // ファイルクローズ&アンマウント
    }
//    LED_SetLow();
}
/***************************************
 *  メイン関数
 ***************************************/
void main(void){
    uint8_t tMode = 0;                  // タイマカウンタ表示モードフラグ
    char   cmd;                         // 受信コマンド文字
    
    SYSTEM_Initialize();
  // タイマ0 Callback関数定義
    TMR0_SetInterruptHandler(TMR0_Process);
    
    US_Puts("\n==== SD Test ====");
    
  // 割り込み許可
    INTERRUPT_GlobalInterruptEnable();
    INTERRUPT_PeripheralInterruptEnable();
    
  //======= メインループ =========
    while(1){
      // 1秒周期の処理
        if(tFlag == 1){                                 // フラグオンの場合
            LED_Toggle();
            tFlag = 0;                                  // フラグリセット
            if(tMode == 0){
                sprintf(Msg,"Counter = %05d",Counter++);   // カウント値編集
                US_Puts(Msg);                           // 送信
            }
        }
      // コマンド処理
        if(EUSART_is_rx_ready()){                       // 受信ありの場合
            cmd = EUSART_Read();                        // 1文字受信
            sprintf(Msg,"Input = %c\n",cmd);
            US_Puts(Msg);
            switch(cmd){
                case 'T':   SD_cmd_T();  break;         // SDマウントテスト
                case 'R':   SD_cmd_R();  break;         // SDからデータ読出し
                case 'W':   SD_cmd_W();  break;         // SDにデータを書込む
                case 'X':   tMode = 1;   break;         // カウンタ表示OFF
                case 'C':   tMode = 0;   break;         // カウンタ表示ON
                default:    US_Puts("???"); break; 
            }
        }
    }
}
/******  End of File ******/
 
 |