新聞中心

EEPW首頁 > 嵌入式系統(tǒng) > 設(shè)計(jì)應(yīng)用 > AVR學(xué)習(xí)心得(四)

AVR學(xué)習(xí)心得(四)

作者: 時(shí)間:2016-11-10 來源:網(wǎng)絡(luò) 收藏
AVR mega128簡(jiǎn)單的串行通訊原理


單片機(jī)同PC通訊是用的都是UART進(jìn)行通訊,其實(shí)各種單片機(jī)的串行通訊原理是完全相同的,而不同的僅僅是器控制的寄存器不同。對(duì)于mega128來說比51功能強(qiáng)大些,完全不用占用任何別的資源。只要控制好相應(yīng)的寄存器就好了。

ATmega128具有兩個(gè)USART:USART0和USART1,這兩個(gè)USART的具體功能將在下面描述。USART0和USART1使用不同的IO寄存器注意:在ATmega103兼容模式中USART1.UBRR0H和UCRS0C無效.這意味ATmega128僅可以使用USART0以異步方式工作

本文引用地址:http://butianyuan.cn/article/201611/317329.htm

USARTn 數(shù)據(jù)寄存器-UDRn:接受和發(fā)送數(shù)據(jù)寄存器

只有當(dāng)UCSRA寄存器的UDRE標(biāo)志置位后才可以對(duì)發(fā)送緩沖器進(jìn)行寫操作。如果UDRE沒有置位,那么寫入U(xiǎn)DR 的數(shù)據(jù)會(huì)被USART 發(fā)送器忽略。當(dāng)數(shù)據(jù)寫入發(fā)送緩沖器后,若移位寄存器為空,發(fā)送器將把數(shù)據(jù)加載到發(fā)送移位寄存器。然后數(shù)據(jù)串行地從TxD 引腳輸出。
接收緩沖器包括一個(gè)兩級(jí)FIFO,一旦接收緩沖器被尋址FIFO 就會(huì)改變它的狀態(tài)。因此不要對(duì)這一存儲(chǔ)單元使用讀- 修改- 寫指令(SBI 和CBI)。使用位查詢指令(SBIC 和SBIS)時(shí)也要小心,因?yàn)檫@也有可能改變FIFO 的狀態(tài)。

USARTn 控制和狀態(tài)寄存器A -UCSRnA:

&8226;Bit 7 – RXCn: USART 接收結(jié)束
接收緩沖器中有未讀出的數(shù)據(jù)時(shí)RXCn 置位,否則清零。接收器禁止時(shí),接收緩沖器被刷新,導(dǎo)致RXCn 清零。RXCn 標(biāo)志可用來產(chǎn)生接收結(jié)束中斷( 見對(duì)RXCIEn 位的描述)。
&8226; Bit 6 – TXCn: USART 發(fā)送結(jié)束
發(fā)送移位緩沖器中的數(shù)據(jù)被送出,且當(dāng)發(fā)送緩沖器 (UDRn) 為空時(shí)TXCn 置位。執(zhí)行發(fā)送結(jié)束中斷時(shí)TXCn 標(biāo)志自動(dòng)清零,也可以通過寫1 進(jìn)行清除操作。TXCn 標(biāo)志可用來產(chǎn)生發(fā)送結(jié)束中斷( 見對(duì)TXCIEn 位的描述)。
&8226; Bit 5 – UDREn: USART 數(shù)據(jù)寄存器空
UDREn 標(biāo)志指出發(fā)送緩沖器(UDRn) 是否準(zhǔn)備好接收新數(shù)據(jù)。UDREn 為1 說明緩沖器為空,已準(zhǔn)備好進(jìn)行數(shù)據(jù)接收。UDREn 標(biāo)志可用來產(chǎn)生數(shù)據(jù)寄存器空中斷( 見對(duì)UDRIEn位的描述)。復(fù)位后UDREn 置位,表明發(fā)送器已經(jīng)就緒。
&8226; Bit 4 – FEn: 幀錯(cuò)誤
如果接收緩沖器接收到的下一個(gè)字符有幀錯(cuò)誤,即接收緩沖器中的下一個(gè)字符的第一個(gè)停止位為0,那么FEn 置位。這一位一直有效直到接收緩沖器(UDRn) 被讀取。當(dāng)接收到的停止位為1 時(shí), FEn 標(biāo)志為0。對(duì)UCSRnA 進(jìn)行寫入時(shí),這一位要寫0。
&8226; Bit 3 – DORn: 數(shù)據(jù)過速
數(shù)據(jù)過速時(shí)DORn 置位。當(dāng)接收緩沖器滿( 包含了兩個(gè)數(shù)據(jù)),接收移位寄存器又有數(shù)據(jù),若此時(shí)檢測(cè)到一個(gè)新的起始位,數(shù)據(jù)溢出就產(chǎn)生了。這一位一直有效直到接收緩沖器(UDRn) 被讀取。對(duì)UCSRnA 進(jìn)行寫入時(shí),這一位要寫0。
&8226; Bit 2 – UPEn: 奇偶校驗(yàn)錯(cuò)誤

