一、IO配置
以SCIA為例:使用的是GPIO35--SCITXDA GPIOA36--SCIRXDA
使用寄存器:
GPBPUD :設置上拉 GPIO32-GPIO63 對應位0 使能上拉
GPBQSEL1:
GPBMUX1:IO模式選擇
代碼如下:
GpioCtrlRegs.GPBPUD.bit.GPIO36 = 0; // Enable pull-up for GPIO28 (SCIRXDA)//使能內部上拉 GpioCtrlRegs.GPBPUD.bit.GPIO35 = 0; // Enable pull-up for GPIO29 (SCITXDA)//使能內部上拉 GpioCtrlRegs.GPBQSEL1.bit.GPIO36 = 3; // Asynch input GPIO28 (SCIRXDA) //設置為異步輸入模式 GpioCtrlRegs.GPBMUX1.bit.GPIO36 = 1; // Configure GPIO28 for SCIRXDA operation //配置為外設模式 GpioCtrlRegs.GPBMUX1.bit.GPIO35 = 1; // Configure GPIO29 for SCITXDA operation//配置為外設模式
設置FIFO寄存器:
void scia_fifo_init() { SciaRegs.SCIFFTX.all=0xE040;//使能FIFO;清除發送中斷標志位;禁止FIFO發送中斷; //發送中斷級別定義為0; SciaRegs.SCIFFRX.all=0x204f;//清除FIFO溢出標志位;清除溢出接受中斷標志位;禁止 //FF接受中斷;接受中斷級別為16; SciaRegs.SCIFFCT.all=0x0;//SCITXBUF到移位寄存器傳送不延遲 }
設置SCI相關寄存器: 寄存器描述見http://www.ti.com/lit/ug/sprufz5a/sprufz5a.pdf
void scia_echoback_init() { // Note: Clocks were turned on to the SCIA peripheral // in the InitSysCtrl() function SciaRegs.SCICCR.all =0x0007; // 1 stop bit, No loopback // No parity,8 char bits, // async mode, idle-line protocol SciaRegs.SCICTL1.all =0x0003; // enable TX, RX, internal SCICLK, // Disable RX ERR, SLEEP, TXWAKE SciaRegs.SCICTL2.all =0x0003; SciaRegs.SCICTL2.bit.TXINTENA =1;//開啟接收中斷 SciaRegs.SCICTL2.bit.RXBKINTENA =1;//開啟發送中斷 #if (CPU_FRQ_150MHZ) SciaRegs.SCIHBAUD =0x0001; // 9600 baud @LSPCLK = 37.5MHz. SciaRegs.SCILBAUD =0x00E7; #endif #if (CPU_FRQ_100MHZ) SciaRegs.SCIHBAUD =0x0001; // 9600 baud @LSPCLK = 20MHz. SciaRegs.SCILBAUD =0x0044; #endif SciaRegs.SCICTL1.all =0x0023; // Relinquish SCI from Reset }
波特率計算方式:
發生一個字節:
void scia_xmit(int a) { while (SciaRegs.SCIFFTX.bit.TXFFST != 0) {} SciaRegs.SCITXBUF=a; }
使用SICA 發送,串口中斷接收:
配置參數如下:
static void Init_SCI_A(Uint32 Baud) { //Init IO Uint16 BRR=0; EALLOW; GpioCtrlRegs.GPBPUD.bit.GPIO36 = 0; // Enable pull-up for GPIO28 (SCIRXDA) GpioCtrlRegs.GPBPUD.bit.GPIO35 = 0; // Enable pull-up for GPIO29 (SCITXDA) GpioCtrlRegs.GPBQSEL1.bit.GPIO36 = 3; // Asynch input GPIO28 (SCIRXDA) GpioCtrlRegs.GPBMUX1.bit.GPIO36 = 1; // Configure GPIO28 for SCIRXDA operation GpioCtrlRegs.GPBMUX1.bit.GPIO35 = 1; // Configure GPIO29 for SCITXDA operation EDIS; //set RX interrput function EALLOW; PieVectTable.SCIRXINTA = &SciaRxIsr; EDIS; //set SCIA register SciaRegs.SCICCR.all =0x0007; // 1 stop bit, No loopback // No parity,8 char bits, // async mode, idle-line protocol SciaRegs.SCICTL1.all =0x0003; // enable TX, RX, internal SCICLK, // Disable RX ERR, SLEEP, TXWAKE SciaRegs.SCICTL2.bit.TXINTENA =0;//close TX interrput SciaRegs.SCICTL2.bit.RXBKINTENA =1; //set Baud BRR= LSPCLK/(Baud*8)-1 BRR = SCI_LSPCLK/(Baud*8)-1; SciaRegs.SCIHBAUD = (BRR>>8); // 9600 baud @LSPCLK = 37.5MHz. SciaRegs.SCILBAUD = (BRR&0x00ff); // SciaRegs.SCIHBAUD =0x0001; // 9600 baud @LSPCLK = 37.5MHz. // SciaRegs.SCILBAUD =0x00E7; SciaRegs.SCICTL1.all =0x0023; // Relinquish SCI from Reset EALLOW; //set SCI interrput Group PieCtrlRegs.PIECTRL.bit.ENPIE = 1; // Enable the PIE block PieCtrlRegs.PIEIER9.bit.INTx1=1; // PIE Group 9, int1 enable SCIA_RX //PieCtrlRegs.PIEIER9.bit.INTx2=1; // PIE Group 9, INT2 enable SCIA_TX EDIS; }
發送數據代碼:
//send one byte data static void scia_xmit(int a) { while (SciaRegs.SCIFFTX.bit.TXFFST != 0) {} SciaRegs.SCITXBUF=a; } //send string void scia_msg(char * msg) { int i; i = 0; while(msg[i] != '\0') { scia_xmit(msg[i]); i++; } }