| 
/*******************(abc914-18857.c)***
 *  SDカードの読み書き   [秋月版]
 *  (EUSART割り込み有り)
 ***************************************/
#include "mcc_generated_files/mcc.h"
#include <stdio.h>
#include <string.h>
#include "myProject.h"
//--- File Systme 変数
FRESULT  result;                                // FatFs処理結果
FATFS    drive;                                 // ドライブ番号、ex: "0:"
FIL      file;                                  // FatFsオブジェクトのポインタ
		
//--- アプリ変数
char     FilNam[16] = "LOGDATA.TXT";
uint16_t Length[2];                             // 送受信用文字数格納配列
char     Buffer[80];  	                        // データ受信用バッファー
char     Msg[40];      	                        // コメント等送信用文字列
uint8_t  tFlag;                                 // タイマーフラグ
uint16_t Counter;                               // タイマーカウンタ
//---- EUSART用変数
char    RBuf[BFSIZE];                           // シリアル受信バッファー
uint8_t SFlg;                                   // シリアル受信フラグ
/***************************************
 *  タイマ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 ct = 10;
    FRESULT res;
    do{
        res = f_mount(&drive,"0:",1);     
        EUSART_Write('.');
    }while((res != FR_OK) && ct--);             // 10回まで試みる
    if(res != FR_OK){                           // マウント失敗なら
        US_Puts("** SD Not Mounted !!");
    }else{
        US_Puts("SD Mount OK!");
        LED_SetHigh();
    }
    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 SD_cmd_F(char *str){
    size_t i,n;
    n = strlen(str);
    if(n > 1){
        if(n > 12) n = 12;
        for(i = 0; i < n; i++)
            FilNam[i] = str[i+1];
//      strncpy(FilNam,str+1,n);
        FilNam[n]=0;
    }
    sprintf(Msg,"NewFileName = %s\n",FilNam);
    US_Puts(Msg);
}
/***************************************
 *  メイン関数
 ***************************************/
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(SFlg){                                   // 受信ありの場合
            cmd = RBuf[0];  
            sprintf(Msg,"Input = %s",RBuf);
            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 
                case 'F':   SD_cmd_F(RBuf); break;  // ファイル名の指定
                default:    US_Puts("???"); break; 
            }
            SFlg = 0;
        }
    }
}
/******  End of File ******/
 |