當(dāng)奇偶校驗(yàn)使能(UPMn1 = 1),且接收緩沖器中所接收到的下一個(gè)字符有奇偶校驗(yàn)錯(cuò)誤時(shí)UPEn 置位。這一位一直有效直到接收緩沖器 (UDRn) 被讀取。對(duì)UCSRnA 進(jìn)行寫入時(shí),這一位要寫0。
&8226; Bit 1 – U2Xn: 倍速發(fā)送
這一位僅對(duì)異步操作有影響。使用同步操作時(shí)將此位清零。此位置1 可將波特率分頻因子從16 降到8,從而有效的將異步通信模式的傳輸速率加倍。
&8226; Bit 0 – MPCMn: 多處理器通信模式
設(shè)置此位將啟動(dòng)多處理器通信模式。MPCMn 置位后, USARTn 接收器接收到的那些不包含地址信息的輸入幀都將被忽略。發(fā)送器不受MPCMn 設(shè)置的影響。

USARTn 控制和狀態(tài)寄存器B -UCSRnB:

&8226; Bit 7 – RXCIEn: 接收結(jié)束中斷使能
置位后使能RXCn 中斷。當(dāng)RXCIEn 為1,全局中斷標(biāo)志位SREG 置位,UCSRnA 寄存器的RXCn 亦為1 時(shí)可以產(chǎn)生USARTn 接收結(jié)束中斷。
&8226; Bit 6 – TXCIE: 發(fā)送結(jié)束中斷使能
置位后使能TXCn 中斷。當(dāng)TXCIEn 為1,全局中斷標(biāo)志位SREG 置位, UCSRnA 寄存器的TXCn 亦為1 時(shí)可以產(chǎn)生USARTn 發(fā)送結(jié)束中斷。
&8226; Bit 5 – UDRIEn: USART 數(shù)據(jù)寄存器空中斷使能
置位后使能UDREn 中斷。當(dāng)UDRIEn 為1,全局中斷標(biāo)志位SREG 置位, UCSRnA 寄存器的UDREn 亦為1 時(shí)可以產(chǎn)生USARTn 數(shù)據(jù)寄存器空中斷。
&8226; Bit 4 – RXENn: 接收使能
置位后將啟動(dòng)USARTn 接收器。RxDn 引腳的通用端口功能被USARTn 功能所取代。禁止接收器將刷新接收緩沖器,并使 FEn、DORn 及UPEn 標(biāo)志無效。
&8226; Bit 3 – TXENn: 發(fā)送使能
置位后將啟動(dòng)將啟動(dòng)USARTn 發(fā)送器。TxDn 引腳的通用端口功能被USARTn 功能所取代。TXENn 清零后,只有等到所有的數(shù)據(jù)發(fā)送完成后發(fā)送器才能夠真正禁止,即發(fā)送移位寄存器與發(fā)送緩沖寄存器中沒有要傳送的數(shù)據(jù)。發(fā)送器禁止后,TxDn 引腳恢復(fù)其通用I/O 功能。
&8226; Bit 2 – UCSZn2: 字符長(zhǎng)度
UCSZn2與UCSRnC寄存器的UCSZn1:0結(jié)合在一起可以設(shè)置數(shù)據(jù)幀所包含的數(shù)據(jù)位數(shù)(字符長(zhǎng)度)。
&8226; Bit 1 – RXB8n: 接收數(shù)據(jù)位8
對(duì)9 位串行幀進(jìn)行操作時(shí),RXB8n 是第9 個(gè)數(shù)據(jù)位。讀取UDRn 包含的低位數(shù)據(jù)之前首先要讀取RXB8n。
&8226; Bit 0 – TXB8n: 發(fā)送數(shù)據(jù)位8
對(duì)9位串行幀進(jìn)行操作時(shí),TXB8n是第9個(gè)數(shù)據(jù)位。寫UDRn之前首先要對(duì)它進(jìn)行寫操作。

