原文地址https://blog.csdn.net/qq_39545674/article/details/82597106
一、SCI 簡介
SCI(Serial Communication Interface)意為"串行通信接口",是相對於並行通信的,是串行通信技術的一種總稱,最早由 Motorola 公司提出的。它是一種通用異步通信接口 UART,與 MCS‐51 的異步通信功能基本相同。(以上內容來自百度)
二、28379D 的 SCI 模塊簡介
2.1 模塊功能
基本就是 UART,數據格式可編程。28398D 的 SCI 和其他 28 系列的產品基本一樣,有兩個增強功能。一個是發送和接收緩沖,FIFO。如果啟用了發送 FIFO,就可以將要發送的字節先儲存在發送 FIFO 里,待發送 FIFO 里的字節數達到設置的上限后,再一起發送出去。如果啟用了接收 FIFO,就可以將接收的字節先存在接收 FIFO 里,待接收 FIFO 里的字節數達到設置的上限后,再產生中斷來處理接收的數據。另一個是波特率自動檢測功能,這個一般不用。
2.2 28379D 的 SCI 模塊引腳
28379D 有 4 個 SCI,即 SCIA,SCIB,SCIC,SCID。每個 SCI 的發送引腳和接收引腳都有很多個,如下表:
發送Tx 接收Rx
SCIA GPIO8/29/36/42/48/65/84/135 GPIO9/28/35/43/49/64/85/136
SCIB GPIO9/10/14/18/22/54/70/86/137 GPIO11/15/19/23/55/71/87/138
SCIC GPIO12/38/56/63/72/89/106/140 GPIO13/39/57/62/73/90/107/139
SCID GPIO47/76/93/104/142 GPIO46/77/94/105/141
三、SCI 配置步驟
3.1 配置 GPIO
配置相應的 GPIO 為 SCIx 的復用引腳。
3.2 配置 SCI 的數據格式
配置發送和接收的數據格式,一般是:1 位停止位,無奇偶校驗,無回環,空閑線模式(兩個對象之間通訊,如果是三個及以上,得用地址線模式),8 位數據位。
3.3 配置波特率
配置波特率,不多說。
3.4 配置 FIFO
首先得使能 FIFO,然后根據需要,進行配置。比如使能接收 FIFO 中斷,設置 FIFO 的級數,基本的就這些。還可以配置波特率自檢的一些設置,不過一般不用。
3.5 使能 SCI
復位一些標志,比如 SCICTL1 寄存器的 SWRESET,必須被置 1,等等。
3.6 配置 PIE
首先使能 PIE,然后修改 PIE 向量表,然后使能對應的 PIE,以及 CPU 中斷。
四、代碼示例
示例使用了 SCIB,引腳使用 GPIO18 為 Tx,GPIO19 為 Rx。
4.1 配置 GPIO
EALLOW;
GpioCtrlRegs.GPAPUD.bit.GPIO18=0;//開啟上拉電阻
GpioCtrlRegs.GPAPUD.bit.GPIO19=0;//開啟上拉電阻
GpioCtrlRegs.GPADIR.bit.GPIO19=0;
GpioCtrlRegs.GPADIR.bit.GPIO18=1;
GpioCtrlRegs.GPAGMUX2.bit.GPIO18=0;
GpioCtrlRegs.GPAGMUX2.bit.GPIO19=0;
GpioCtrlRegs.GPAMUX2.bit.GPIO18=2;//復用為 SCIB 的輸出
GpioCtrlRegs.GPAMUX2.bit.GPIO19=2;//復用為 SCIB 的輸入
EDIS;
4.2 配置數據格式
ScibRegs.SCICCR.all = 0x0007;//1 位停止位,無奇偶校驗,無回環測試,空閑線模式,8 位數據位
4.3 配置波特率
ScibRegs.SCIHBAUD.bit.BAUD=0x0000;//波特率 115200
ScibRegs.SCILBAUD.bit.BAUD=0x0036;//波特率 115200
4.4 配置 FIFO
ScibRegs.SCIFFTX.bit.SCIFFENA=1;//使能 FIFO
ScibRegs.SCIFFRX.bit.RXFFIENA = 1;//使能 FIFO 接收中斷
ScibRegs.SCIFFRX.bit.RXFFIL=1;//FIFO 接收字節 1
ScibRegs.SCIFFCT.all = 0x0;
4.5 重新使能 SCI
ScibRegs.SCICTL1.all =0x0023; // Relinquish SCI from Reset 重啟sci
4.6 配置 PIE
PieCtrlRegs.PIECTRL.bit.ENPIE = 1;//使能 PIE
EALLOW;
PieVectTable.SCIB_RX_INT=&ScibInterrupt;//修改中斷向量表
EDIS;
PieCtrlRegs.PIEIER9.bit.INTx3 = 1;//使能 PIE 中斷
IER |= M_INT9;//使能 CPU 中斷
4.7 接收中斷函數 ScibInterrupt 如下:
interrupt void ScibInterrupt(void)
{
int i=0,data;
for(i=0;i<ScibLegnth;i++)
{
data=ScibRegs.SCIRXBUF.bit.SAR;//接收的數據
}
ScibRegs.SCIFFRX.bit.RXFFINTCLR=1; // 清接收中斷標志
PieCtrlRegs.PIEACK.all|=PIEACK_GROUP9;// 清接收中斷標志
}
4.8 發射函數
int ScibSend(int data)
{
while (ScibRegs.SCIFFTX.bit.TXFFST != 0) {}
ScibRegs.SCITXBUF.bit.TXDT=0x06;
return 0;
}
5、注意
1、請檢查自己工程的配置,系統時鍾是否是200M,如果不是,則波特率不對,具體的配置方式請參百度
2、本文代碼是基於硬件TMS320F28379D,如果你是使用的其他硬件,則代碼一般是不能用的
---------------------
作者:一朝英雄拔劍起
來源:CSDN
原文:https://blog.csdn.net/qq_39545674/article/details/82597106
版權聲明:本文為博主原創文章,轉載請附上博文鏈接!