作者: TI 北方區工程師 Young Hu 和 Jingyuan Zhao
引言:
C2000 Piccolo系列MCU芯片內部一般都集成了1-2個硬件SCI (UART) 。有時出于成本或者Layout面積的考慮,只能選擇小封裝或資源較少的型號,那么就會出現硬件SCI不夠用的情況。這時便可使用GPIO軟件模擬成SCI接口。
本文給出了使用外部中斷和CPU定時器將GPIO模擬成SCI接口的方法和例程。
一、測試相關環境
測試相關的軟硬件環境如下表所示:
CCS Version6.2.0.00050
Compiler VersionTI v15.12.3.LTS
ControlSUITEV3.4.9
測試芯片型號TMS320F28069M
硬件環境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的數據幀格式,如圖1所示,通常由以下部分組成:
1 bit 起始位:一位邏輯0,表示傳輸開始。
1-8 bit 數據位:小端傳輸,先傳輸低位再傳輸高位。
1 bit奇偶校驗位(可選):加上這一位后使數據位1的個數為奇數或者偶數。
1或2 bit停止位:一位或兩位邏輯1,表示傳輸結束。
圖1 SCI數據幀格式
1. 發送程序框圖和發送狀態機
發送使能后,CPU定時器打開,每隔8.67us(115200 bps)產生一次中斷,在定時器中斷發生時改變引腳的輸出電平實現數據發送。第一個定時器中斷時,發送引腳電平置低,標志數據發送開始。之后以小端模式從低位到高位依次發送數據位、校驗位。采用奇校驗時,數據按位異或的結果和校驗位的異或結果應為1;采用偶校驗時,數據按位異或的結果和校驗位的異或結果應為0。傳輸結束后,發送引腳輸出一位高電平,標志發送結束。
2. 接收程序框圖和接收狀態機
接收使能后,開啟外部中斷。SCI接收引腳在空閑狀態下處于高電平,接收數據的起始位為低電平。由于數據到來時間的不確定,故采用外部中斷下降沿觸發的方式檢測數據傳輸的起始位。外部中斷檢測到下降沿后,標志數據傳輸開始。此時先延時4us,等待信號電平穩定,然后關閉外部中斷,打開定時器。與發送相同,定時器每8.67us產生一次中斷。每次中斷產生時,對接收引腳的電平進行采樣,依次接收數據位、校驗位和停止位。當所有數據接收完成后,關閉定時器,等待接收下次使能。
3. 功能描述
波特率: 115200 bps (可調), 停止位:1 bit,數據位:1-8 bit,校驗位:無校驗、奇校驗或偶校驗。可根據實際需求在宏定義中修改recvBuffLen確定接收緩沖區大小:
#define recvBuffLen 800
以接收緩沖區大小為800 Bytes為例,每當程序從GPIO0接收滿800 Bytes數據后,就會把全部接收到的數據通過GPIO32發出。
三、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:數據位長度,可配置為1-8比特。
recvBuffLen:接收緩沖區大小,通常可設置為數據包長度。
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:定義軟件串口模式。為節省硬件資源,采用半雙工模式。0為接收模式,1為發送模式。
rxData:從GPIO接收到的單字節數據。
rxState:接收程序狀態機狀態,0-3為有效狀態,詳見圖3。
rxError:接收錯誤指示標志,在調用接收相關API后值會相應改變,需手動清零。具體定義如下:
0x000x010x020x03
接收正常校驗錯誤未檢測到停止位停止位+校驗位錯誤
txData:從GPIO發送到的單字節數據。
txState:發送程序狀態機狀態,0-5為有效狀態,詳見圖2。
3. 函數
// 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);
函數名稱功能描述
Uint16 sw_sci_recv_byte(void)返回GPIO0接收到的單字節數據。
void sw_sci_recv_bytes(Uint16*dataBuff, Uint16 len)從GPIO0接收len個字節數據存入緩沖區dataBuff中。
void sw_sci_send_byte(Uint16 data);使用GPIO33發送單字節數據。
void sw_sci_send_bytes(Uint16* dataBuff, Uint16 len)使用GPIO33發送dataBuff中len個連續字節數據。
void sw_sci_send_string(char* txString);使用GPIO33發送字符串txString。txString必須以\0結尾,方便用戶調試使用。
四、測試
1. 波特率及CPU負載測試
為測試軟件SCI的性能,本例程額外使用了GPIO32作為測試引腳用于指示程序狀態。當程序進入軟件SCI定時器中斷時,GPIO32輸出高電平;其余時間GPIO32輸出低電平。圖4為8位數據位、1位奇校驗、1位停止位、115200波特率下,發送0x55時TX引腳(藍線)和測試引腳(黃線)的波形。從圖中可以看出,實際發送波特率為116280bps,誤差0.9%。測試引腳的高電平持續時間和,即為軟件SCI發送單字節數據占用CPU的時間。經過測量,測試引腳高電平共持續10.32us,單字節理論發送時間為95.49us,故發送時CPU負載為10.8%。
圖4軟件串口例程發送測試
圖5為8位數據位、1位奇校驗、1位停止位、115200波特率下,接收0x55時RX引腳(藍線)和測試引腳(黃線)的波形。經過測量,測試引腳高電平共持續7.2us,單字節理論接收時間為95.49us,故接收時CPU負載為7.5%。
圖5軟件串口例程接收測試
在沒有示波器的情況下也可使用C2000 MCU內部的eCAP測量實際發送波特率和CPU負載。
2. 數據收發測試
軟件串口例程配置為115200波特率、8bit數據位、1停止位、奇校驗,PC端串口助手采用相同配置時,數據可以正常收發:
將串口助手軟件改為偶校驗,例程提示校驗位錯誤:
軟件串口例程配置為無校驗位,串口助手采用奇校驗時,例程實際在接收結束位時接收到的是校驗位,此時例程提示結束位錯誤:
例程和串口助手采用相同配置時,以5Hz頻率發送800 Bytes數據包,收發正常:
五、注意事項
1. 改變通信波特率可通過調整CPU定時器的分頻系數實現。
理論分頻系數 =
以LAUNCHXL-F28069M 為例,LAUNCHXL-F28069M主頻為90 MHz。理論分頻系數應為:
實際使用時由于系統時鐘會有誤差,推薦使用示波器測量實際輸出波特率對分頻系數進行調整。
2. TX引腳可根據需求更改至任意引腳。RX引腳需要通過外部中斷下降沿判斷數據起始位,所以只能在GPIO0-GPIO31中進行選擇。
3. 為節省硬件資源,接收和發送程序使用同一CPU定時器,所以僅能進行半雙工通信。若想實現全雙工通信可再多使用一個定時器將發送和接收分開。
六、待辦事項
1. 增加使用eCAP測量波特率和CPU負載功能。
2. 增加波特率自動校正功能。
審核編輯:何安
-
嵌入式處理
+關注
關注
0文章
341瀏覽量
10019
發布評論請先 登錄
相關推薦
評論