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