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