/*******************(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 ******/
|