USARTn 控制和狀態(tài)寄存器C -UCSRnC:

&8226; Bit 7 – 保留位
該位保留。為與未來器件兼容,對(duì)UCSRnC 寫入時(shí)該位必須寫0 。
&8226; Bit 6 – UMSELn: USART 模式選擇
通過這一位來選擇同步或異步工作模式。

&8226; Bit 5:4 – UPMn1:0: 奇偶校驗(yàn)?zāi)J?br /> 這兩位設(shè)置奇偶校驗(yàn)的模式并使能奇偶校驗(yàn)。如果使能了奇偶校驗(yàn),那么在發(fā)送數(shù)據(jù),發(fā)送器都會(huì)自動(dòng)產(chǎn)生并發(fā)送奇偶校驗(yàn)位。對(duì)每一個(gè)接收到的數(shù)據(jù),接收器都會(huì)產(chǎn)生一奇偶值,并與UPMn0所設(shè)置的值進(jìn)行比較。如果不匹配,那么就將UCSRnA中的UPEn置位。

&8226; Bit 3 – USBSn: 停止位選擇
通過這一位可以設(shè)置停止位的位數(shù)。接收器忽略這一位的設(shè)置。

&8226; Bit 2:1 – UCSZn1:0: 字符長(zhǎng)度
UCSZn1:0與UCSRnB寄存器的 UCSZn2結(jié)合在一起可以設(shè)置數(shù)據(jù)幀包含的數(shù)據(jù)位數(shù)(字符長(zhǎng)度)。

Bit 0 – UCPOLn: 時(shí)鐘極性
這一位僅用于同步工作模式。使用異步模式時(shí),將這一位清零。UCPOLn 設(shè)置了輸出數(shù)據(jù)的改變和輸入數(shù)據(jù)采樣,以及同步時(shí)鐘XCKn 之間的關(guān)系。

USART 波特率寄存器-UBRRnL 和UBRRnH:

&8226; Bit 15:12 – 保留
這些位是為以后的使用而保留的。為了與以后的器件兼容,寫UBRRnH 時(shí)將這些位清零。
&8226; Bit 11:0 – UBRRn11:0: USARTn 波特率寄存器
這個(gè)12 位的寄存器包含了USARTn 的波特率信息。其中UBRRnH 包含了USARTn 波特率高4 位,UBRRnL 包含了低8 位。波特率的改變將造成正在進(jìn)行的數(shù)據(jù)傳輸受到破壞。寫UBRRnL 將立即更新波特率分頻器。

附:實(shí)驗(yàn)程序

/*****************************************************
函 數(shù) 名:void uart_init(void)
功 能:初始化串口
說 明:根據(jù)要求設(shè)置好波特率和數(shù)據(jù)位
入口參數(shù):無
返 回 值:無
*****************************************************/
void uart_init(void)
{
UBRR0H=0; /* 設(shè)置波特率9600,時(shí)鐘8MHz,查表UBRR=51 */
UBRR0L=51; /* UBR=51 */
UCSR0B=(1<

UCSR0C=0x06; /* 設(shè)置數(shù)據(jù)格式,8位數(shù)據(jù)位,1位停止位 */
}

/*****************************************************
函 數(shù) 名:void Uart_Transmit(unsigned char c)
功 能:向串口發(fā)送一字符(查詢方式)
說 明:只有當(dāng)寄存器UCSRA的UDRE標(biāo)志置位后,才可以對(duì)發(fā)送緩沖進(jìn)行寫操作
入口參數(shù):無
返 回 值:無
*****************************************************/
void Uart_Transmit(unsigned char c)
{
while( !( UCSR0A & (1<
UDR0=c; /* 發(fā)送數(shù)據(jù) */
}

/*****************************************************
函 數(shù) 名:void Uart_Transmits(unsigned char *arr)
功 能:向串口寫入字符串(查詢方式)
說 明:
入口參數(shù):無
返 回 值:無
*****************************************************/
void Uart_Transmits(unsigned char *arr)
{
do
{
Uart_Transmit(*arr);
arr++;
}while(*arr!=/0);

}



關(guān)鍵詞: AVR學(xué)習(xí)心

評(píng)論


技術(shù)專區(qū)

關(guān)閉