wordpress新窗口打開所有外鏈游戲優(yōu)化大師官網(wǎng)
TMS320F280025 串口SCI的使用
`
文章目錄
- TMS320F280025 串口SCI的使用
- 框圖分析
- 串口特點
- 可編程數(shù)據(jù)格式
- SCI端口中斷
- 非FIFO/FIFO模式下SCI中斷的操作/配置
- UartDriver.c
- UartDriver.h
串口時鐘由PCLKCR7控制使能,默認(rèn)位系統(tǒng)時鐘4分頻
串口接收與發(fā)送都可以觸發(fā)中斷
串口使用的引腳需要配置GPIO復(fù)用
框圖分析
串口配置包括數(shù)據(jù)格式設(shè)置、通訊速率設(shè)置、FIFI設(shè)置、中斷設(shè)置
對于發(fā)送和接受都可以選擇是否使用FIFO
對于發(fā)送和接收都可以設(shè)置是否觸發(fā)中斷和FIFO中斷,對于接收可以檢測數(shù)據(jù)是否正確,如數(shù)據(jù)錯誤產(chǎn)生對應(yīng)標(biāo)志位
其主要功能單元如下:
①一個發(fā)送器(TX) 及相關(guān)寄存器。
–SICTXBUF: 發(fā)送數(shù)據(jù)緩沖寄存器, 存放所要發(fā)送的數(shù)據(jù)(由 CPU 裝載) 。
–TXSHF 寄存器: 發(fā)送移位寄存器, 從 SCITXBUF 寄存器接收數(shù)據(jù), 并將數(shù)據(jù)移位到 SCITXD 引腳上, 每次移 1 位數(shù)據(jù)。
②一個接收器(RX) 及相關(guān)寄存器。
–SCIRXBUF: 接收數(shù)據(jù)緩沖寄存器, 存放 CPU 所要讀取的數(shù)據(jù), 來自遠(yuǎn)程處理器的數(shù)據(jù)裝入寄存器 RXSHF, 然后又裝入接收數(shù)據(jù)緩沖寄存器 SCIRXBUF 和接收仿真緩沖寄存器 SCIRXEMU 中。
–RXSHF 寄存器: 接收移位寄存器, 從 SCIRXD 引腳移入數(shù)據(jù), 每次移 1 位。
③一個可編程的波特率產(chǎn)生器。
串口特點
SCI模塊的功能包括:
SCI模塊的功能包括:
?兩個外部針(針都可以用作GPIO,如果不是用于SCI):
- SCITXD: SCI transmit-output
–SCIRXD: SCI接收輸入
?波特率可編程64 k不同利率
?數(shù)據(jù)字格式-一個起始位數(shù)據(jù)字長度可編程從一到八個比特—
—可選的偶數(shù)/奇數(shù)/不校驗位
-一個或兩個停止位區(qū)分地址和一個額外的數(shù)據(jù)(地址模式)
?四個錯誤檢測標(biāo)志:
?兩種喚醒多處理器模式:空閑線和地址位
?半雙工或全雙工操作
?雙緩沖接收和發(fā)送功能
?發(fā)送和接收操作可以通過中斷驅(qū)動或輪詢算法與狀態(tài)標(biāo)志來完成
?發(fā)送和接收中斷的單獨啟用位(BRKDT除外)
?NRZ(非歸零)格式增強功能包括:
?16級發(fā)送/接收FIFO
可編程數(shù)據(jù)格式
SCI數(shù)據(jù)的接收和發(fā)送都采用NRZ (non-return-to-zero)格式。如圖26-3所示,NRZ數(shù)據(jù)格式包括:
?1個起始位
?1 ~ 8個數(shù)據(jù)位
?一個奇偶校驗位(可選)
?一個或兩個停止位
?一個用來區(qū)分?jǐn)?shù)據(jù)和地址的額外位(僅限地址位模式)
數(shù)據(jù)的基本單位稱為字符,長度為1 ~ 8位。數(shù)據(jù)的每個字符都用一個起始位、一個或兩個停止位以及可選的奇偶校驗位和地址位進(jìn)行格式化。帶格式化信息的數(shù)據(jù)字符稱為幀,如圖26-3所示。
SCI端口中斷
SCI接收和發(fā)送可以中斷控制。SCICTL2寄存器有一個標(biāo)志位(TXRDY),它表示活動的中斷條件,SCIRXST寄存器有兩個中斷標(biāo)志位(RXRDY和BRKDT),加上RX ERROR中斷標(biāo)志,它是FE、OE、BRKDT和PE條件的邏輯或。發(fā)送器和接收器具有單獨的中斷啟用位。如果不啟用,則不會斷言中斷;但是,條件標(biāo)志保持活動狀態(tài),反映傳輸和接收狀態(tài)。
SCI對于接收端和發(fā)送端具有獨立的外圍中斷向量。外圍中斷請求可以是高優(yōu)先級的,也可以是低優(yōu)先級的。這是由外設(shè)輸出到PIE控制器的優(yōu)先級位表示的。當(dāng)RX和TX中斷請求處于相同的優(yōu)先級時,接收端總是比發(fā)送端具有更高的優(yōu)先級,從而減少了接收端溢出的可能性。
外圍中斷的操作在系統(tǒng)控制和中斷一章的外圍中斷一節(jié)中描述。
?如果RX/BK INT ENA位(SCICTL2, bit 1)被設(shè)置,當(dāng)發(fā)生以下事件之一時,接收方外設(shè)中斷請求被斷言:—SCI接收到一個完整的幀,并將RXSHF寄存器中的數(shù)據(jù)傳輸?shù)絊CIRXBUF寄存器中。這個動作設(shè)置RXRDY標(biāo)志(SCIRXST,位6)并啟動中斷。
-發(fā)生中斷檢測條件(SCIRXD在缺少停止位后的9.625位周期內(nèi)處于低電平)。這個動作設(shè)置BRKDT標(biāo)志位(SCIRXST,第5位)并啟動中斷。
?如果設(shè)置了TX INT ENA位(SCICTL2.0),當(dāng)SCITXBUF寄存器中的數(shù)據(jù)被轉(zhuǎn)移到TXSHF寄存器時,發(fā)送器外設(shè)中斷請求被斷言,表明CPU可以寫SCITXBUF;這個動作設(shè)置TXRDY標(biāo)志位(SCICTL2,位7)并啟動中斷。
SCI模塊中斷反應(yīng)時間-如果在應(yīng)用程序中發(fā)生緊時序,可能會發(fā)生偶爾的BRKDT或其他錯誤,如FE/PE被觸發(fā)。
中斷不會被觸發(fā),直到大約7/8的停止位被檢測到(大約0.875位時間)。ISR表項前的實際延遲值為:((7BAUD_CLK_PERIOD)/
8+3SYSCLK_PERIOD)。 在RX
ISR完成之前,SCI不會開始讀取額外的位/字符,所以在下一個字節(jié)的起始位開始之前完成ISR。不管中斷原因是什么,這留下了大約1/8比特時間(大約0.125比特時間)來完成整個ISR。
如果ISR在下一個起始位開始之前沒有完成(在RX線再次變低之前),SCI模塊在錯誤的位置開始讀取起始位,因此可能會錯誤地讀取所有位,直到下一個正確對齊的起始位(當(dāng)ISR有足夠的時間在再次開始位之前處理)。
避免錯誤的推薦方法(以適應(yīng)ISR開始所需的0.875位時間):
- 保持RX ISR短。RX ISR必須僅用于將FIFO/緩沖區(qū)中的數(shù)據(jù)移動到內(nèi)存中,在內(nèi)存中數(shù)據(jù)可以在另一個時間要求較低的函數(shù)中進(jìn)行處理。
- 避免在SCI RX ISR中過多地嵌套其他中斷。不要允許嵌套延遲SCI RX ISR完井超過大約0.125位的時間窗口。
- 如果需要額外的時間(超過大約0.125比特的時間),在將額外的數(shù)據(jù)傳輸?shù)紺2000設(shè)備的SCI RX引腳之前,可以在其他設(shè)備的固件中添加延遲。 其他設(shè)備可以通過以下方式增加延遲:
a.向C2000設(shè)備發(fā)送帶有2個停止位的字節(jié),為C2000 RX ISR完成提供大約1.125位的處理時間。
b.在發(fā)送一個字節(jié)后,在發(fā)送到C2000設(shè)備的另一個設(shè)備的固件中增加手動延遲,為C2000 RX
ISR完成提供(延遲+大約0.125比特時間)處理時間。 c.在每次C2000
RX中斷發(fā)生后,在發(fā)送到C2000設(shè)備的另一個設(shè)備的固件中增加手動延遲,為C2000 RX
ISR完成提供(延遲+大約0.125比特時間)處理時間。這很難實現(xiàn),因為需要另一個設(shè)備來預(yù)測傳輸?shù)臄?shù)據(jù)何時觸發(fā)C2000設(shè)備上的RX中斷。觸發(fā)RX中斷的例子有:到達(dá)RX-
fifo水平、發(fā)送BRKDT、發(fā)生RXERROR等。RXRDY和BRKDT位的中斷產(chǎn)生由RX/BK INT ENA位(SCICTL2,位1)控制。RX ERROR位的中斷產(chǎn)生由RX ERR
INT ENA位(SCICTL1,位6)控制。
非FIFO/FIFO模式下SCI中斷的操作/配置
①復(fù)位: 在上電復(fù)位時, SCI 工作在標(biāo)準(zhǔn) SCI 模式, 禁止 FIFO 功能。 FIFO的寄存器 SCIFFTX、 SCIFFRX 和 SCIFFCT 都被禁止。
②標(biāo)準(zhǔn) SCI: TXINT/RXINT 中斷作為 SCI 的中斷源。
③FIFO 使能: 通過 SCIFFTX 寄存器的 SCIFFEN 位置 1, 使能 FIFO 模式。 在任何操作狀態(tài)下 SCIRST 都可以復(fù)位 FIFO 模式。
④寄存器有效: 所有 SCI 寄存器和 SCI FIFO 寄存器(SCIFFTX、 SCIFFRX 和SCIFFCT) 有效。
⑤中斷: FIFO 模式有兩個中斷, 一個是發(fā)送 FIFO 中斷 TXINT, 另一個是接收 FIFO 中斷 RXINT。 FIFO 接收、 接收錯誤和接收 FIFO 溢出共用 RXINT 中斷。 標(biāo)準(zhǔn) SCI 的 TXINT 將被禁止, 該中斷將作為 SCI 發(fā)送 FIFO 中斷使用。
⑥緩沖: 發(fā)送和接收緩沖器增補了 2 個 16 級的 FIFO, 發(fā)送 FIFO 寄存器是 8位寬, 接收 FIFO 寄存器是 10 位寬。 標(biāo)準(zhǔn) SCI 的一個字的發(fā)送緩沖器作為發(fā)送FIFO 和移位寄存器間的發(fā)送緩沖器。 只有移位寄存器的最后一位被移出后, 一個字的發(fā)送緩沖才發(fā)送 FIFO 裝載。 使能 FIFO 后, 經(jīng)過一個可選擇的延遲(SCIFFCT) , TXSHF 被直接裝載而不再使用 TXBUF。
⑦延遲發(fā)送: FIFO 中的數(shù)據(jù)傳送到發(fā)送移位寄存器的速率是可編程的, 可以通過 SCIFFCT 寄存器的位 FFTXDLY(7~0)設(shè)置發(fā)送數(shù)據(jù)間的延遲。 FFTXTDLY(7~0)確定延遲的 SCI 波特率時鐘周期數(shù), 8 位寄存器可以定義從 0 個波特率時鐘周期的最小延遲到 256 個波特率時鐘周期的最大延遲。 當(dāng)使用 0 延遲時, SCI 模塊的FIFO 數(shù)據(jù)移出時, 數(shù)據(jù)間沒有延時, 一位緊接一位的從 FIFO 移出, 實現(xiàn)數(shù)據(jù)的連續(xù)發(fā)送。 當(dāng)選擇 256 個波特率時鐘的延遲時, SCI 模塊工作在最大延遲模式, FIFO 移出的每個數(shù)據(jù)字之間有 256 個波特率時鐘的延遲。 在慢速 SCI/UART 的通信時, 可編程延遲可以減少 CPU 對 SCI 通信的開銷。
⑧FIFO 狀態(tài)位: 發(fā)送和接收 FIFO 都有狀態(tài)位 TXFFST 或 RXFFST(位 12~0) ,這些狀態(tài)位顯示當(dāng)前FIFO內(nèi)數(shù)據(jù)的個數(shù)。當(dāng)狀態(tài)位為0時, 發(fā)送FIFO復(fù)位TXFIFO和接收復(fù)位位 RXFIFO 會被設(shè)置為 1, 會將 FIFO 指針復(fù)位為 0, FIFO 重新開始運行。
⑨可編程的中斷級: 發(fā)送和接收 FIFO 都能產(chǎn)生 CPU 中斷, 只要發(fā)送 FIFO 狀態(tài)位 TXFFST(位 12-8) 與中斷觸發(fā)優(yōu)先級 TXFFIL(位 4-0) 相匹配, 就產(chǎn)生一個中斷觸發(fā), 從而為 SCI 的發(fā)送和接收提供一個可編程的中斷觸發(fā)邏輯。
UartDriver.c
/** UartDriver.c** Created on: 2024年8月8日* Author: Paranoid*/#include "main.h"//
// Defines
//
// Define AUTOBAUD to use the autobaud lock feature
//#define AUTOBAUD//
// Globals
//
uint16_t loopCounter = 0;//
// Function Prototypes
//__interrupt void Scia_RX_INT_ISR(void);
__interrupt void Scia_TX_INT_ISR(void);
//
// Main
//
void SciaDriver_Init(