/*******************(abc918-18857.c)[秋月slot版]***
* SDカードの読み書きと文字表示 *
**************************************************/
#include "mcc_generated_files/mcc.h"
#include <stdio.h>
#include <string.h>
#include <ctype.h>
#include "myProject.h"
#include "QT095B.h"
#include "spi_Mem0.h"
#define OLED_BF_SIZE 80
enum { NON = 0, TXT, CSV, BIN = 8, BMP };
//--- File Systme 用変数
FRESULT result; // FatFs処理結果
FATFS drive; // FatFsオブジェクトへのポインタ
FIL file; // ドライブ番号、ex: "0:"
//--- Fileアプリ用変数
char FilNam[16] = "FLOWER.BMP";
uint8_t F_ext = BMP; // 1:TXT, 2:CSV, 8:BIN, 9:BMP
uint16_t Length[2]; // 送受信用文字数格納配列
char Buffer[192]; // データ受信用バッファー
char Msg[40]; // コメント等送信用文字列
char msg2[]="=== SD Test ===";
//--- タイマーカウンター用変数
uint8_t tMode = 1; // タイマカウンタ表示モードフラグ
uint8_t tFlag; // タイマーフラグ
uint16_t Counter; // タイマーカウンタ
//---- EUSART用変数
char RBuf[EU_BFSIZE];
uint8_t SFlg;
//---- OLED用変数
uint8_t CrtLn = 0; // 現在行(ページ)位置
uint8_t gBf[OLED_BF_SIZE]; // グラフィック表示用
char msg1[] = "Test QT095B";
/***************************************
* タイマ0 Callback関数 (1秒周期割り込み)
***************************************/
void TMR0_Process(void){
tFlag = 1; // フラグセット
}
/***************************************
* 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){ // マウント失敗なら
EU_Puts("** SD Not Mounted !!");
}else{
EU_Puts("SD Mount OK!");
LED_SetHigh();
}
return res;
}
//--- SDカードのクローズとアンマウント
void SD_All_Close(void){
f_close(&file); // ファイルクローズ
f_mount(0, "0:", 0); // アンマウント
EU_Puts("closed & Un_Mounted");
LED_SetLow();
}
/***************************************
* コマンド処理
***************************************/
//--- SDカードテストコマンド (兼テンプレート)
void SD_cmd_T(void){
EU_Puts("Start Command T");
gCS_SetHigh();
if(SD_Mount() == FR_OK){ // SDマウント
__delay_ms(2000);
f_mount(0, "0:", 0); // アンマウント
EU_Puts("Un_Mounted");
}
LED_SetLow();
}
//--- SDカードから読込コマンド
void SD_cmd_R(void){
FRESULT res;
if(F_ext != TXT){ // テキストファイルでないなら
sprintf(Msg,"%s is not Text File!",FilNam);
EU_Puts(Msg);
return;
}
EU_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);
EU_Puts(Msg);
do{
f_read(&file, Buffer, 64, (UINT *)Length); // SDから読込む
Buffer[Length[0]] = 0;
EU_Puts(Buffer);
}while(Length[0]!=0);
}else{
sprintf(Msg,"** Can't open %s !!",FilNam);
EU_Puts(Msg);
}
SD_All_Close(); // ファイルクローズ&アンマウント
}
}
//--- SDカードへデータ書込コマンド
void SD_cmd_W(void){
FRESULT res;
EU_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);
EU_Puts(Msg);
sprintf(Msg, "%07d,", Counter);
f_write(&file, Msg, 8, (UINT *)Length); // SDへ書込
EU_Puts(Msg);
}else{
sprintf(Msg,"** Can't open %s !!",FilNam);
EU_Puts(Msg);
}
SD_All_Close(); // ファイルクローズ&アンマウント
}
}
//--- ファイル名セットコマンド
void SD_cmd_F(char *str){
size_t i,n;
char *p;
n = strlen(str);
if(n > 1){
if(n > 12) n = 12;
for(i = 0; i < n; i++)
FilNam[i] = (char)toupper(str[i+1]);
FilNam[n]=0;
}
p = strchr(FilNam,'.');
if (strncmp(p+1,"TXT",3)==0) F_ext = TXT;
else if(strncmp(p+1,"CSV",3)==0) F_ext = CSV;
else if(strncmp(p+1,"BIN",3)==0) F_ext = BIN;
else if(strncmp(p+1,"BMP",3)==0) F_ext = BMP;
else F_ext = NON;
sprintf(Msg,"NewFileName = %s: %d\n",FilNam,F_ext);
EU_Puts(Msg);
}
//--- SDカードから読込コマンド
void SD_cmd_D(void){
FRESULT res;
uint8_t i, n;
uint32_t adr = 0x40000;
EU_Puts("Start Command D");
if(SD_Mount() == FR_OK){
res = f_open(&file, FilNam, FA_READ); // ファイルオープン
if(res == FR_OK){
sprintf(Msg,"Open %s",FilNam);
EU_Puts(Msg);
do{
f_read(&file, Buffer, 192, (UINT *)Length); // SDから読込む
n = (uint8_t)Length[0];
SSPEN_ON();
for(i = 0; i < n; i++){
SPI_Mem_Write(adr++, Buffer[i]); // ROMに書き込む
}
// SPI_Mem_NWrite(adr,Buffer,n);
// adr += n;
EUSART_Write('.'); // 書込中を表示
SSPEN_OFF();
}while(Length[0]!=0);
EU_Write_CR();
}else{
sprintf(Msg,"** Can't open %s !!",FilNam);
EU_Puts(Msg);
}
SD_All_Close(); // ファイルクローズ&アンマウント
}
}
//--- メモリからBMPファイル読込んで表示コマンド
void SD_cmd_V(void){
uint8_t c[2];
uint16_t j;
uint32_t adr = 0x40000 + 138; // ヘッダー部をオフセット
SSPEN_ON();
gSetMode(COLOR64K2,0); // 64k(16ビット)カラーに
gRstArea();
gDC_SetHigh(); // Select Data
// 全画面を対象に
for(j=0; j<6144; j++){
c[0]= SPI_Mem_Read(adr++); // ROMから読込
c[1]= SPI_Mem_Read(adr++);
gCS_SetLow(); // Select gCS
SPI_EXCHG(c[1]); // OLEDに書込
SPI_EXCHG(c[0]);
gCS_SetHigh();
}
SSPEN_OFF();
}
//--- 文字表示コマンド
void SD_cmd_P(char *str){
uint8_t xpos;
SSPEN_ON();
gSetMode(COLOR256,0); // 256(8ビット)カラーに
if(strlen(str)==1){
gOLED_ZchrX( 2,2,0x692C,gRGB256(7,7,0),2,0); // '薔'
gOLED_ZchrX(78,2,0x692F,gRGB256(7,7,0),2,0); // '薇'
}else{
xpos = gOLED_strX(20,54,str+1,gRGB256(0,7,7),0);
}
gSetMode(COLOR256,0); // アドレス増分を横に
gRstArea(); // 全画面を対象に
SSPEN_OFF();
}
//--- 画像表示テストコマンド
void QT_cmd_G(char *str){
SSPEN_ON();
if(strlen(str) > 1){
switch(str[1]){
case '1': QT095B_Test1(); break;
case '2': QT095B_Test2(); break;
case '3': QT095B_Test3(); break;
}
}else{
QT095B_Test1();
}
SSPEN_OFF();
}
//--- 画面表示消去コマンド
void QT_cmd_C(void){
SSPEN_ON();
gOLED_Clr(0,0,95,63);
SSPEN_OFF();
}
//--- (全半角)漢字表示コマンド
void sM_cmd_K(char *str){
SSPEN_ON();
gOLED_strX(0,0,str,gRGB256(7,7,0),0);
spiMem_cmd_K(str);
SSPEN_OFF();
}
//--- Jisコード漢字表示コマンド
void sM_cmd_L(char *str){
SSPEN_ON();
gOLED_strX(0,0,str,gRGB256(7,7,0),0);
spiMem_cmd_L(str);
SSPEN_OFF();
}
//--- メモリデータダンプ表示コマンド
void sM_cmd_U(char *str){
SSPEN_ON();
gOLED_strX(0,0,str,gRGB256(7,7,0),0);
spiMem_cmd_U(str);
SSPEN_OFF();
}
//--- SSPステータス表示
void ck_SSP(void){
uint8_t a,b,c;
a = SSP2STAT;
b = SSP2CON1;
c = SSP2CON3;
sprintf(Msg,"%02X %02X %02X",a,b,c);
EU_Puts(Msg);
}
/***************************************
* メイン関数
***************************************/
void main(void){
char cmd; // 受信コマンド文字
SYSTEM_Initialize();
SSPEN_ON();
SSD1331_Init(); // OLED初期化
SSPEN_OFF();
// タイマ0 Callback関数定義
TMR0_SetInterruptHandler(TMR0_Process);
// 割り込み許可
INTERRUPT_GlobalInterruptEnable();
INTERRUPT_PeripheralInterruptEnable();
EU_Puts(msg2);
SSPEN_ON();
gOLED_strX(0,0,msg2,gRGB256(7,7,7),1);
SSPEN_OFF();
//======= メインループ =========
while(1){
// 1秒周期の処理
if(tFlag == 1){ // フラグオンの場合
LED_Toggle();
tFlag = 0; // フラグリセット
if(tMode == 0){
sprintf(Msg,"Counter = %05d",Counter++);
EU_Puts(Msg); // 送信
}
}
// コマンド処理
if(SFlg){ // 受信ありの場合
cmd = RBuf[0];
sprintf(Msg,"Input = %s\n",RBuf);
EU_Puts(Msg);
switch(cmd){
case 'X': tMode ^= 1; break; // カウンタ表示ON/OFF
case 'C': QT_cmd_C(); break; // 画面消去
case 'G': QT_cmd_G(RBuf); break; // グラフィックテスト
case 'T': SD_cmd_T(); break; // SDマウントテスト
case 'R': SD_cmd_R(); break; // SDからデータ読出し
case 'W': SD_cmd_W(); break; // SDにデータを書込む
case 'F': SD_cmd_F(RBuf); break; // ファイル名セット
case 'D': SD_cmd_D(); break; // データダウンロード
case 'V': SD_cmd_V(); break; // グラフィック描画
case 'P': SD_cmd_P(RBuf); break; // 文字表示テスト
case 'U': sM_cmd_U(RBuf); break; // 16進数でダンプ
case 'K': sM_cmd_K(RBuf); break; // 漢字表示(アドレズ)
case 'L': sM_cmd_L(RBuf); break; // 漢字表示(コード)
default: EU_Puts("???"); break; // 無効なコマンド
}
SFlg = 0;
}
}
}
/****** End of File ******/
|