SCI(Serial Communication Interface)設定
MCR委員会から購入できるH8/3048Fボードにおいて
2つのSCI(Serial Communication Interface)は、
次のようなハードウエアとなっています。
SCI0はTTLレベルの入出力、SCI1はRS232CインタフェースICが
接続されています。
SCI0はc328(scam)と接続するので、通信プロトコルは以下とします。
- データ転送速度 14400bps
- ストップビット 1ビット
- パリティ なし
- フロー制御 なし
通信プロトコルを設定する関数init_SCI0は、以下とします。
void init_SCI0(UWORD x)
{
volatile UWORD i;
SCI0.SCR.BYTE = 0 ;
SCI0.SMR.BYTE = 0 ;
/* data transfer speed */
SCI0.BRR = x ;
/* wait 1 frame */
for (i = 0; i < 3000 ; i++) ;
/* enable Transmmit and Receive with interrupt */
SCI0.SCR.BYTE = 0x70 ;
}
データ転送速度を設定後、1データの受信時間以上待ってから
送受信および受信割込みを許可します。
データ転送速度の設定値は、14400bpsで52となります。
この数値は、H8のクロック周波数が24.576MHzの場合です。
SCI1のデータ転送速度は、c328(scam)よりも高速であれば
他は、どう設定しようと構いません。
できる限り高速になるように、通信プロトコルは次のように
指定します。
- データ転送速度 57600bps
- ストップビット 1ビット
- パリティ なし
- フロー制御 なし
通信プロトコルを設定する関数init_SCI1は、以下とします。
void init_SCI1(UWORD x)
{
volatile UWORD i;
SCI1.SCR.BYTE = 0 ;
SCI1.SMR.BYTE = 0 ;
/* data transfer speed */
SCI1.BRR = x ;
/* wait 1 frame */
for (i = 0; i < 3000 ; i++) ;
/* enable Transmmit and Receive with interrupt */
SCI1.SCR.BYTE = 0x70 ;
}
データ転送速度を設定後、1データの受信時間以上待ってから
送受信および受信割込みを許可します。
データ転送速度の設定値は、57600bpsで12となります。
この数値は、H8のクロック周波数が24.576MHzの場合です。
2つのSCIの動作仕様を、より詳細に設定します。
SCI0動作仕様
SCI0は、上位のファームウエアからの命令でc328(scam)に
コマンドを転送します。
コマンド転送は、送信割込みを使わずに、1文字ずつファーム
ウエアで送信します。
c328(scam)からの応答は、受信割込みでデータを受取ります。
受取ったデータは、リングバッファに保存します。
(リングバッファに関しては、後の章で説明します。)
受信でエラーが発生することもあるので、エラー対応の
コードも付け加えます。
受信割込みでは、受信バッファから1データを取出し
リングバッファに保存するだけです。
void int_rxi0(void)
{
UBYTE ch0,dummy ;
/* clear flag */
dummy = SCI0.SSR.BYTE ;
SCI0.SSR.BIT.RDRF = OFF ;
/* get a character */
ch0 = SCI0.RDR ;
/* store */
put_ring( ch0 ) ;
}
受信で発生するエラーは、フレーミングエラーとオーバーランエラー
のいずれかなので、これらのエラーが発生した場合は、フラグクリア
で対応します。
void int_eri0(void)
{
/* Framing Error */
SCI0.SSR.BYTE &= ~0x30 ;
}
受信処理は定義できたので、送信を考えます。
土台となる処理は、1バイト送信なので、これだけを
関数にまとめます。
送信バッファに空きがあることを確認後、データを送信
バッファに転送します。
void rs_put_txd0(UBYTE x)
{
/* wait data transfer */
while ( SCI0.SSR.BIT.TDRE == OFF ) ;
/* put */
SCI0.TDR = x ;
SCI0.SSR.BIT.TDRE = OFF ;
}
SCI1動作仕様
SCI1は、パーソナルコンピュータの端末ソフトからコマンド
を入力し、c328(scam)を間接的に動かします。
コマンドは、受信割込みを使い取りこぼさないように工夫します。
受信割込みを使うので、コマンド受信があったことを
フラグを利用して通知します。
受信でエラーが発生することもあるので、エラー対応の
コードも付け加えます。
受信割込みでは、受信バッファから1データを取出し
バッファに保存します。さらに、デリミタ'\r'を検出
したならば、フラグで上位に通知します。
void int_rxi1(void)
{
volatile UBYTE ch,dummy ;
/* clear flag */
dummy = SCI1.SSR.BYTE ;
SCI1.SSR.BIT.RDRF = OFF ;
/* get a character */
ch = SCI1.RDR ;
/* store */
*(sbuf+sindex) = ch ;
sindex++ ;
/* check */
if ( ch == '\r' ) {
*(sbuf+sindex) = 0 ;
sindex = 0 ;
S1FLAG = ON ;
}
}
受信で発生するエラーは、フレーミングエラーとオーバーランエラー
のいずれかなので、これらのエラーが発生した場合は、フラグクリア
で対応します。
void int_eri1(void)
{
/* Framing Error */
SCI1.SSR.BYTE &= ~0x30 ;
}
受信処理は定義できたので、送信を考えます。
土台となる処理は、1バイト送信なので、これを
関数にまとめます。
送信バッファに空きがあることを確認後、データを送信
バッファに転送します。
void rs_put_txd1(UBYTE x)
{
/* wait data transfer */
while ( SCI1.SSR.BIT.TDRE == OFF ) ;
/* put */
SCI1.TDR = x ;
SCI1.SSR.BIT.TDRE = OFF ;
}
ホストには、文字列を送信する処理もあるので
文字列出力を定義します。
void rs_puts_txd1(UBYTE *x)
{
while ( *x ) {
rs_put_txd1( *x );
x++ ;
}
crlf();
}
文字列ごとに、改行をつけるのは面倒です。
改行を担当する関数を定義します。
void crlf(void)
{
rs_put_txd1('\r');
rs_put_txd1('\n');
}
目次
前
次