天天看點

uart總結一、前言二、uart協定三、程式設計政策

uart知識點彙總

  • 一、前言
  • 二、uart協定
  • 三、程式設計政策

一、前言

很久沒有寫部落格了,不過并沒有偷懶~前段時間在準備實習面試之類的,并沒有把總結的東西發到部落格上,這段時間正好在實習,立個flag,一周總結3-4篇文章,督促下自己。今天開始先從各種協定開始,打算陸續把uart,iic,spi(包括qspi),can,usb等協定都總結一遍,也為接下來的秋招做準備!

二、uart協定

首先,在學習序列槽的時候總會看到UART和USART,這裡對兩者做下說明。

UART:(Universal Asynchronous Receiver/Transmitter)通用異步收發傳輸器

USART:(Universal Synchronous Asynchronous Receiver Transmitter)通用同步異步收發傳輸器

UART與USART都是單片機上的序列槽通信,從名字上也可以看出,USART相比于UART還多了一個同步的功能,也就會多了一個用于産生時鐘同步信号的線。在不需要時鐘信号的時候,USART就可以當做UART來用。

常見序列槽的電平标準主要有:TTL和RS-232,很久以前電腦上的DB9接口的序列槽就是采用RS-232的電平标準,在一些常見的電子電路内部則采用的是TTL的電平标準。采用RS-232電平标準的好處則是增加序列槽通訊的遠距離傳輸及抗幹擾能力。這是因為對于RS-232電平标準來說:-15V到-3V為邏輯高電平,3V到15V為邏輯低電平,較大的壓差使得其抗幹擾能力更強一些(RS-485/422的抗幹擾能力更強一些),而TTL電平的傳輸速率更大一些。一般在晶片間通信時用TTL電平,裝置間通信時用RS-232電平。現在的筆記本電腦基本上都用usb來替代了以前的DB9接口,是以通常用序列槽轉usb後再與電腦進行通信。

對于通信協定的學習,我認為火哥的學習思路很好,任何協定無非包括實體層和協定層,是以學習通信協定從這裡入手就可。是以,大緻分這兩個方面進行總結:

首先看實體層,從實體層可以看出通信協定的一些特性,如uart一共隻有三個引腳,分别是RX,TX,GND。即有兩條信号線,沒有時鐘線,這就表明了uart是一種異步,全雙工的串行通信協定。異步則需要雙方按照彼此規定好的波特率進行資料傳輸,全雙工意味着其傳輸速率會略快一些。GND則是為了防止兩個裝置的地電平不一緻造成資料錯誤,而使用的公共地。這就是我們從實體層得到的資訊。

接下來再看協定層,協定層即資料傳輸的格式,比如我們要傳輸一位元組的資料,這一位元組的資料要經過怎樣的加工變成最終發送的資料包。為什麼需要進行加工,因為在空閑時資料線也是有電平存在的,如UART就是高電平,那麼怎麼判斷什麼時候收到了資料,這就需要起始信号和終止信号來表示資料開始和停止。那麼資料又是否由于其他原因産生了異常,這就需要一個校驗位來進行驗證。對于序列槽協定來說,相關的資料格式已經在序列槽的相關寄存器中設定好了,一般情況下包括:起始位,資料位,奇偶校驗位和停止位。對于異步通信來說,還要設定好資料傳輸的波特率,確定通信雙方以相同的頻率來收發資料。

通常一個資料包是以起始信号開始,直到停止信号結束。在UART通信中,空閑時資料線上為高電平,是以起始信号為一個位的低電平來表示即将傳輸資料。停止位則由0.5、1、1.5 或2個高電平來表示。起始信号和終止信号中間發送的就是資料和校驗位了,對于UART的資料位可設定為5/6/7/8位資料,即一次可傳輸這麼多資料,但是要記得UART是串行通信,他們是一位一位的經過移位寄存器放到緩沖區内。在有效資料之後,有一個可選的資料校驗位。由于資料通信相對更容易受到外部幹擾導緻傳輸資料出現偏差,可以在傳輸過程加上校驗位來解決這個問題。

奇校驗要求有效資料和校驗位中“1”的個數為奇數,比如一個8 位長的有效資料為:01101001,此時總共有4 個“1”,為達到奇校驗效果,校驗位為“1”,最後傳輸的資料将是8 位的有效資料加上1 位的校驗位總共9 位。

偶校驗與奇校驗要求剛好相反,要求幀資料和校驗位中“1”的個數為偶數,比如資料幀:11001010,此時資料幀“1”的個數為4 個,是以偶校驗位為“0”。

uart的資料格式如下圖:

uart總結一、前言二、uart協定三、程式設計政策

接下來,再來看看uart的功能框圖,更深入的了解下序列槽協定。

uart總結一、前言二、uart協定三、程式設計政策

這個是USART的功能框圖,UART功能就是直接基于USART使用的,在第一部分的引腳中可以看到,這裡除了正常我們使用的TX,RX,外還有CK這個我猜測應該就是用于同步的時鐘信号吧, 剩下兩條線分别是CTS,RTS分别用來允許發送資料和請求發送資料,都是在使用USART才用到的。在第二部分可以看出接收的資料是一位一位經過資料移位寄存器然後存入到内部的FIFO緩沖區内。 第三部分則是序列槽的一些相關寄存器。第四部分則是說明序列槽的時鐘來源以及預分頻系數,最終根據USART_BRR寄存器可計算出序列槽的波特率。在第三部分上方,可以看出序列槽還支援中斷以及DMA功能。

三、程式設計政策

以下部分主要來自微信公衆号:嵌入式客棧。

常見的三種UART程式設計方式包括:

1.查詢發送/中斷接收模式

2.收發中斷模式

3.DMA 模式

為什麼用查詢發送卻用中斷接收呢,原因很簡單,由于異步通信不确定什麼時候會收到資料,是以需要用中斷方式來得知收到了資料,用查詢的話可想而知會消耗大量的cpu資源。另外,在用DMA模式的時候,會大大提高序列槽傳輸資料的效率。