www.pudn.com > usbhost_source.rar > SIO.C
/** * sio.c * H8LANボード 通信関数 * Copyright (c)2002 Junichi Tomaru */ #include "h8hst.h" #includestatic char st; /** * SIO 初期化 */ void sioinit( char ch, char speed, char prm ) { switch( ch ){ /* TE,RE,RIE,TIE,TEIE,MPIEを禁止する */ case 0: SCI0_SCR = 0; _case 1: SCI1_SCR = 0; _default: break; } switch( ch ){ /* クロックセレクト(φ) */ case 0: SCI0_SMR = 0; _case 1: SCI1_SMR = 0; _default: break; } switch( ch ){ /* 通信パラメータ、分周 */ case 0: SCI0_SMR |= prm; _case 1: SCI1_SMR |= prm; _default: break; } switch( ch ){ /* ボーレイト(ビットレート) */ case 0: SCI0_BRR = speed; _case 1: SCI1_BRR = speed; _default: break; } waitms( 1 ); rx0hp = rx0tp = rx0ct = rx0err = 0; /* バッファポインタ等クリア */ tx0hp = tx0tp = tx0ct = 0; rx1hp = rx1tp = rx1ct = rx1err = 0; tx1hp = tx1tp = tx1ct = 0; switch( ch ){ /* 送信I禁止,受信I許可,送信許可,受信許可 */ case 0: SCI0_SCR = 0x70; _case 1: SCI1_SCR = 0x70; _default: break; } } /** * CH0受信エラー割り込み */ #pragma interrupt void scirx0err( void ) { st = SCI0_SSR; /* ステータス読む */ rx0err |= st; /* 前のエラーは消さない */ st &= 0xc7; /* エラーのクリア(OE,FE,PE) */ SCI0_SSR = st; } /** * CH0受信割り込み */ #pragma interrupt void scirx0( void ) { rx0buf[rx0tp] = SCI0_RDR; /* 受信 */ rx0tp++; rx0tp &= 0xff; rx0ct++; rx0ct &= 0xff; SCI0_SSR &= 0x87; /* RDRFクリア */ } /** * CH0送信データレジスタエンプティ割り込み */ #pragma interrupt void scitx0empty( void ) { if( tx0ct != 0 ){ /* 送る文字がある */ tx0ct--; SCI0_TDR = tx0buf[tx0hp]; /* 送信 */ tx0hp++; tx0hp &= 0xff; SCI0_SSR &= 0x7f; /* TDREクリア */ } else{ SCI0_SCR &= 0x7f; /* 送信I禁止 */ } } /** * CH1受信エラー割り込み */ #pragma interrupt void scirx1err( void ) { st = SCI1_SSR; /* ステータス読む */ rx1err |= st; /* 前のエラーは消さない */ st &= 0xc7; /* エラーのクリア(OE,FE,PE) */ SCI1_SSR = st; } /** * CH1受信割り込み */ #pragma interrupt void scirx1( void ) { rx1buf[rx1tp] = SCI1_RDR; /* 受信 */ rx1tp++; rx1tp &= 0xff; rx1ct++; rx1ct &= 0xff; SCI1_SSR &= 0x87; /* RDRFクリア */ } /** * CH1送信データレジスタエンプティ割り込み */ #pragma interrupt void scitx1empty( void ) { if( tx1ct != 0 ){ /* 送る文字がある */ tx1ct--; SCI1_TDR = tx1buf[tx1hp]; /* 送信 */ tx1hp++; tx1hp &= 0xff; SCI1_SSR &= 0x7f; /* TDREクリア */ } else{ SCI1_SCR &= 0x7f; /* 送信I禁止 */ } } /** * 受信数チェック * return 受信した文字数 */ byte getrxcount( char ch ) { byte ret; _di( ); if( ch == 0 ){ ret = rx0ct; } else{ ret = rx1ct; } _ei( ); return ret; } /** * 送信数チェック * return 送信バッファ内の文字数 */ byte gettxcount( char ch ) { byte ret; _di( ); if( ch == 0 ){ ret = tx0ct; } else{ ret = tx1ct; } _ei( ); return ret; } /** * 受信エラー読み出し */ char chkrxerr( char ch ) { char ret; if( ch == 0 ){ ret = rx0err; } else{ ret = rx1err; } return ret; } /** * 一文字受信(バッファから読み出す) */ char getsio1( char ch ) { char c; _di( ); if( ch == 0 ){ c = rx0buf[rx0hp]; rx0hp++; rx0hp &= 0xff; rx0ct--; } else{ c = rx1buf[rx1hp]; rx1hp++; rx1hp &= 0xff; rx1ct--; } _ei( ); return c; } /** * 一文字送信(送信バッファにセットと割り込み許可) */ bool setsio1( char ch, char dat ) { bool ret; _di( ); if( ch == 0 ){ if( tx0ct < 255 ){ /* 送信できる */ tx0buf[tx0tp] = dat; tx0tp++; tx0tp &= 0xff; tx0ct++; tx0ct &= 0xff; SCI0_SCR |= 0x80; /* 送信I許可 */ ret = TRUE; } else{ ret = FALSE; } } else{ if( tx1ct < 255 ){ /* 送信できる */ tx1buf[tx1tp] = dat; tx1tp++; tx1tp &= 0xff; tx1ct++; tx1ct &= 0xff; SCI1_SCR |= 0x80; /* 送信I許可 */ ret = TRUE; } else{ ret = FALSE; } } _ei( ); return ret; } /** * 一文字送信(待つ) */ bool setsio1w( char ch, char dat ) { bool ret; if( ch == 0 ){ while( tx0ct >= 254 ){ } } else{ while( tx1ct >= 254 ){ } } return setsio1( ch, dat ); } /** * ポートクリア */ void sioclear( char ch ) { while( getrxcount( ch ) != 0 ){ /* 受信あった */ getsio1( ch ); } } /** * 文字列出力 */ void setsiostr( char ch, char *str ) { byte i; for( i = 0; *( str + i ) != '\0'; i++ ){ setsio1w( ch, *( str + i )); } } /** * 文字列出力(フォーマットつき) */ void setsiostrf( char ch, char *fmt, ... ) { va_list argptr; byte i; char buf[64]; va_start( argptr, fmt ); vsprintf( buf, fmt, argptr ); for( i = 0; buf[i] != '\0'; i++ ){ setsio1w( ch, buf[i] ); } } /** * SIO文字列入力 * buf: バッファ * ct: バッファ容量 * dl: デリミタ( 区切り文字 ) */ char getsiostr( char ch, char *buf, int ct, char dl ) { byte i; char ret; word wt; byte c; ct--; wt = getcount1ms( ); for( i = 0; i < ct; ){ if( getrxcount( ch ) != 0 ){ /* 受信あった */ c = getsio1( ch ); *( buf + i ) = (char)c; i++; if( c == dl ){ /* デリミタ */ *( buf + i ) = '\0'; if( chkrxerr( ch ) ){ /* 通信エラーあった */ ret = 0; } else{ /* データ有功 */ ret = 1; } break; } } else if( getcount1ms( ) - wt > 3000U ){ ret = 0; break; } else{ } } return ret; } /* end of sio.c */