AVR單片機(學(xué)習ing)-ATMEGA16的USART與PC機串行通信
7、數據發(fā)送—USART發(fā)送器
置位UCSRB 寄存器的發(fā)送允許位TXEN 將使能USART 的數據發(fā)送。使能后TxD 引腳
的通用I/O 功能即被USART 功能所取代,成為發(fā)送器的串行輸出引腳。發(fā)送數據之前要
設置好波特率、工作模式與幀結構。如果使用同步發(fā)送模式,施加于XCK 引腳上的時(shí)鐘
信號即為數據發(fā)送的時(shí)鐘。
1)發(fā)送5 到8 位數據位的幀
將需要發(fā)送的數據加載到發(fā)送緩存器將啟動(dòng)數據發(fā)送。加載過(guò)程即為CPU 對UDR 寄存
器的寫(xiě)操作。當移位寄存器可以發(fā)送新一幀數據時(shí),緩沖的數據將轉移到移位寄存器。當
移位寄存器處于空閑狀態(tài)( 沒(méi)有正在進(jìn)行的數據傳輸),或前一幀數據的最后一個(gè)停止位
傳送結束,它將加載新的數據。一旦移位寄存器加載了新的數據,就會(huì )按照設定的波特率
完成數據的發(fā)送
以下程序給出一個(gè)對UDRE 標志采用輪詢(xún)方式發(fā)送數據的例子。當發(fā)送的數據少于8 位
時(shí),寫(xiě)入UDR 相應位置的高幾位將被忽略。當然,執行本段代碼之前首先要初始化
USART。在匯編代碼中要發(fā)送的數據存放于R16。
void USART_Transmit( unsigned char data )
{
while ( !( UCSRA & (1<
UDR = data;
}
2)發(fā)送9位數據的幀
TXB8,然后再將低8位數據寫(xiě)入發(fā)送數據寄存器UDR。以下程序給出發(fā)送9位數據的數據
幀例子。在匯編代碼中要發(fā)送的數據存放在R17:R16 寄存器中。
void USART_Transmit( unsigned int data )
{
while ( !( UCSRA & (1<
UCSRB &= ~(1<
UCSRB |= (1<
UDR = data;
}
第9 位數據在多機通信中用于表示地址幀,在同步通信中可以用于協(xié)議處理。
3)傳送標志位與中斷
USART 發(fā)送器有兩個(gè)標志位:USART 數據寄存器空標志UDRE 及傳輸結束標志TXC,兩
個(gè)標志位都可以產(chǎn)生中斷。
數據寄存器空UDRE 標志位表示發(fā)送緩沖器是否可以接受一個(gè)新的數據。該位在發(fā)送緩
沖器空時(shí)被置"1” ;當發(fā)送緩沖器包含需要發(fā)送的數據時(shí)清零。為與將來(lái)的器件兼容,寫(xiě)
UCSRA 寄存器時(shí)該位要寫(xiě)"0”。
當UCSRB 寄存器中的數據寄存器空中斷使能位UDRIE 為"1” 時(shí),只要UDRE 被置位(
且全局中斷使能),就將產(chǎn)生USART 數據寄存器空中斷請求。對寄存器UDR 執行寫(xiě)操作
將清零UDRE。當采用中斷方式的傳輸數據時(shí),在數據寄存器空中斷服務(wù)程序中必須寫(xiě)一
個(gè)新的數據到UDR 以清零UDRE ;或者是禁止數據寄存器空中斷。否則一旦該中斷程序
結束,一個(gè)新的中斷將再次產(chǎn)生。
當整個(gè)數據幀移出發(fā)送移位寄存器,同時(shí)發(fā)送緩沖器中又沒(méi)有新的數據時(shí),發(fā)送結束標志
TXC 置位。TXC 在傳送結束中斷執行時(shí)自動(dòng)清零,也可在該位寫(xiě)"1” 來(lái)清零。TXC 標志位
對于采用如RS-485 標準的半雙工通信接口十分有用。在這些應用里,一旦傳送完畢,應
用程序必須釋放通信總線(xiàn)并進(jìn)入接收狀態(tài)。
當UCSRB 上的發(fā)送結束中斷使能位TXCIE 與全局中斷使能位均被置為"1” 時(shí),隨著(zhù)TXC
標志位的置位, USART 發(fā)送結束中斷將被執行。一旦進(jìn)入中斷服務(wù)程序, TXC 標志位
即被自動(dòng)清零,中斷處理程序不必執行TXC 清零操作。
4)奇偶校驗產(chǎn)生電路
奇偶校驗產(chǎn)生電路為串行數據幀生成相應的校驗位。校驗位使能(UPM1 = 1) 時(shí),發(fā)送控
制邏輯電路會(huì )在數據的最后一位與第一個(gè)停止位之間插入奇偶校驗位。
5)禁止發(fā)送器
TXEN 清零后,只有等到所有的數據發(fā)送完成后發(fā)送器才能夠真正禁止,即發(fā)送移位寄存
器與發(fā)送緩沖寄存器中沒(méi)有要傳送的數據。發(fā)送器禁止后,TxD引腳恢復其通用I/O功能。
8、數據接收—USART接收器
置位UCSRB 寄存器的接收允許位(RXEN) 即可啟動(dòng)USART 接收器。接收器使能后RxD
的普通引腳功能被USART 功能所取代,成為接收器的串行輸入口。進(jìn)行數據接收之前首
先要設置好波特率、操作模式及幀格式。 如果使用同步操作, XCK 引腳上的時(shí)鐘被用為
傳輸時(shí)鐘。
1)以5 到8 個(gè)數據位的方式接收數據幀
一旦接收器檢測到一個(gè)有效的起始位,便開(kāi)始接收數據。起始位后的每一位數據都將以所
設定的波特率或XCK 時(shí)鐘進(jìn)行接收,直到收到一幀數據的第一個(gè)停止位。接收到的數據
被送入接收移位寄存器。第二個(gè)停止位會(huì )被接收器忽略。 接收到第一個(gè)停止位后,接收移
位寄存器就包含了一個(gè)完整的數據幀。這時(shí)移位寄存器中的內容將被轉移到接收緩沖器
中。通過(guò)讀取UDR 就可以獲得接收緩沖器的內容的。
以下程序給出一個(gè)對RXC 標志采用輪詢(xún)方式接收數據的例子。當數據幀少于8 位時(shí),從
UDR 讀取的相應的高幾位為0。當然,執行本段代碼之前首先要初始化USART。
unsigned char USART_Receive( void )
{
while ( !(UCSRA & (1<
return UDR;
}
在讀緩沖器并返回之前,函數通過(guò)檢查RXC 標志來(lái)等待數據送入接收緩沖器。
2)以9 個(gè)數據位的方式接收幀
如果設定了9 位數據的數據幀(UCSZ=7),在從UDR 讀取低8 位之前必須首先讀取寄存
器UCSRB 的RXB8 以獲得第9 位數據。這個(gè)規則同樣適用于狀態(tài)標志位FE、DOR 及
UPE。狀態(tài)通過(guò)讀取UCSRA獲得,數據通過(guò)UDR獲得。讀取UDR存儲單元會(huì )改變接收緩
沖器FIFO 的狀態(tài),進(jìn)而改變同樣存儲在FIFO 中的TXB8、 FE、DOR 及UPE 位。
接下來(lái)的代碼示例展示了一個(gè)簡(jiǎn)單的USART接收函數,說(shuō)明如何處理9位數據及狀態(tài)位。
unsigned int USART_Receive( void )
{
unsigned char status, resh, resl;
while ( !(UCSRA & (1<
status = UCSRA;
resh = UCSRB;
resl = UDR;
if ( status & (1<
resh = (resh >> 1) & 0x01;
return ((resh << 8) | resl);
}
上述例子在進(jìn)行任何計算之前將所有的I/O寄存器的內容讀到寄存器文件中。 這種方法優(yōu)
化了對接收緩沖器的利用。它盡可能早地釋放了緩沖器以接收新的數據。、
3)接收結束標志及中斷
USART 接收器有一個(gè)標志用來(lái)指明接收器的狀態(tài)。
接收結束標志(RXC) 用來(lái)說(shuō)明接收緩沖器中是否有未讀出的數據。 當接收緩沖器中有未
讀出的數據時(shí),此位為1,當接收緩沖器空時(shí)為0( 即不包含未讀出的數據)。如果接收器
被禁止(RXEN = 0),接收緩沖器會(huì )被刷新,從而使RXC 清零。
置位UCSRB 的接收結束中斷使能位(RXCIE) 后,只要RXC 標志置位( 且全局中斷只能
) 就會(huì )產(chǎn)生USART 接收結束中斷。使用中斷方式進(jìn)行數據接收時(shí),數據接收結束中斷服
務(wù)程序程序必須從UDR 讀取數據以清RXC 標志,否則只要中斷處理程序一結束,一個(gè)
新的中斷就會(huì )產(chǎn)生。
4)接受錯誤標志
USART 接收器有三個(gè)錯誤標志::幀錯誤(FE)、數據溢出(DOR) 及奇偶校驗錯(UPE)。它
們都位于寄存器UCSRA。錯誤標志與數據幀一起保存在接收緩沖器中。由于讀取UDR
會(huì )改變緩沖器, UCSRA 的內容必須在讀接收緩沖器(UDR) 之前讀入。錯誤標志的另一
個(gè)同一性是它們都不能通過(guò)軟件寫(xiě)操作來(lái)修改。 但是為了保證與將來(lái)產(chǎn)品的兼容性,對
執行寫(xiě)操作是必須對這些錯誤標志所在的位置寫(xiě)"0“。所有的錯誤標志都不能產(chǎn)生中斷。
幀錯誤標志(FE) 表明了存儲在接收緩沖器中的下一個(gè)可讀幀的第一個(gè)停止位的狀態(tài)。停
止位正確( 為1) 則FE 標志為0,否則FE 標志為1。 這個(gè)標志可用來(lái)檢測同步丟失、傳
輸中斷,也可用于協(xié)議處理。UCSRC 中USBS 位的設置不影響FE 標志位,因為除了第
一位,接收器忽略所有其他的停止位。 為了與以后的器件相兼容,寫(xiě)UCSRA 時(shí)這一位必
須置0。
數據溢出標志(DOR) 表明由于接收緩沖器滿(mǎn)造成了數據丟失。當接收緩沖器滿(mǎn)( 包含了
兩個(gè)數據),接收移位寄存器又有數據,若此時(shí)檢測到一個(gè)新的起始位,數據溢出就產(chǎn)生
了。DOR 標志位置位即表明在最近一次讀取UDR 和下一次讀取UDR 之間丟失了一個(gè)或
更多的數據幀。 為了與以后的器件相兼容,寫(xiě)UCSRA 時(shí)這一位必須置0。當數據幀成功
地從移位寄存器轉入接收緩沖器后, DOR 標志被清零。
奇偶校驗錯標志 (UPE) 指出,接收緩沖器中的下一幀數據在接收時(shí)有奇偶錯誤。 如果不
使能奇偶校驗,那么UPE 位應清零。為了與以后的器件相兼容,寫(xiě)UCSRA 時(shí)這一位必
須置0。
5)奇偶校驗器
奇偶校驗模式位UPM1置位將啟動(dòng)奇偶校驗器。校驗的模式(偶校驗還是奇校驗)由UPM0
確定。奇偶校驗使能后,校驗器將計算輸入數據的奇偶并把結果與數據幀的奇偶位進(jìn)行比
較。 校驗結果將與數據和停止位一起存儲在接收緩沖器中。這樣就可以通過(guò)讀取奇偶校
驗錯誤標志位(UPE) 來(lái)檢查接收的幀中是否有奇偶錯誤。
如果下一個(gè)從接收緩沖器中讀出的數據有奇偶錯誤,并且奇偶校驗使能(UPM1 = 1),則
UPE 置位。直到接收緩沖器(UDR) 被讀取,這一位一直有效。
6)禁止接收器
與發(fā)送器對比,禁止接收器即刻起作用。正在接收的數據將丟失。禁止接收器(RXEN 清
零) 后,接收器將不再占用RxD 引腳;接收緩沖器FIFO 也會(huì )被刷新。緩沖器中的數據將
丟失。
7)刷新接收緩沖器
禁止接收器時(shí)緩沖器FIFO 被刷新,緩沖器被清空。導致未讀出的數據丟失。如果由于出
錯而必須在正常操作下刷新緩沖器,則需要一直讀取UDR 直到RXC 標志清零。下面的
代碼展示了如何刷新接收緩沖器。
void USART_Flush( void )
{
unsigned char dummy;
while ( UCSRA & (1<
評論