www.pudn.com > usbhost_source.rar > SIO.C


/** 
*	sio.c 
*	H8LANボード			通信関数 
*	Copyright (c)2002 Junichi Tomaru 
*/ 
#include	"h8hst.h" 
#include	 
 
static	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 */