📄 h8_sci.c
字号:
#include "h8_3048.h"
#include "h8_sci.h"
/* ------------------------------ */
/* SCI */
/* ------------------------------ */
/* 巊梡億乕僩偺掕媊 */
#ifdef __USE_SCI0
#define SMR SMR0
#define BRR BRR0
#define SCR SCR0
#define TDR TDR0
#define SSR SSR0
#define RDR RDR0
#else
#define SMR SMR1
#define BRR BRR1
#define SCR SCR1
#define TDR TDR1
#define SSR SSR1
#define RDR RDR1
#endif
#define SCIBUFSIZ 128 /* 僶僢僼傽僒僀僘 */
static unsigned char sci_rx_buff[SCIBUFSIZ]; /* 庴怣儕儞僌僶僢僼傽 */
static unsigned char sci_rx_stptr; /* 庴怣僶僢僼傽愭摢 */
static unsigned char sci_rx_enptr; /* 庴怣僶僢僼傽枛旜 */
static unsigned char sci_tx_buff[SCIBUFSIZ]; /* 憲怣儕儞僌僶僢僼傽 */
static unsigned char sci_tx_stptr; /* 憲怣僶僢僼傽愭摢 */
static unsigned char sci_tx_enptr; /* 憲怣僶僢僼傽枛旜 */
/* SCI弶婜壔 */
void SCI_Init(unsigned char rate)
{
int i;
/* 儕儞僌僶僢僼傽弶婜壔 */
sci_rx_stptr = sci_rx_enptr = 0;
sci_tx_stptr = sci_tx_enptr = 0;
/* SCI弶婜壔 */
SCR = 0x00;
SMR = 0x00;
BRR = rate;
for ( i = 0; i < 280; i++ )
;
SCR = 0x70;
}
/* 僄儔乕庴怣 妱傝崬傒僴儞僪儔 */
void SCI_ERR_Intr(void)
{
SSR &= 0xcf;
}
/* 僨乕僞庴怣 妱傝崬傒僴儞僪儔 */
void SCI_RX_Intr(void)
{
unsigned char c;
unsigned char nxptr;
/* 1暥帤庴怣 */
SSR &= 0xbf;
c = RDR;
/* FIFO偵1暥帤擖傟傞 */
nxptr = sci_rx_enptr + 1;
if(nxptr >= SCIBUFSIZ) nxptr = 0;
if(sci_rx_stptr != nxptr) {
sci_rx_buff[sci_rx_enptr] = c;
sci_rx_enptr = nxptr;
} else {
/* 僶僢僼傽偑枮攖 */
/* 杮棃側傜偙偙偵僄儔乕張棟 */
/* 偲傝偁偊偢庢傝偙傏偡偙偲偵偡傞 */
}
}
/* 憲怣妱傝崬傒 */
void SCI_TX_Intr(void)
{
unsigned char nxptr;
if ( sci_tx_stptr == sci_tx_enptr ) {
/* 憲怣僶僢僼傽偑嬻側傜妱傝崬傒傪嬛巭偟偰儕僞乕儞 */
SCR &= 0x7f;
return;
}
/* 憲怣僶僢僼傽偐傜1暥帤庢傝弌偟偰憲怣 */
TDR = sci_tx_buff[sci_tx_stptr];
SSR &= 0x7f;
/* 億僀儞僞峏怴 */
nxptr = sci_tx_stptr + 1;
if (nxptr >= SCIBUFSIZ) nxptr = 0;
sci_tx_stptr = nxptr;
if ( sci_tx_stptr == sci_tx_enptr ) {
/* 僶僢僼傽偑嬻側傜師偺妱傝崬傒傪巭傔傞 */
SCR &= 0x7f;
return;
}
}
/* 侾暥帤弌椡 */
void SCI_Putc(char data)
{
unsigned char nxptr;
__di();
if ( (sci_tx_stptr == sci_tx_enptr) && (SSR & 0x80) ) {
/* 僶僢僼傽偑嬻偱憲怣壜擻側傜偡偖弌椡 */
TDR = data;
SSR &= 0x7f;
SCR &= 0x7f;
__ei();
return;
}
nxptr = sci_tx_enptr + 1;
if( nxptr >= SCIBUFSIZ ) nxptr = 0;
while ( (volatile)sci_tx_stptr == nxptr ) {
/* 僶僢僼傽偑堦攖側傜嬻偔偺傪懸偮 */
__ei();
__di();
}
/* 憲怣僶僢僼傽偵1暥帤擖傟傞 */
sci_tx_buff[sci_tx_enptr] = data;
sci_tx_enptr = nxptr;
/* 妱傝崬傒傪嫋壜 */
SCR |= 0x80;
__ei();
}
/* 暥帤楍弌椡 */
void SCI_Puts(const char *str)
{
while ( *str )
SCI_Putc(*str++);
}
/* 侾暥帤擖椡 */
int SCI_Getc(void)
{
unsigned char c;
unsigned char nxptr;
if (sci_rx_stptr == sci_rx_enptr)
return -1; /* 庴怣僶僢僼傽偑嬻 */
/* FIFO偐傜1暥帤庢傝弌偡 */
c = sci_rx_buff[sci_rx_stptr];
/* 億僀儞僞峏怴 */
nxptr = sci_rx_stptr + 1;
if (nxptr >= SCIBUFSIZ)
nxptr = 0;
sci_rx_stptr = nxptr;
return c;
}
/* 暥帤楍擖椡 */
void SCI_Gets(char *buf)
{
int c;
for ( ; ; ) {
c = SCI_Getc();
if ( c != -1 ) {
*buf++ = c;
if ( c == '\r' ) {
*buf = '\0';
return;
}
}
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -