專注電子技術(shù)學(xué)習(xí)與研究
當(dāng)前位置:單片機(jī)教程網(wǎng) >> MCU設(shè)計(jì)實(shí)例 >> 瀏覽文章

AVR單片機(jī)學(xué)習(xí)(七)異步串行口UART

作者:zww 1988   來源:本站原創(chuàng)   點(diǎn)擊數(shù):  更新時(shí)間:2014年04月18日   【字體:
串行通訊技術(shù)概述
  • 異步串行通訊原理
  • UART與電腦的通訊
  • M16的USART
  • 中斷方式使用USART步驟
  • 一、串行通訊技術(shù)概述

    串行通訊的通俗定義:

         一位發(fā)送一位(相對(duì)與并行,)當(dāng)然通過 位同步 幀同步

    串行通訊的分類

         同步串行通訊

    時(shí)鐘線、數(shù)據(jù)線、通過時(shí)鐘保持?jǐn)?shù)據(jù)同步

       SPI,IIC 屬于同步串口通訊

    異步串口通信

      只有一根數(shù)據(jù)線,通過波特率保證數(shù)據(jù)同步(顧名思義沒有時(shí)鐘線只有數(shù)據(jù)線)

    UART

      無線通信一般均為異步串行通信(相對(duì)于無形之中只能有一根天線)

    波特率

      每秒發(fā)送碼元時(shí)間寬度為(1/9600)S   大概是在100個(gè)微妙左右

      發(fā)送方按照波特率發(fā)出數(shù)據(jù)

      接收方按照波特率確定碼元時(shí)間寬度對(duì)數(shù)據(jù)進(jìn)行采樣

    幀格式

     8位數(shù)據(jù)格式

    idle 空閑時(shí)候保持高電平

    在發(fā)送數(shù)據(jù)的時(shí)候先發(fā)送一位起始位 低電平0

    然后數(shù)據(jù) 0 1 。。。。8 位 

    P這位是可選的一般在多級(jí)通訊的時(shí)候需要發(fā)送9位數(shù)據(jù)在第9位時(shí)候 是地址位

    SP1(必選的一位停止位 是1) 也可以選2位 加一個(gè)SP2  但是一般都是1位 起始位  1位停止位 8位數(shù)據(jù)位

    之后數(shù)據(jù)繼續(xù)保持空閑高電平

     

     

    接線圖

     發(fā)送端:TXD

     接收端:RXD

     交叉連接

    RS232電平標(biāo)準(zhǔn)

     邏輯1  :-15V

     邏輯0 :+15V

    DB9 接口定義

    TXD。遥兀摹。牵模巍∪即可瞞足絕大數(shù)應(yīng)用場(chǎng)合


    下面是開發(fā)板電路圖


    MAX3232標(biāo)示的是3.3V的芯片我們用的是5V MAX232 芯片標(biāo)示錯(cuò)了 不論引腳封裝還是順序都是完全相同的。

    MAX 232 芯片能提供2路串口我們只用一個(gè)。由于這個(gè)電路圖上是按照DB9定義的走線了所以我們就得用交叉線來跟PC通訊了。

    M16的USART特點(diǎn)

       全雙工操作(獨(dú)立的串行接受合發(fā)送寄存器,不像51是公用同一個(gè)寄存器,只能半雙工)

       異步或同步操作(當(dāng)然同步一般用不到。所以我們只當(dāng)異步串行口使用)

       支持5,6,7,8或9個(gè)數(shù)據(jù)位和1個(gè)或2個(gè)停止位(一般用的最多是8位數(shù)據(jù) 1位停止)

       硬件支持的奇偶校驗(yàn)操作(一般用不到,有限的場(chǎng)合通信質(zhì)量還是可靠的,沒必要加上校驗(yàn))

       三個(gè)獨(dú)立的中斷源(看技術(shù)文檔《一》)

       噪聲濾波,包括錯(cuò)誤的起始位檢測(cè),以及數(shù)字低通濾波器

    USART 寄存器   universal (通用的大體的) synchronous(同步)   asynchronous(異步)R/T(接受/發(fā)送)

      UDR  

      UCSRA

      UCSRB

      UCSRC

      UBRRL與UBRRH

     

     
    《一》

     

    Three Separate Interrupts (3個(gè) 分離 獨(dú)立的中斷 ) TX complete 發(fā)送完成中斷  ,TX Data Register Empty  發(fā)送數(shù)據(jù)寄存器空 中斷   RX Complete 接受完成中斷。

    以下是整段中文解釋

    通用同步和異步串行接收器合轉(zhuǎn)發(fā)器(USART)是一個(gè)高度靈活的串行通訊設(shè)備。主要特點(diǎn)為:

        全雙工操作(獨(dú)立的串行接收和發(fā)送寄存器)

        異步或同步操作

        主機(jī)或從機(jī)提供時(shí)鐘的同步操作

        高精度的波特率發(fā)生器

        支持5,6,7,8,或9個(gè)數(shù)據(jù)位合1個(gè) 或 2個(gè)停止位

        硬件支持的奇偶數(shù)校驗(yàn)操作

         數(shù)據(jù)過渡檢測(cè)

        偵錯(cuò)誤檢測(cè)

        噪聲濾波,寶貨粗無的起始位檢測(cè),以及數(shù)字低通濾波器

        三個(gè)獨(dú)立的中斷:發(fā)送結(jié)束中斷,發(fā)送數(shù)據(jù)寄存器空中斷,以及接受結(jié)束中斷

        多處理器通訊模式

       倍速率異步通訊模式

     

     三個(gè)獨(dú)立中斷的前兩個(gè)中斷我們一般用不到的因?yàn)槲覀儼l(fā)送之前查詢一下發(fā)送數(shù)據(jù)寄存器是否忙(可供使用)就可以了,沒必要采用這兩個(gè)中斷,但是接受一般采用中斷方式,因?yàn)槲覀儾豢赡芤恢辈煌5牟樵。而查詢發(fā)送終中斷最多耽誤發(fā)送一個(gè)字節(jié)的時(shí)間。

    噪聲濾波使用起來通信質(zhì)量相比其他單片機(jī)的通信質(zhì)量大大提升,怎么操作USART呢 ?

    首先介紹下有關(guān)的寄存器

    第一個(gè)寄存器I/O 數(shù)據(jù)寄存器 UDR 

    share the same I/O address  共享相同的I/O地址 referred to as USART 稱為USART 數(shù)據(jù)寄存器或 UDR  

    其實(shí)就是發(fā)送數(shù)據(jù)和接受數(shù)據(jù)寄存器都采樣同一個(gè)名稱UDR  但是怎么樣區(qū)分呢? 

    寫 就是 發(fā)送  讀就是接受   第一段下面就是吧呵呵!本人英文不好呵呵  the Transmit Data Buffer Register(TXB)Will be the destination for data written to the UDR Register location ,Reading teh UDR Register location will return the contents of the Receive Data Buffer Register (RXB).

     

    第二個(gè)寄存器是 UCSRA  控制狀態(tài)寄存器A


    第七位和第六位   接受完成(置位)   發(fā)送完成(置位)   這兩段最后一句是說可以用接受中斷標(biāo)志合發(fā)送中斷標(biāo)志,自己慢慢看哦。

     

    第5位是 數(shù)據(jù)寄存器空 ,就是檢測(cè)UDR 是否準(zhǔn)備好接受新的數(shù)據(jù)。indicates 表明

    the UDRE flag indicates if the transmit buffer (UDR) is ready to receive new data 這個(gè)UDRE標(biāo)志指出 發(fā)送緩沖器(UDR )是否準(zhǔn)備號(hào)接受新數(shù)據(jù) 假如UDRE is one ,the buffer empty , and therefore ready to written 已準(zhǔn)備好進(jìn)行數(shù)據(jù)接受。所以這一位我們發(fā)送之前對(duì)這一位查詢是否置位,如果置位了就可以往里寫數(shù)據(jù)了,進(jìn)行發(fā)送操作。


    第4位:幀錯(cuò)誤   第三位數(shù)據(jù)溢出  第二位 :(parity)奇偶校驗(yàn)錯(cuò)誤   一般我們是用不到的,沒必要管他

     

    第1位:雙 發(fā)送 速度  倍速發(fā)送跟設(shè)置波特率有影響的一般情況下把我們也是不用管的  如果將這位置位的話那么算出來的波特率就得乘以2.

    this bit only has effect for the asynchronous operation  這個(gè)位 僅對(duì) 有effect (效果) for the asynchronous operation 異步操作




    第0位:多處理器 communication 通訊 模式  這一位我們一般也是用不到的。

    所以這個(gè)UCSRA 這個(gè)控制狀態(tài)寄存器一般用的最多的是第五位  UDRE 數(shù)據(jù)寄存器空

    第三個(gè)寄存器是控制狀態(tài)寄存器B


    這個(gè)寄存器是平時(shí)用的最多的寄存器 

    第七位:RXCIE  :RX 結(jié)束中斷使能

    如果是使用USART 的接受中斷的話這一位必須置位 使能

    writing this bit to one enables interrupt on the RXC flag.寫1 使能中斷RXC 標(biāo)志(置位后使能RXC中斷)

    一個(gè)USART 接受中斷結(jié)束  將生成 一個(gè) RXCIE 位寫1  ,這個(gè)全局中斷標(biāo)志SREG is 寫  UCSRA 寄存器的RXC位置位1時(shí)可以產(chǎn)生USART 接受結(jié)束中斷。

    第六位:TXCIE  TX 發(fā)送中斷結(jié)束使能

    別人的解釋:置位后使能TXC中斷,當(dāng)TXCIE 為1 時(shí),全局中斷標(biāo)志位SREG 置位,UCSRA寄存器的TXC置為1時(shí)可以產(chǎn)生UCSRA發(fā)送結(jié)束中斷。(看多經(jīng)典比我上面的一個(gè)一個(gè)字解釋好吧)

    當(dāng)然第六位我們一邊用不到的。

    第五位:USART 數(shù)據(jù)寄存器空中斷使能   也不常用

     

    第4位:接受使能

    第3位:發(fā)送使能 

    這兩位非常重要如果要用串行口 這兩位必須使能。取代了通用端口了。



    第2位 :UCSZ2 字符長(zhǎng)度

    這UCSZ2 位combined (結(jié)合)UCSRC寄存器的  UCSZ1:0在一起可以設(shè)置數(shù)據(jù)幀所包含的數(shù)據(jù)位數(shù)(字符長(zhǎng)度)。

    一般我們用8位 。 可以設(shè)置成5--9位 當(dāng)然在AVR 上電復(fù)位之后它的寄存器默認(rèn)設(shè)置就是8位所以這我們也不用設(shè)置

     


    這個(gè)第1位和第0位分別是 :接受數(shù)據(jù)位8  和 發(fā)送數(shù)據(jù)位 8

    這兩位僅僅對(duì)于數(shù)據(jù)長(zhǎng)度設(shè)置成9位的時(shí)候才是有作用的他們分別是第9個(gè)數(shù)據(jù)位,所以我們這也是用不到。

    第四個(gè)寄存器:控制狀態(tài)寄存器C
    第七位:寄存器選擇

    這個(gè)位選擇開始訪問 UCSRC 或 UBRRH 寄存器。讀UCSRC 該位為1  ,寫UCSRC 時(shí)  URSEL為1.

    估計(jì) UCSRC  和 UBRRH 共享一個(gè)地址。這一點(diǎn)對(duì)編程沒有影響。所以這一位不管。


    第六位:USART 模式選擇

    默認(rèn)是置0 :異步操作   一般同步用不到。至少我用過的同步操作就用過一次就是對(duì)PS2鍵盤驅(qū)動(dòng)的時(shí)候用到了同步模式一般是用不到同步模式的。


    第五位和第四位組合起來組成 奇偶數(shù)校驗(yàn)?zāi)J?/p>

    these bits enable and set type of parity generation and check .這兩位設(shè)置奇偶校驗(yàn)?zāi)J讲⑹鼓芷媾夹r?yàn)。

    Disabled (禁止)  Reserved(保留) Enabled ,Even parity 偶校驗(yàn)  Enabled ,odd parity (奇校驗(yàn))

    一般我們不用校驗(yàn) 所以不用設(shè)置這兩位



    第3位:停止位選擇

     默認(rèn)停止位是1位   一般不用設(shè)置 默認(rèn)停止位1位



    第2位和第1位:設(shè)置字符長(zhǎng)度

    可以看到 8位是 0 1 

    而我們?nèi)タ纯碪CSRC 寄存器上電復(fù)位的初始值為  UCSZ1   UCSZ0 都是1  而UCSZ2 是0  所以默認(rèn)為8位

     



    0 1  1 8位數(shù)據(jù)所以我們一般對(duì)這2位 不做設(shè)置的。默認(rèn)就8位了。

    第0位:最后一位是 :時(shí)鐘極性

    這一項(xiàng)僅對(duì)同步的時(shí)候有用,this bit is used for synchronous mode only. 同步模式我們也用不到所以這一位我們也不用管。

    第五個(gè)寄存器波特率寄存器  UBRRL  和  UBRRH


    相當(dāng)于一個(gè)12位的二進(jìn)制數(shù):低8位是UBRRL       高4位是(8:11)是UBRRH的低四位。

    解釋:UCSRC寄存器與UBRRH 寄存器公用相同的I/O地址。對(duì)該寄存器的訪問,請(qǐng)參見P162 訪問 UBRRH/RCSRC寄存器。

    我們計(jì)算波特率的時(shí)候只要將計(jì)算出的值的低8位寫入這個(gè)UBRRL就行了。高8位寫入U(xiǎn)BRRH  URSEL 這位我們不用管編譯器自動(dòng)處理好。


    下面的表格就粘貼了太累了!

    下面就講講怎樣使用這個(gè)USART、、、

    ---------------------------------------------------------------

    第一步:設(shè)置波特率

    #define F_CPU 16000000

    #define BAUD 9600

    UBRRH = (FOSC / BAUD0/16-1)/256

    UBRRL = (FPSC/BAUD0/16-1)%6

    第二步:使能發(fā)送、接受接受完成中斷

    UCSRB |= (1<< RXEN)|(1<<TXEN)|(1<<RXCIE);

    第三步:使能全局中斷

    sei();

    第四步:查詢方式發(fā)送、中斷方式接受

    發(fā)送: while(!(UCSRA & (1<< UDRE))); UDR =c;

    接受中斷:c = UDR ;

     

    波特率怎么算的呢?在UART 下的時(shí)鐘產(chǎn)生 下有波特率發(fā)生器下圖

    正常我們使用非倍速的時(shí)候

    equations 方程  calculating 計(jì)算
    一個(gè)是波特率的計(jì)算公式一個(gè)是UBRR值的計(jì)算公式  這個(gè)UBRR 就是上面那個(gè)波特率寄存器(UBRRL  UBRRH拼接起來顯示的數(shù)值)。 UBRR 的值就等于主頻除以波特率 再減 1. 而我們就是采用宏定義的方法定義主頻 和 波特率

    UBRR  = 主頻 / 波特率/ 16 -1  由于是UBBRH 整除256 取出高8位     可以理解右移掉低 8位

    UBRR  = 主頻 / 波特率/ 16 -1  由于是UBBRH 求余256 取出高8位     左移掉 高8位

    用宏定義的好處 修改波特率方便。

    實(shí)際演示下

    編譯如下代碼:



    然后下載進(jìn)入,打開串口調(diào)試工具  選擇對(duì)應(yīng)的COM我的COM3 和COM4 而COM4是仿真器用了所以我選擇COM3  波特率選擇9600 校驗(yàn)位  我們選NO 第四欄 8位 我們選1位 。我們一般把16進(jìn)制給勾上 ,16進(jìn)制顯示 16進(jìn)制發(fā)送給勾上。(不然的話它自動(dòng)查找ASCII碼表顯示對(duì)應(yīng)的字符,將字符顯示出來)然后點(diǎn)擊清空從填 ,現(xiàn)在驗(yàn)證下

    反正我測(cè)試接受到的都是0 不知道為什么?

    其實(shí)9600的波特率每秒最多發(fā)送多少字符 是9600 /10 960個(gè)字符因此串行速度還是非?斓

    這就是串口發(fā)送的程序我們通常寫成一個(gè)函數(shù)

    中斷方式使用USART步驟

    第一步:設(shè)置波特率

    #define F_CPU 16000000

    #define BAUD 9600

    UBRRH = (F_CPU/BAUD/16-1)/256

    UBRRL = (F_CPU/BAUD/16-1)%6

    第二步:使能發(fā)送  、接受、接受完成中斷

    UCSRRB |= (1<<RXEN)|(1<<TXEN)|(1<<RICIE);

    第三步:使能全局中斷

    sei();

    第四步:查詢方式發(fā)送、中斷方式接受

    發(fā)送: while(!(UCSRA &(1<<UDRE)));

    UDR =c;

    接受中斷:c = UDR;

     

    如果用中斷接受必須在GCC單片機(jī)程序 找中斷向量名稱  接受中斷完成如下圖



    SIG_UART_RECV呵呵

     給帶更改如下



    中斷接受、就講到這里!

     氣死人了,這個(gè)教程我實(shí)驗(yàn)不成功、、、

     

    關(guān)閉窗口

    相關(guān)文章