/********************************************************** 7144fsio.h 2006.12.5 RIKIYA SH2_7144F バッファ付きSIO1 送受信動作 /*********************************************************/ #define BUFF_SIZE 256 void sci1_init(unsigned short,unsigned char,unsigned char,unsigned char); char sci1_putchar(char); void sci1_putstr(char *); char sci1_getchar(void); typedef struct { // バッファデータ型構造体宣言 unsigned short remain; // バッファ中の残データ数 unsigned short read; // 書込み位置 unsigned short write; // 読出し位置 char *buff; // 読書きデータ } BUFF; static char rx1buff[BUFF_SIZE]; // 受信データバッファ static char tx1buff[BUFF_SIZE]; // 送信データバッファ static BUFF rx1; // BUFF型受信データ構造体 static BUFF tx1; // BUFF型送信データ構造体 // SCI1割り込み関数プロトタイプ宣言 /////////////////////// void int_sci1_eri1(void); #pragma interrupt INT_SCI1_ERI1 void INT_SCI1_ERI1(void){ int_sci1_eri1();} void int_sci1_rxi1(void); #pragma interrupt INT_SCI1_RXI1 void INT_SCI1_RXI1(void){ int_sci1_rxi1();} void int_sci1_txi1(void); #pragma interrupt INT_SCI1_TXI1 void INT_SCI1_TXI1(void){ int_sci1_txi1();} void int_sci1_tei1(void); #pragma interrupt INT_SCI_TEI1 void INT_SCI1_TEI1(void){ int_sci1_tei1();} /* SCI1初期化 ********************************************/ #define PCLOCK 24000000 void sci1_init(unsigned short bps,unsigned char bit,unsigned char parity,unsigned char stopbit){ // bps 4800 / 9600 / 14400 / 19200 / 28800 / 31250 / 38400 // bit 8 / 7 // parity 0:無し / 1:偶数パリティ / 2:奇数パリティ // stopbit 1 / 2 // RX FIFO 初期化 rx1.remain = 0; rx1.read = 0; rx1.write = 0; rx1.buff = rx1buff; // TX FIFO 初期化 tx1.remain = 0; tx1.read = 0; tx1.write = 0; tx1.buff = tx1buff; MST.CR1.BIT._SCI1 = 0; // SCI1 スタンバイ解除 INTC.IPRF.WORD |= 0x000A; // SCI1 割込みLEVEL = 10 SCI1.SCR.BYTE = 0x00; // rx,tx割り込み送受信禁止 // 通信フォーマット設定 // SMR設定 SCI1.SMR.BYTE = 0; // SMR通信設定白紙 if(bit == 7){ SCI1.SMR.BIT.CHR = 1; // データ長7bit設定 } if(parity == 1){ SCI1.SMR.BIT._PE = 1; // パリティ付加 SCI1.SMR.BIT.OE = 0; // 偶数パリティ付加 } else if(parity == 2){ SCI1.SMR.BIT._PE = 1; // パリティ付加 SCI1.SMR.BIT.OE = 1; // 奇数パリティ付加 } if(stopbit == 2){ SCI1.SMR.BIT.STOP = 1; // ストップビット 2bit } // BRR設定 SCI1.BRR = (PCLOCK/(32*bps))-1; // BRR設定計算 // PFC設定 PFC.PACRL2.BIT.PA3MD=1; // 入力端子PA3 → RXD1 有効 PFC.PACRL2.BIT.PA4MD=1; // 出力端子PA4 → TXD1 有効 // SSR設定 SCI1.SSR.BYTE &= 0x87; // RDRF / ORER / FER / PER クリア // SCR設定 SCI1.SCR.BIT.TIE = 0; // 送信割り込み禁止 SCI1.SCR.BIT.RIE = 1; // 受信割り込み許可 SCI1.SCR.BIT.TE = 1; // 送信許可 SCI1.SCR.BIT.RE = 1; // 受信許可 } /* 一文字送信バッファへ格納 ******************************/ char sci1_putchar(char data){ char txdata; txdata = -1; // エラー時の戻り値 if(data > 0){ SCI1.SCR.BIT.TIE = 0; // 送信割り込み禁止 if(tx1.remain < BUFF_SIZE){ // データ量がバッファより少なければ tx1.buff[tx1.write] = data; // データをバッファに書き込み tx1.remain ++; // データ残数を1増 tx1.write ++; // 書込み位置を1増 if(BUFF_SIZE <= tx1.write){ // 書込み位置とバッファサイズの比較 tx1.write = 0; // 大きければ書込み位置を0に。 } txdata = data; // 戻り値用の代入処理 } SCI1.SCR.BIT.TIE = 1; // 送信割り込み許可 } return txdata; // txdataを返す } /* 文字列送信バッファへ格納 *****************************/ void sci1_putstr(char *str){ while(*str != '\0'){ // Nullの検出で終了 if(*str == '\n'){ // 改行処理 sci1_putchar(0x0a); // LFラインフィード sci1_putchar(0x0d); // CRキャリッジリターン } else{ sci1_putchar(*str); // 一文字送信処理 } str++; // ポインタの1増 } return; } /* 送信割り込み *****************************************/ void int_sci1_txi1(void){ char data; if(tx1.remain > 0){ // データ残量が0より大きければ data = tx1.buff[tx1.read]; // バッファからデータを読出し tx1.remain --; // データ残数を1減 tx1.read ++; // 読出し位置を1増 if(tx1.read >= BUFF_SIZE){ // 読出し位置とバッファサイズの比較 tx1.read = 0; // 大きければ読出し位置を0に。 } while(SCI1.SSR.BIT.TDRE == 0){} // 送信レジスタが空になるまで待つ。 SCI1.TDR = data; // 読み出したデータを送信レジスタへ。 SCI1.SSR.BIT.TDRE = 0; // 送信レジスタエンプティフラグのクリア } else { SCI1.SCR.BIT.TIE = 0; // データ残がなければ送信割り込み禁止 } } /* 送信終了割り込み *************************************/ void int_sci1_tei1(void){ SCI1.SCR.BIT.TEIE = 0; // 送信終了割り込み禁止 } /* 一文字受信バッファから読出し**************************/ char sci1_getchar(void){ char data; SCI1.SCR.BIT.RIE = 0; // 受信割り込み禁止 if(rx1.remain == 0){ // バッファデータが無ければ data = -1; // -1を戻り値とする。 } else { // バッファデータがあれば data = rx1.buff[rx1.read]; // データのバッファ読み出し rx1.remain --; // データ残数を1減 rx1.read ++; // 読出し位置を1増 if(BUFF_SIZE <= rx1.read){ // 読出し位置とバッファサイズの比較 rx1.read = 0; // 大きければ読出し位置を0に。 } } SCI1.SCR.BIT.RIE = 1; // 受信割り込み許可 return data; // 戻り値 data } /* 受信割り込み ****************************************/ void int_sci1_rxi1(void){ char data; data = SCI1.RDR; // 受信データ取り込み SCI1.SSR.BIT.RDRF = 0; // 受信レジスタフルフラグクリア if(rx1.remain < BUFF_SIZE){ // データ量がバッファより少なければ rx1.buff[rx1.write] = data; // 受信データをバッファに書込み rx1.remain ++; // データ残数を1増 rx1.write ++; // 書込み位置を1増 if(rx1.write >= BUFF_SIZE){ // 書込み位置とバッファサイズの比較 rx1.write = 0; // 大きければ書込み位置を0に。 } } } /* 受信エラー割り込み **********************************/ void int_sci1_eri1(void){ SCI1.SSR.BYTE &= 0x87; // RDRF / ORER / FER / PER クリア }