作者: TI 北方區(qū)工程師 Young Hu 和 Jingyuan Zhao
引言:
C2000 Piccolo系列MCU芯片內(nèi)部一般都集成了1-2個硬件SCI (UART) 。有時出于成本或者Layout面積的考慮,只能選擇小封裝或資源較少的型號,那么就會出現(xiàn)硬件SCI不夠用的情況。這時便可使用GPIO軟件模擬成SCI接口。
本文給出了使用外部中斷和CPU定時器將GPIO模擬成SCI接口的方法和例程。
一、測試相關環(huán)境
測試相關的軟硬件環(huán)境如下表所示:
CCS Version6.2.0.00050
Compiler VersionTI v15.12.3.LTS
ControlSUITEV3.4.9
測試芯片型號TMS320F28069M
硬件環(huán)境LAUNCHXL-F28069M
GPIO引腳使用TX: GPIO33 RX: GPIO0
硬件資源使用CPU_Timer0, XINT3
您可以選擇任意示例工程,這里選擇的工程為timed_led_blink,它的工程文件的目錄為:
C:\ti\controlSUITE\device_support\f2806x\v151\F2806x_examples_ccsv5\timed_led_blink
在CCS中import該工程后,將Example_2806xLEDBlink.c替換為本文提供的源碼即可。
二、 功能描述
SCI (Serial Communications Interface, 串行通信接口) 是一種雙線異步串行接口,通常也被稱為UART。SCI提供了與一些常用外設的通信接口。SCI的數(shù)據(jù)幀格式,如圖1所示,通常由以下部分組成:
1 bit 起始位:一位邏輯0,表示傳輸開始。
1-8 bit 數(shù)據(jù)位:小端傳輸,先傳輸?shù)臀辉賯鬏敻呶弧?/p>
1 bit奇偶校驗位(可選):加上這一位后使數(shù)據(jù)位1的個數(shù)為奇數(shù)或者偶數(shù)。
1或2 bit停止位:一位或兩位邏輯1,表示傳輸結束。
圖1 SCI數(shù)據(jù)幀格式
1. 發(fā)送程序框圖和發(fā)送狀態(tài)機
發(fā)送使能后,CPU定時器打開,每隔8.67us(115200 bps)產(chǎn)生一次中斷,在定時器中斷發(fā)生時改變引腳的輸出電平實現(xiàn)數(shù)據(jù)發(fā)送。第一個定時器中斷時,發(fā)送引腳電平置低,標志數(shù)據(jù)發(fā)送開始。之后以小端模式從低位到高位依次發(fā)送數(shù)據(jù)位、校驗位。采用奇校驗時,數(shù)據(jù)按位異或的結果和校驗位的異或結果應為1;采用偶校驗時,數(shù)據(jù)按位異或的結果和校驗位的異或結果應為0。傳輸結束后,發(fā)送引腳輸出一位高電平,標志發(fā)送結束。
2. 接收程序框圖和接收狀態(tài)機
接收使能后,開啟外部中斷。SCI接收引腳在空閑狀態(tài)下處于高電平,接收數(shù)據(jù)的起始位為低電平。由于數(shù)據(jù)到來時間的不確定,故采用外部中斷下降沿觸發(fā)的方式檢測數(shù)據(jù)傳輸?shù)钠鹗嘉弧M獠恐袛鄼z測到下降沿后,標志數(shù)據(jù)傳輸開始。此時先延時4us,等待信號電平穩(wěn)定,然后關閉外部中斷,打開定時器。與發(fā)送相同,定時器每8.67us產(chǎn)生一次中斷。每次中斷產(chǎn)生時,對接收引腳的電平進行采樣,依次接收數(shù)據(jù)位、校驗位和停止位。當所有數(shù)據(jù)接收完成后,關閉定時器,等待接收下次使能。
3. 功能描述
波特率: 115200 bps (可調(diào)), 停止位:1 bit,數(shù)據(jù)位:1-8 bit,校驗位:無校驗、奇校驗或偶校驗??筛鶕?jù)實際需求在宏定義中修改recvBuffLen確定接收緩沖區(qū)大?。?/p>
#define recvBuffLen 800
以接收緩沖區(qū)大小為800 Bytes為例,每當程序從GPIO0接收滿800 Bytes數(shù)據(jù)后,就會把全部接收到的數(shù)據(jù)通過GPIO32發(fā)出。
三、API
1. 宏定義
#define parity 1 // 0: no parity, 1: odd, 2: even
#define dataLength 8 // data bit length 1 - 8
#define recvBuffLen 25 // receive buffer size
parity:校驗位。可設置為0:無校驗,1:奇校驗,2:偶校驗。
dataLength:數(shù)據(jù)位長度,可配置為1-8比特。
recvBuffLen:接收緩沖區(qū)大小,通??稍O置為數(shù)據(jù)包長度。
2. 全局變量
// software sci mode
// 0: rx 1: tx
Uint16 swSciMode = 0;
// rx data & state
Uint16 rxData = 0;
Uint16 rxState = 0;
Uint16 rxError = 0;
// tx data & state
Uint16 txData = 0;
Uint16 txState = 0;
swSciMode:定義軟件串口模式。為節(jié)省硬件資源,采用半雙工模式。0為接收模式,1為發(fā)送模式。
rxData:從GPIO接收到的單字節(jié)數(shù)據(jù)。
rxState:接收程序狀態(tài)機狀態(tài),0-3為有效狀態(tài),詳見圖3。
rxError:接收錯誤指示標志,在調(diào)用接收相關API后值會相應改變,需手動清零。具體定義如下:
0x000x010x020x03
接收正常校驗錯誤未檢測到停止位停止位+校驗位錯誤
txData:從GPIO發(fā)送到的單字節(jié)數(shù)據(jù)。
txState:發(fā)送程序狀態(tài)機狀態(tài),0-5為有效狀態(tài),詳見圖2。
3. 函數(shù)
// Software SCI related functions
Uint16 sw_sci_recv_byte(void);
void sw_sci_recv_bytes(Uint16* dataBuff, Uint16 len);
void sw_sci_send_byte(Uint16 data);
void sw_sci_send_bytes(Uint16* dataBuff, Uint16 len);
void sw_sci_send_string(char* txString);
函數(shù)名稱功能描述
Uint16 sw_sci_recv_byte(void)返回GPIO0接收到的單字節(jié)數(shù)據(jù)。
void sw_sci_recv_bytes(Uint16*dataBuff, Uint16 len)從GPIO0接收len個字節(jié)數(shù)據(jù)存入緩沖區(qū)dataBuff中。
void sw_sci_send_byte(Uint16 data);使用GPIO33發(fā)送單字節(jié)數(shù)據(jù)。
void sw_sci_send_bytes(Uint16* dataBuff, Uint16 len)使用GPIO33發(fā)送dataBuff中l(wèi)en個連續(xù)字節(jié)數(shù)據(jù)。
void sw_sci_send_string(char* txString);使用GPIO33發(fā)送字符串txString。txString必須以\0結尾,方便用戶調(diào)試使用。
四、測試
1. 波特率及CPU負載測試
為測試軟件SCI的性能,本例程額外使用了GPIO32作為測試引腳用于指示程序狀態(tài)。當程序進入軟件SCI定時器中斷時,GPIO32輸出高電平;其余時間GPIO32輸出低電平。圖4為8位數(shù)據(jù)位、1位奇校驗、1位停止位、115200波特率下,發(fā)送0x55時TX引腳(藍線)和測試引腳(黃線)的波形。從圖中可以看出,實際發(fā)送波特率為116280bps,誤差0.9%。測試引腳的高電平持續(xù)時間和,即為軟件SCI發(fā)送單字節(jié)數(shù)據(jù)占用CPU的時間。經(jīng)過測量,測試引腳高電平共持續(xù)10.32us,單字節(jié)理論發(fā)送時間為95.49us,故發(fā)送時CPU負載為10.8%。
圖4軟件串口例程發(fā)送測試
圖5為8位數(shù)據(jù)位、1位奇校驗、1位停止位、115200波特率下,接收0x55時RX引腳(藍線)和測試引腳(黃線)的波形。經(jīng)過測量,測試引腳高電平共持續(xù)7.2us,單字節(jié)理論接收時間為95.49us,故接收時CPU負載為7.5%。
圖5軟件串口例程接收測試
在沒有示波器的情況下也可使用C2000 MCU內(nèi)部的eCAP測量實際發(fā)送波特率和CPU負載。
2. 數(shù)據(jù)收發(fā)測試
軟件串口例程配置為115200波特率、8bit數(shù)據(jù)位、1停止位、奇校驗,PC端串口助手采用相同配置時,數(shù)據(jù)可以正常收發(fā):
將串口助手軟件改為偶校驗,例程提示校驗位錯誤:
軟件串口例程配置為無校驗位,串口助手采用奇校驗時,例程實際在接收結束位時接收到的是校驗位,此時例程提示結束位錯誤:
例程和串口助手采用相同配置時,以5Hz頻率發(fā)送800 Bytes數(shù)據(jù)包,收發(fā)正常:
五、注意事項
1. 改變通信波特率可通過調(diào)整CPU定時器的分頻系數(shù)實現(xiàn)。
理論分頻系數(shù) =
以LAUNCHXL-F28069M 為例,LAUNCHXL-F28069M主頻為90 MHz。理論分頻系數(shù)應為:
實際使用時由于系統(tǒng)時鐘會有誤差,推薦使用示波器測量實際輸出波特率對分頻系數(shù)進行調(diào)整。
2. TX引腳可根據(jù)需求更改至任意引腳。RX引腳需要通過外部中斷下降沿判斷數(shù)據(jù)起始位,所以只能在GPIO0-GPIO31中進行選擇。
3. 為節(jié)省硬件資源,接收和發(fā)送程序使用同一CPU定時器,所以僅能進行半雙工通信。若想實現(xiàn)全雙工通信可再多使用一個定時器將發(fā)送和接收分開。
六、待辦事項
1. 增加使用eCAP測量波特率和CPU負載功能。
2. 增加波特率自動校正功能。
審核編輯:何安
-
嵌入式處理
+關注
關注
0文章
341瀏覽量
10074
發(fā)布評論請先 登錄
相關推薦
評論