目錄
1. SCI標準模式下發送
- ScibRegs.SCITXBUF = ‘A’;
- 在ScibRegs.SCICTL2.bit.TXEMPTY=1之後SCITXBUF中的數據自動到TXSHF(移位寄存器中)
- TXSHF移位到硬件引腳TXD
2. SCI標準模式下接收
- 數據到達RXD引腳之後,檢測啓動位
- TXSHF移位到ScibRegs.SCIRXBUF當中,產生一箇中斷申請
- ScibRegs.SCIRXST.bit.RXRDY標誌位置1,表示接收到一個字節
- 通過讀取g_recv_buff[s_recv_count++] =ScibRegs.SCIRXBUF.all,標誌位RXRDY自動清除
3. 示例說明
void main(void)
{
char *msg;
InitSysCtrl();
InitScibGpio(); //GPIO14、GPIO15
DINT;
InitPieCtrl();
IER = 0x0000;
IFR = 0x0000;
InitPieVectTable();
EALLOW;
PieVectTable.SCIRXINTB = &scibRxIsr;
// PieVectTable.SCITXINTB = &scibTxIsr;
EDIS;
PieCtrlRegs.PIECTRL.bit.ENPIE = 1; // Enable the PIE block
PieCtrlRegs.PIEIER9.bit.INTx3=1; // PIE Group 9, INT3
// PieCtrlRegs.PIEIER9.bit.INTx4=1; // 發送中斷沒必要開啓
IER = M_INT9; // Enable CPU INT
EINT;
scib_fifo_init(); // Initialize the SCI
scib_echoback_init(); // Initalize SCI for echoback
msg = "Hello World!\n\0";
scib_msg(msg,strlen(msg));
for(;;)
}
/*
初始化SCIB
*/
void scib_echoback_init()
{
// ScibRegs.SCICCR.all =0x0007; //等價於下面的5條語句
ScibRegs.SCICCR.bit.STOPBITS = 0; //1 stop bit
ScibRegs.SCICCR.bit.PARITYENA = 0; //NO PARITY
ScibRegs.SCICCR.bit.LOOPBKENA = 0; //No loopback 1-自測模式即硬件內部收發引腳連在一起
ScibRegs.SCICCR.bit.ADDRIDLE_MODE = 0; //地址協議選擇空閒線協議,1-選擇地址位協議
ScibRegs.SCICCR.bit.SCICHAR = 7; //數據位8位
ScibRegs.SCICTL1.bit.RXENA = 1;//使能接收
ScibRegs.SCICTL1.bit.TXENA = 1;//使能發送
// ScibRegs.SCICTL2.bit.TXINTENA =1; //發送中斷禁用使能
ScibRegs.SCICTL2.bit.RXBKINTENA =1; //接收中斷使能
//波特率設置寄存器BRR = LSPCLK/(波特率*8)-1
#if (CPU_FRQ_150MHZ)
ScibRegs.SCIHBAUD =0x0001; // 9600 baud @LSPCLK = 37.5MHz.
ScibRegs.SCILBAUD =0x00E7;
#endif
ScibRegs.SCICTL1.bit.SWRESET =1; // 通過寫1重新使能SCI,該復位每種外設都有
}
void scib_xmit(char a)
{
ScibRegs.SCITXBUF=a;
while(ScibRegs.SCICTL2.bit.TXEMPTY == 0){;}//等待發送結束,否則會覆蓋之前要發送的內容
}
void scib_msg(char * msg, Uint16 len)
{
int i;
for(i = 0;i < len;i++)
{
scib_xmit(msg[i]);
}
}
/*
其實該函數沒必要寫,默認初值就是如此;這裏寫上是爲了加深理解
*/
void scib_fifo_init()
{
ScibRegs.SCIFFTX.bit.TXFFIENA = 0;//禁用FIFO
}
__interrupt void scibRxIsr(void)
{
static unsigned char s_recv_count = 0;
g_recv_buff[s_recv_count++] =ScibRegs.SCIRXBUF.all; // Read data
if(s_recv_count >= 255)
s_recv_count = 0;
PieCtrlRegs.PIEACK.all|=0x100; // Issue PIE ack
}