//--------------------------------------------------------------------
// SD試験 : Userスイッチが押されたときファイルにデータを書き込む。
//--------------------------------------------------------------------
// 引数:
// uint8_t *puint8_JobNum : 処理番号を格納する変数のポインタ
// 戻り値:
// -1 : 処理中
// 0 : OK
// 1 : NG
//--------------------------------------------------------------------
int16_t Test_SD(uint8_t *puint8_JobNum)
{
static uint8_t STC_uint8_JobNum_USW; // User Switch検出処理番号
static uint8_t STC_uint8_PathSDC[32];
static uint8_t STC_uint8_DataSDC[16];
unsigned int uint_WriteLength;
DWORD dword_WriteStart;
FRESULT enum_FRESULT;
UINT uint_WriteByte;
int16_t int16_Return;
uint32_t uint32_Total;
uint32_t uint32_Free;
int16_t int16_I;
uint8_t uint8_ReadData[16];
unsigned int uint_ReadLength;
switch(*puint8_JobNum){
case 0:
STC_uint8_JobNum_USW = 0; // User Switch検出処理番号初期化
//----------------------------------------------------------
// FatFsの関数との関連付け
//----------------------------------------------------------
int16_Return = (int16_t)FATFS_LinkDriver(&SD_Driver, SDPath);
if(int16_Return != 0){
while(1);
}
//----------------------------------------------------------
// 容量取得 : Debug
//----------------------------------------------------------
int16_Return = GetSpaceSDC(&uint32_Total, &uint32_Free);
if(int16_Return == 1){
// NG
while(1);
}
//----------------------------------------------
// User Switch入力ピン初期化
//----------------------------------------------
def_M_Init_USW();
(*puint8_JobNum)++; // 処理番号をインクリメント
// : 次の処理番号に移行する。 : case 1:
int16_Return = -1; // 処理中
break;
case 1:
//-----------------------------------------------------------
// User Switch検出
//-----------------------------------------------------------
// 引数:
// uint8_t *puint8_JobNum : 処理番号が格納された変数のポインタ
// 戻り値:
// -1 : 検出なし
// 0 : 検出あり
//-----------------------------------------------------------
int16_Return = def_M_Detect_USW(&STC_uint8_JobNum_USW);
if(int16_Return == -1){
// 検出なし
break; // 処理番号維持 : 処理継続 : case 1: をループ
}
(*puint8_JobNum)++; // 処理番号をインクリメント
// : 次の処理番号に移行する。 : case 2:
int16_Return = -1; // 処理中
break;
case 2:
//--------------------------------------------------------
// SDカード書き込み
//--------------------------------------------------------
//----------------------------------------------------------
// folder および file 存在チェック
//----------------------------------------------------------
// 標準 : \
// をセット
strcpy((char *)STC_uint8_PathSDC, "TEST_SD");
// check folder
int16_Return = MakeDirectorySDC(STC_uint8_PathSDC);
if(int16_Return != 0){
*puint8_JobNum = 0;
int16_Return = 1; // NG
break;
}
// \ をセット
strcpy((char *)STC_uint8_PathSDC, "TEST_SD\\TEST_SD.TXT");
//----------------------------------------------------------
// Write file
//----------------------------------------------------------
uint_WriteLength = 13; // 書き込みデータ数をセット
// 論理ドライブのワークエリア登録
f_mount(&GLB_struct_FATFS, "", 0);
//-------------------------------------------------------
// 書き込みデータ作成
//-------------------------------------------------------
int16_Return = Make_WriteData(uint_WriteLength,
STC_uint8_PathSDC,
&dword_WriteStart,
STC_uint8_DataSDC);
if(int16_Return != 0){
f_mount(defNULL, "", 0);
*puint8_JobNum = 0;
int16_Return = 1; // NG
break;
}
//----------------------------------------------------
// ファイルにデータを書き込む。
//----------------------------------------------------
// Open File
enum_FRESULT = f_open(&GLB_struct_FIL,
(char *)STC_uint8_PathSDC,
FA_OPEN_ALWAYS | FA_WRITE);
if(enum_FRESULT != FR_OK){
f_mount(defNULL, "", 0);
*puint8_JobNum = 0;
int16_Return = 1; // NG
break;
}
// ファイルサイズをチェック
if(dword_WriteStart > 0){
// ファイルサイズが 0 でない場合。
//----------------------------------------------------
// データの最終位置にする。
//----------------------------------------------------
int16_Return = SeekFile((uint32_t)dword_WriteStart);
if(int16_Return != 0){
f_close(&GLB_struct_FIL);
f_mount(defNULL, "", 0);
return(1); // NG
}
}
// ファイルにデータを書き込む。
enum_FRESULT = f_write(&GLB_struct_FIL,
(char *)STC_uint8_DataSDC,
uint_WriteLength, &uint_WriteByte);
if(enum_FRESULT != FR_OK){
f_close(&GLB_struct_FIL);
f_mount(defNULL, "", 0);
*puint8_JobNum = 0;
int16_Return = 1; // NG
break;
}
// 一旦、ファイルをクローズする。
f_close(&GLB_struct_FIL);
// 読み込みバッファクリア
for(int16_I = 0; int16_I < (int16_t)uint_WriteLength; int16_I++){
uint8_ReadData[int16_I] = 0;
}
//----------------------------------------------------
// 書き込んだデータを読み込んで比較する。
//----------------------------------------------------
// Open File
enum_FRESULT = f_open(&GLB_struct_FIL,
(char *)STC_uint8_PathSDC,
FA_READ);
if(enum_FRESULT != FR_OK){
f_mount(defNULL, "", 0);
*puint8_JobNum = 0;
int16_Return = 1; // NG
break;
}
//----------------------------------------------------
// 書き込む前の位置にする。
//----------------------------------------------------
int16_Return = SeekFile((uint32_t)dword_WriteStart);
if(int16_Return != 0){
f_close(&GLB_struct_FIL);
f_mount(defNULL, "", 0);
*puint8_JobNum = 0;
int16_Return = 1; // NG
break;
}
// データ読み込み
enum_FRESULT = f_read(&GLB_struct_FIL,
(char *)uint8_ReadData,
uint_WriteLength,
&uint_ReadLength);
if(int16_Return != 0){
f_close(&GLB_struct_FIL);
f_mount(defNULL, "", 0);
*puint8_JobNum = 0;
int16_Return = 1; // NG
break;
}
// 書き込みデータと読み込みデータの比較
for(int16_I = 0; int16_I < (int16_t)uint_WriteLength; int16_I++){
if(STC_uint8_DataSDC[int16_I] != uint8_ReadData[int16_I]){
f_close(&GLB_struct_FIL);
f_mount(defNULL, "", 0);
*puint8_JobNum = 0;
int16_Return = 1; // NG
break;
}
}
// ファイルをクローズする。
f_close(&GLB_struct_FIL);
// 論理ドライブのワークエリア解除
f_mount(defNULL, "", 0);
*puint8_JobNum = 1; // User Switch検出処理に移行する。: case 1:
int16_Return = 0; // OK
break;
default:
*puint8_JobNum = 0;
int16_Return = -1;
break;
}
return(int16_Return);
}