轉(zhuǎn)載happysaisai的博客
DSP具有很強(qiáng)的數(shù)據(jù)處理能力使其在高速數(shù)字信號(hào)處理方面得到廣泛的應(yīng)用。通用異步接收發(fā)送器(UART)是異步串行通訊設(shè)備,它能在發(fā)射機(jī)的末端將并行數(shù)據(jù)轉(zhuǎn)換成串行數(shù)據(jù),并在接收機(jī)的末端將串行數(shù)據(jù)轉(zhuǎn)換成并行數(shù)據(jù)。該設(shè)備可以實(shí)現(xiàn)EIA-232E(也稱(chēng)作RS-232)標(biāo)準(zhǔn)的全雙工串行通信鏈路。
TI的很多DSP產(chǎn)品不帶有UART接口,為了實(shí)現(xiàn)串行通信,很多情況下都要用軟件對(duì)相應(yīng)的接口編程來(lái)模擬異步串口。而ADSP-21369芯片有2個(gè)UART,支持串口數(shù)據(jù)的全雙工傳輸,兩個(gè)專(zhuān)用DMA通道和異步傳輸。UART功能原理框圖如下圖所示。
UART功能原理框圖
UART Functional Block Diagram
典型的UART數(shù)據(jù)幀如下圖所示,它包含一個(gè)起始位、數(shù)據(jù)位和一個(gè)停止位。奇偶校驗(yàn)位用于檢驗(yàn)數(shù)據(jù)錯(cuò)誤,可以設(shè)置為偶校驗(yàn)或奇校驗(yàn)。一幀(不包含起始位、停止位和奇偶校驗(yàn)位)中的數(shù)據(jù)長(zhǎng)度從5到8位之間變化。每幀停止位的數(shù)目可以編程為1或2。考慮到所有的情況,一個(gè)UART數(shù)據(jù)幀的長(zhǎng)度在7到12位之間變化。幀的起始位為低有效,在下降沿檢測(cè);停止位為高有效,在上升沿檢測(cè)。對(duì)于某次通信發(fā)送端和接收端的波特率必須相同。
UART數(shù)據(jù)幀
UART data frame
- 同步效應(yīng)
當(dāng)兩個(gè)UART通信時(shí),發(fā)送端和接收端按數(shù)據(jù)發(fā)送的波特率工作。發(fā)送端以給定的波特率發(fā)送數(shù)據(jù),接收端檢測(cè)到幀的起始位之后開(kāi)始以同樣的波特率對(duì)數(shù)據(jù)采樣。因?yàn)榻邮斩瞬恢罃?shù)據(jù)幀何時(shí)到來(lái),所以這種通信方式被稱(chēng)作異步通信。因?yàn)榻邮斩艘獧z測(cè)幀的起始位,接收端的邏輯要比發(fā)送端復(fù)雜。
由通信協(xié)議可知,接收端產(chǎn)生的接收時(shí)鐘頻率是波特率的16倍。圖4.3所示是接收端使用的同步數(shù)據(jù)幀的協(xié)議。當(dāng)數(shù)據(jù)信號(hào)從停止位或空閑狀態(tài)過(guò)渡時(shí),接收端在低有效起始位的下降沿檢測(cè)幀的起始位。在起始位的下降沿,接收端將其時(shí)鐘計(jì)數(shù)器復(fù)位并在8個(gè)時(shí)鐘周期后找到起始位的重點(diǎn)。在中點(diǎn)對(duì)起始位重采樣以便驗(yàn)證之前檢測(cè)到的下降沿不是噪聲或干擾。在16個(gè)時(shí)鐘周期之后對(duì)下一位采樣,也就是下圖中的D0位的中點(diǎn)。
UART同步效果
UART synchronization effects
因?yàn)閁ART接收器在每一幀的開(kāi)始重新同步,前面幀的采樣錯(cuò)誤(除了停止位之外)不會(huì)累加。因此,采樣錯(cuò)誤只限于一個(gè)數(shù)據(jù)幀,與整個(gè)發(fā)送數(shù)據(jù)無(wú)關(guān)。經(jīng)常由于接收時(shí)鐘和接收數(shù)據(jù)幀的同步錯(cuò)誤而導(dǎo)致采樣錯(cuò)誤。該錯(cuò)誤會(huì)影響整個(gè)幀,它將數(shù)據(jù)位的采樣點(diǎn)移到更靠近過(guò)渡邊沿的地方。由于這些過(guò)渡邊沿上升和下降緩慢,該錯(cuò)誤可能導(dǎo)致數(shù)據(jù)檢測(cè)錯(cuò)誤。過(guò)渡邊沿的緩慢上升和下降是發(fā)送電纜的高阻抗導(dǎo)致的。當(dāng)停止位被采樣為低而不是高時(shí),幀錯(cuò)誤就出現(xiàn)了。因?yàn)樘幚砥鞫说腢ART波特率由處理器的外部時(shí)鐘產(chǎn)生,所需的波特率產(chǎn)生可能不精確。這會(huì)進(jìn)一步導(dǎo)致發(fā)送端的時(shí)序變化,在接收端就可能出現(xiàn)采樣錯(cuò)誤。
2、編程技巧
(1)全雙工DMA
因?yàn)閁ART是一個(gè)全雙工外設(shè),發(fā)送器和接收器同時(shí)工作并相互獨(dú)立。當(dāng)在環(huán)路模式中進(jìn)行全雙工DMA時(shí)(在這里發(fā)送器的輸出與接收器的輸入相連),要保證UART的接收端在使能發(fā)送端之前被使能,以避免接收端的數(shù)據(jù)丟失。
匯編代碼見(jiàn)附錄A。
(2)UART中斷
在I/O模式下使能UART中斷需要兩步。在I/O模式中用UART中斷要謹(jǐn)慎,因?yàn)樗闹袛啾焕壋梢粋(gè)單一的接收中斷。首先要將UART中斷映射為中斷向量表中的中斷之一。通過(guò)對(duì)DAI中斷控制寄存器編程或?qū)ART映射到任何一個(gè)外設(shè)中斷源,直接使用DAI中斷。這可以通過(guò)改變外設(shè)中斷優(yōu)先級(jí)控制寄存器的UART中斷的默認(rèn)設(shè)置來(lái)實(shí)現(xiàn),即選擇UART接收中斷。UART0和UART1的接收中斷選定值分別對(duì)應(yīng)0x13和0x14。
I/O模式下的第二步是在UART中斷使能寄存器(UARTxIER)中設(shè)置相應(yīng)的位以使能UART中斷。在所有UART設(shè)置(比如字長(zhǎng)、奇偶校驗(yàn)等)之后要從內(nèi)部使能中斷,因?yàn)樵诎l(fā)送模式下,一旦在UARTxIER寄存器對(duì)發(fā)送緩沖為空位使能,就會(huì)產(chǎn)生中斷。如果在其他的UART設(shè)置之前對(duì)該位使能,在發(fā)送中斷服務(wù)例程中的發(fā)送數(shù)據(jù)不會(huì)遵循以后通過(guò)編程對(duì)UART的設(shè)置,會(huì)導(dǎo)致通信錯(cuò)誤。在DMA模式中,對(duì)發(fā)送或接收DMA按照I/O模式步驟1中的介紹使能相應(yīng)的中斷就可以了。在DMA模式下,用戶(hù)不需要使用UARTxIER寄存器使能發(fā)送或接收中斷。但是對(duì)于奇偶校驗(yàn)錯(cuò)誤、溢出錯(cuò)誤、幀錯(cuò)誤或地址檢測(cè)錯(cuò)去引起的線(xiàn)狀態(tài)中斷,即使在DMA模式下,也要在UARTxIER寄存器中設(shè)置相應(yīng)的中斷位。
在VisualDSP++中運(yùn)行或單步調(diào)試代碼時(shí),如果使用了UART中斷,不要打開(kāi)UART寄存器窗口(UART寄存器窗口對(duì)外設(shè)的中斷狀態(tài)有影響)。如果打開(kāi)了該窗口會(huì)清除中斷鎖存器,仿真器會(huì)不斷的對(duì)這些寄存器進(jìn)行讀操作。
3. 與PC通信
與PC通信要保證UART的內(nèi)部編程設(shè)置和串口調(diào)試助手的COM端口的配置相匹配。與PC通信的UART初始化過(guò)程代碼如下。程序中對(duì)UART的設(shè)置和圖4.4中對(duì)串口調(diào)試助手的配置相匹配。
void initUART( )
{
/* 設(shè)置UART0的波特率*/
*pUART0LCR = UARTDLAB;
// 使能Divisor Latch High/Low 寄存器(UARTxDLL,UARTxDLLH)來(lái)設(shè)置波特率
*pUART0DLL = 0x1c;
*pUART0DLH=0x02;
//除數(shù)值為0x21c = 540,時(shí)鐘頻率為331.776MHz 的情況下,波特率為19200
/* 配置UART0 LCR寄存器*/
*pUART0LCR = UARTWLS8| // 字長(zhǎng)為8
UARTPEN| // 奇校驗(yàn)
UARTSTB ; // 2個(gè)停止位
*pUART0RXCTL = UARTEN; //使能UART0 接收模式
*pUART0TXCTL = UARTEN; //使能UART0傳送模式
xmitUARTmessage(welcomemessage,sizeof(welcomemessage)); //傳送歡迎信息
}
串口調(diào)試助手的設(shè)置
Configuring of serial debugging assistant