/**************************************************************/ /* ユーザー関数を集めたヘッダファイル SH2用 /* AP-SH2F-1A 付属のサンプルプログラム SCI.Cより作成 /* RIKIYA 2001/08 /*************************************************************/ #define BUFF_SIZE 256 typedef struct { unsigned short len; unsigned short read; unsigned short write; unsigned char *buff; } SIO_FIFO; static unsigned char rx1buff[BUFF_SIZE]; static unsigned char tx1buff[BUFF_SIZE]; static SIO_FIFO rx1fifo; static SIO_FIFO tx1fifo; /* シリアルポート初期化 */ #define PCLOCK 19660800 void sci1_init( unsigned short bps, /* 4800~ */ unsigned char bit, /* 8 or 7 */ unsigned char parity, /* 0:NON 1:EVN 2:ODD */ unsigned char stopBit ) /* 1 or 2 */ { unsigned char smr; unsigned char brr; unsigned char dummy; /* RX FIFO */ rx1fifo.len = 0; rx1fifo.read = 0; rx1fifo.write = 0; rx1fifo.buff = rx1buff; /* TX FIFO */ tx1fifo.len = 0; tx1fifo.read = 0; tx1fifo.write = 0; tx1fifo.buff = tx1buff; INTC.IPRH.WORD |= 0x0700; /* SCI1 InterruptLevel = 7 */ SCI1.SCR.BYTE = 0x00; /* 送信割込み禁止 */ /* 受信割込み禁止 */ /* 送信禁止/受信禁止 */ /* SMR */ smr = 0; if ( 7 == bit ) { smr |= 0x40; } if ( 1 == parity ) { smr |= 0x20; } else if ( 2 == parity ) { smr |= 0x30; } if ( 2 == stopBit ) { smr |= 0x08; } /* brr */ brr = ((PCLOCK / 32) / bps) - 1; SCI1.SMR.BYTE = smr; SCI1.BRR = brr; dummy = SCI1.SSR.BYTE; /* ステータスクリア */ SCI1.SSR.BYTE = 0x84; SCI1.SCR.BYTE |= 0x70; /* 受信割込み許可 */ /* 送信許可/受信許可 */ } /* 1文字格納 */ short sci1_putc( unsigned char data ) { short ret; ret = -1; SCI1.SCR.BYTE &= ~0x80; /* 送信割込み禁止 */ if ( BUFF_SIZE > tx1fifo.len ) { tx1fifo.buff[tx1fifo.write] = data; tx1fifo.len++; tx1fifo.write++; if ( BUFF_SIZE <= tx1fifo.write ) { tx1fifo.write = 0; } ret = data; } else { } SCI1.SCR.BYTE |= 0x80; /* 送信割込み許可 */ return (ret); } /* 1文字取得 */ short sci1_getc() { short data; data = -1; SCI1.SCR.BYTE &= ~0x40; /* 受信割込み禁止 */ if ( 0 != rx1fifo.len ) { data = rx1fifo.buff[rx1fifo.read]; rx1fifo.len--; rx1fifo.read++; if ( BUFF_SIZE <= rx1fifo.read ) { rx1fifo.read = 0; } } SCI1.SCR.BYTE |= 0x40; /* 受信割込み許可 */ return( data ); } /* 受信エラー割り込み */ #pragma interrupt void int_eri1(void) { SCI1.SSR.BYTE &= 0x00; /* エラーフラグクリア */ } /* 受信割り込み */ #pragma interrupt void int_rxi1(void) { unsigned char data; data = SCI1.RDR; /* 受信 */ SCI1.SSR.BYTE &= ~0x40; /* RDRFクリア */ if ( BUFF_SIZE > rx1fifo.len ) { rx1fifo.buff[rx1fifo.write] = data; rx1fifo.len++; rx1fifo.write++; if ( BUFF_SIZE <= rx1fifo.write ) { rx1fifo.write = 0; } } } /* 送信割り込み */ #pragma interrupt void int_txi1(void) { unsigned char data; if ( 0 < tx1fifo.len ) { data = tx1fifo.buff[tx1fifo.read]; tx1fifo.len--; tx1fifo.read++; if ( BUFF_SIZE <= tx1fifo.read ) { tx1fifo.read = 0; } SCI1.TDR = data; /* 1バイト送信 */ SCI1.SSR.BYTE &= ~0x80; /* TDRE クリア */ } else { SCI1.SCR.BYTE &= ~0x80; /* 送信割込み禁止 */ } } /* 送信終了割込み */ #pragma interrupt void int_tei1(void) { SCI1.SCR.BYTE &= ~0x04; /* 送信終了割込み禁止 */ }