UART工作原理详解
目錄
概述
發(fā)展過程
硬件定義(DP9-RS232)
工作原理(DP9-RS232)
起始位、停止位、校驗(yàn)位(DP9-RS232)
速率計(jì)算
波特率
FIFO
FIFO存儲器
FIFO的概念
超時(shí)設(shè)計(jì)
FIFO緩沖區(qū)的清空
FIFO 輸入與輸出中斷
FIFO緩沖區(qū)取數(shù)據(jù)時(shí)的原理
UART FIFO
USART
概述
UART全拼Universal Asynchronous Receiver/Transmitter,即通用異步收發(fā)傳輸器
發(fā)展過程
在個(gè)人計(jì)算機(jī)誕生之前就已經(jīng)存在了串口設(shè)備,如電傳打字機(jī),工控測量設(shè)備,通信調(diào)制解調(diào)器(現(xiàn)在的路由器),最初的串口就是用一根線直連另外一方,一方發(fā)一方收,后來廠商為了完善自己的串口又增加了一根線用于做信號位,主要用于判斷流是否可用,同時(shí)當(dāng)時(shí)的廠商們的設(shè)備不同,芯片的工作頻率也不同以及電平信號也不同,導(dǎo)致廠商的設(shè)備只能跟自己通訊,沒有一個(gè)統(tǒng)一的標(biāo)準(zhǔn)非常混亂,后來由無線電制造商協(xié)會(Radio Manufacturers' Association:RMA,現(xiàn):美國電子工業(yè)協(xié)會(EIA))聯(lián)合貝爾實(shí)驗(yàn)室在1970年代一起制定了一個(gè)標(biāo)準(zhǔn),即歷史上第一個(gè)通用串口協(xié)議標(biāo)準(zhǔn):RS-232,它規(guī)定了波特率(即芯片工作頻率),數(shù)據(jù)線,接受線,流控制線的接法,采用DB25針串口,支持異步。
支持的波特率有:50b/s、75b/s、110b/s、150b/s、300b/s、600b/s、1200b/s、2400b/s、4800b/s、9600b/s、19200b/s
115200這個(gè)速率最初是沒有的,是后來才加上去的,因?yàn)槿藗儼l(fā)現(xiàn)9600太慢,19200頻率又太高,頻率越高功耗越高,所以推出一個(gè)115200這個(gè)合適的頻率。
最后隨著個(gè)人電腦的出現(xiàn),個(gè)人電腦最初的上的接口較小,PCB板子空間也很小,DB25較大,EIA將其中保留的一些針位去除了,形成了后來的DB9針串口,協(xié)議依然是RS-232。
由于DB9接口只定義了信號量,但是沒有定義與每個(gè)引腳的直接關(guān)系,導(dǎo)致當(dāng)時(shí)的廠商需要自己去定義每個(gè)引腳的作用,這就導(dǎo)致了不同廠商每個(gè)引腳的作用不一樣,但是功能是一樣的,無法相互接在一起,最初有一個(gè)比較知名的公司:IBM,它規(guī)定了一種定義,后來大多數(shù)廠商為了統(tǒng)一都采用IBM的定義。
所以最終IBM成為了PC行業(yè)里DB9串口引腳關(guān)系的工業(yè)標(biāo)準(zhǔn)。
在這一刻UART才叫UART,這里的U即是通用的意思,最初叫ART之類的,因?yàn)樗鼪]有一個(gè)統(tǒng)一的標(biāo)準(zhǔn),后來IBM統(tǒng)一了之后,才有了U,不同廠商之間的設(shè)備可以通過串口進(jìn)行通訊了。
硬件定義(DP9-RS232)
工作原理(DP9-RS232)
DTR由計(jì)算機(jī)控制,當(dāng)為高電平時(shí)即告訴目標(biāo)設(shè)備,我已經(jīng)準(zhǔn)備好了,可以給我發(fā)送數(shù)據(jù)了
DSR由目標(biāo)設(shè)備控制,當(dāng)為高電平時(shí)即目標(biāo)設(shè)備告訴計(jì)算機(jī),我也可以發(fā)送數(shù)據(jù)了
RTS由計(jì)算機(jī)控制,告訴目標(biāo)設(shè)備給我發(fā)送數(shù)據(jù),此時(shí)目標(biāo)設(shè)備需要立即給計(jì)算機(jī)發(fā)送數(shù)據(jù)
CTS由目標(biāo)設(shè)備控制,告訴計(jì)算機(jī)給目標(biāo)設(shè)備發(fā)送數(shù)據(jù)
DCD是由計(jì)算機(jī)控制,計(jì)算機(jī)需要拉高它來告訴目標(biāo)設(shè)備我還在線
在RS232里要求每個(gè)字節(jié)只能一次傳輸一個(gè)BIT位,所以就需要一個(gè)起始位與停止位,為了確保正確性還會有個(gè)校驗(yàn)位,這些會在后面說,當(dāng)將對應(yīng)的線調(diào)整好了之后,需要TXD來確認(rèn)位的開始與停止
起始位、停止位、校驗(yàn)位(DP9-RS232)
起始位(Start Bit)
發(fā)送器是通過發(fā)送起始位而開始一個(gè)字符傳送,起始位使數(shù)據(jù)線處于邏輯0狀態(tài),提示接受器數(shù)據(jù)傳輸即將開始,當(dāng)設(shè)定好起始位后,如起始信號為01,那么串口內(nèi)部時(shí)鐘開始周期性的采樣,如串口內(nèi)部使用8個(gè)時(shí)鐘周期作為一個(gè)采樣周期的因子,則每4個(gè)周期進(jìn)行一次采樣,如當(dāng)?shù)?個(gè)時(shí)鐘周期的時(shí)候采樣為0那么會記到標(biāo)志寄存器中,當(dāng)?shù)?個(gè)周期采樣為1則視為起始信號,這樣一個(gè)周期就完成了,現(xiàn)在的起始信號一般都不能設(shè)置,都采用默認(rèn)的,即默認(rèn)的兩個(gè)低電平,以16個(gè)時(shí)鐘周期為采樣因子,每8個(gè)時(shí)鐘周期采一次,若兩次之后都為低電平則視為起始信號
起始位為兩個(gè)低電平00,因?yàn)镽S232規(guī)定要求空閑時(shí)電平必須是1,即高電平
數(shù)據(jù)位(Data Bits)
起始位之后就是傳送數(shù)據(jù)位。數(shù)據(jù)位一般為8位一個(gè)字節(jié)的數(shù)據(jù)(也有6位、7位的情況),低位(LSB)在前,高位(MSB)在后,無法修改高低位的傳輸優(yōu)先級
停止位(Stop Bit)
最后一個(gè)BIT位,一般為1位,可以設(shè)置,一般設(shè)置為1或2,最常用的是1,它與數(shù)據(jù)位相接,當(dāng)雙方通訊協(xié)議一致后(停止位數(shù)據(jù)位都是一樣的),當(dāng)讀取完數(shù)據(jù)位之后在讀取一位是高電平的1時(shí)則認(rèn)為收到了停止位,則代表一個(gè)數(shù)據(jù)的結(jié)束
校驗(yàn)位(parity Bit)
這是一個(gè)比較特殊的位,它使用奇偶的方式校驗(yàn)數(shù)據(jù)位是否正確,它通常是不用的,因?yàn)樗鼘儆谝粋€(gè)對應(yīng)的校驗(yàn)控制器來完成,總耗時(shí)需要1s,所以如果要添加它的話意味著你每次傳輸至少要在1s以上,它用來確認(rèn)數(shù)據(jù)位上的BIT為1的數(shù)量是奇數(shù)還是偶數(shù),是一個(gè)最簡單的狀態(tài)位,因?yàn)閭鬏敓o法避免干擾等情況,在一些場景惡劣的環(huán)境下這個(gè)位是非常有用的,當(dāng)BIT為1的數(shù)量為偶數(shù)時(shí),校驗(yàn)位為1,為奇數(shù)時(shí)為0,接收方需要確認(rèn)這個(gè)位與自己實(shí)際接收到的是否一致,不一致則可以要求目標(biāo)方重發(fā),它無法矯正數(shù)據(jù),因?yàn)樗鼰o法確認(rèn)哪個(gè)位有錯(cuò)。
小插曲
現(xiàn)在市面上流行的路由器有一個(gè)閉源的算法,就是能夠?qū)?0%損壞修復(fù),類型QR二維碼的原理,有興趣可以研究一下,QR二維碼里有一段數(shù)據(jù)是放矯正信息的,當(dāng)二維碼有一部分無法識別時(shí),會從這個(gè)矯正信息里在用特定的算法計(jì)算出原始信息,所以我們平時(shí)在掃二維碼時(shí)你可以遮住一小部分,會發(fā)現(xiàn)還是可以識別出來,有些工業(yè)二維碼修復(fù)能力更強(qiáng),因?yàn)楣I(yè)環(huán)境很容易出現(xiàn)油漆,污漬等其它遮擋物,遮擋住。
傳輸過程
如現(xiàn)在要傳輸“OK”兩個(gè)字符,O對應(yīng)的二進(jìn)制數(shù)據(jù)為01001111?,K對應(yīng)的二進(jìn)制數(shù)據(jù)為01001011,傳輸過程如下:
以下過程以RS-232起始信號為標(biāo)準(zhǔn),數(shù)據(jù)位為8位,停止位為1位,沒有校驗(yàn)位
速率計(jì)算
如果想計(jì)算一個(gè)BIT在當(dāng)前波特率下每次傳輸需要耗時(shí)多久可以用倒數(shù)的方式計(jì)算。
如當(dāng)前的波特率為115200
計(jì)算公式:
1/115200=868ns,如果加了奇偶校驗(yàn)位別忘記在加上1s的耗時(shí)
即每868ns傳輸1bit。
波特率
波特率與時(shí)鐘頻率不同,串口允許兩個(gè)時(shí)鐘頻率不同的設(shè)備進(jìn)行通訊,但要求波特率一致,波特率即你當(dāng)前的芯片在一定周期內(nèi)傳輸BIT的數(shù)量,這個(gè)波特率就是一定周期,因?yàn)閮蓚€(gè)設(shè)備之間的時(shí)鐘頻率不同,一方快,另外一方可能慢,那么就協(xié)商一個(gè)固定周期,在這個(gè)固定周期里只能傳輸多少BIT位,且這個(gè)固定周期里是兩個(gè)設(shè)備的時(shí)鐘頻率都能達(dá)到的,如A設(shè)備的時(shí)鐘頻率是80hz,B設(shè)備的時(shí)鐘頻率是120hz,明顯B設(shè)備快于A設(shè)備,如果不協(xié)商明顯是無法通訊的,因?yàn)椴辉谝粋€(gè)時(shí)間線上,則這里進(jìn)行一次協(xié)商,則告訴AB設(shè)備我不管你們的時(shí)鐘頻率是快也好,慢也罷,我要求你們在100us里傳輸8個(gè)10個(gè)bit位,其中每10US傳輸一個(gè)BIT,那么此時(shí)A設(shè)備比較慢,但是它的頻率也剛好能夠達(dá)標(biāo)每10US傳遞一個(gè)BIT,而B設(shè)備呢由于比較快,它10us甚至可以傳輸兩個(gè)BIT,但是快也沒用,因?yàn)閰f(xié)商好了規(guī)定時(shí)間,所以B設(shè)備每次到10毫秒時(shí)就傳輸一次,剩下時(shí)間則等待時(shí)間的到來,這個(gè)在芯片內(nèi)部其實(shí)是可以根據(jù)設(shè)置當(dāng)前工作時(shí)鐘頻率來完成,如當(dāng)前波特率要求115200,它每86.8us傳輸一個(gè)bit位,那么只需要將當(dāng)前工作時(shí)鐘頻率設(shè)置為每86.8us為一個(gè)周期即可與波特率對應(yīng)起來。
這樣就完成了即便兩個(gè)設(shè)備頻率不同也能完成一次正常的通訊,這里需要明確波特率與時(shí)鐘頻率不同,實(shí)現(xiàn)波特率的方法不止設(shè)置時(shí)鐘頻率一種,也有另外一種方法就是外設(shè)時(shí)鐘,如芯片內(nèi)部有一個(gè)外設(shè)時(shí)鐘,通過設(shè)置這個(gè)外設(shè)時(shí)鐘的工作頻率和中斷來完成這個(gè)工作,設(shè)置外設(shè)時(shí)鐘的好處在于芯片可以做別的事情,等時(shí)鐘中斷來了去發(fā)一次數(shù)據(jù)或接一次數(shù)據(jù)就可以了。
FIFO
FIFO存儲器
在了解UART FIFO功能先說一下FIFO存儲器,UART的功能就是基于FIFO存儲器
FIFO的概念
隨著芯片性能的提升的同時(shí)通訊速率也隨之提高,因傳輸率的問題,A設(shè)備的傳輸率要快于B設(shè)備的處理能力時(shí)就會產(chǎn)生數(shù)據(jù)流過多的情況,導(dǎo)致B設(shè)備的芯片無法及時(shí)處理這些數(shù)據(jù)就會導(dǎo)致部分?jǐn)?shù)據(jù)丟失,為了解決這個(gè)問題提出了一種存儲模式,即FIFO,FIFO全拼是First-In First-Out 即先進(jìn)先出,就是涉及一個(gè)存儲器用來臨時(shí)保存這些數(shù)據(jù),然后芯片不再從數(shù)據(jù)寄存器里去取數(shù)據(jù)而是在FIFO存儲器里去取數(shù)據(jù),因?yàn)樾酒玫綌?shù)據(jù)后要進(jìn)行一個(gè)處理,這個(gè)處理周期可能比較耗時(shí),這就導(dǎo)致外面有新的數(shù)據(jù)來了沒能及時(shí)處理,這些數(shù)據(jù)又被新的數(shù)據(jù)給覆蓋掉了,導(dǎo)致數(shù)據(jù)的丟失,因?yàn)樵诖诘脑O(shè)計(jì)中只有一個(gè)數(shù)據(jù)寄存器,一般是8位寄存器,只能放下一個(gè)字節(jié),當(dāng)又來一個(gè)字節(jié)串口芯片就會將新的字節(jié)填充到數(shù)據(jù)寄存器里去,它不會等待CPU將數(shù)據(jù)取走后才填充,因?yàn)檫@樣會導(dǎo)致丟失新的數(shù)據(jù)。
FIFO的出現(xiàn)就是為了解決上述丟包的問題,當(dāng)數(shù)據(jù)來了之后串口芯片將數(shù)據(jù)丟到FIFO的緩沖區(qū)里,通過設(shè)置最大深度字節(jié)來產(chǎn)生一次中斷告訴CPU來取走它們,這樣就解決了當(dāng)CPU工作較忙無法取數(shù)據(jù)時(shí)產(chǎn)生丟失的問題,FIFO緩沖區(qū)多大取決于你當(dāng)前芯片的設(shè)計(jì),這些可以在你的芯片手冊上看到
同時(shí)FIFO還提供了一個(gè)功能,填充超時(shí),因?yàn)橛械臅r(shí)候在傳輸時(shí)設(shè)備可能會出現(xiàn)不定時(shí)的包,如A與B之間傳輸數(shù)據(jù),B設(shè)備開啟了FIFO功能,并設(shè)置填充超出10個(gè)字節(jié)產(chǎn)生一次中斷告知CPU取走數(shù)據(jù),但是由于A設(shè)備出現(xiàn)了一些問題,暫時(shí)不給B設(shè)備發(fā)數(shù)據(jù)了,那B設(shè)備里的一些數(shù)據(jù)就永遠(yuǎn)無法產(chǎn)生中斷,那么就有了一個(gè)填充超時(shí)的中斷,即如果特定的時(shí)間里沒有將FIFO緩沖區(qū)填充到設(shè)定的指定深度時(shí)就會產(chǎn)生這個(gè)中斷,告訴CPU填充超時(shí)了,來處理一下這些沒有填滿的數(shù)據(jù)
以下是超時(shí)中斷的處理流程圖
超時(shí)設(shè)計(jì)
這里的超時(shí)設(shè)計(jì)有點(diǎn)特殊,FIFO的超時(shí)是指間隔,因?yàn)橛袝r(shí)候可能是A設(shè)備數(shù)據(jù)發(fā)慢了或者其它原因堵塞了導(dǎo)致的,所以FIFO每次收到數(shù)據(jù)之后會有一個(gè)時(shí)間間隔,比如我們設(shè)置為3,那么當(dāng)收到一個(gè)數(shù)據(jù)后超過3個(gè)周期收到周期沒有收到數(shù)據(jù),就會產(chǎn)生超時(shí)中斷,若恰好2個(gè)周期數(shù)據(jù)來了,那么這個(gè)周期計(jì)數(shù)就會被清空置0,這里設(shè)置的方式也不是直接設(shè)毫秒的,設(shè)置是以1分之幾為單位,如當(dāng)前FIFO緩沖區(qū)大小是12字節(jié),設(shè)置1/8字節(jié)為填滿字節(jié),1/3為超時(shí)間隔,即8個(gè)字節(jié)產(chǎn)生填滿中斷,超過3個(gè)接收字節(jié)時(shí)間間隔沒有收到數(shù)據(jù)產(chǎn)生超時(shí)中斷
有的MCU里的FIFO存儲器沒有超時(shí)中斷的功能,用戶可以自己寫一個(gè),使用自己內(nèi)部時(shí)鐘或者寫一段時(shí)間代碼,來定時(shí)將RXIFLSEL與TXIFLSEL標(biāo)志位置1產(chǎn)生中斷,這兩個(gè)位是用于輸入與輸出中斷的。
FIFO緩沖區(qū)的清空
FIFO在設(shè)計(jì)時(shí)是不需要用戶去清空緩沖區(qū)的,我們只需要讀就可以了,FIFO是以填充的形式的去覆蓋緩沖區(qū)的,FIFO自己也不會去清空緩沖區(qū),它只會覆蓋緩沖區(qū),通過用戶設(shè)定的大小將新數(shù)據(jù)填充到緩沖區(qū)里然后產(chǎn)生中斷,這樣舊數(shù)據(jù)就被新數(shù)據(jù)替代也省去一個(gè)時(shí)間周期來清空緩沖區(qū),那么這就產(chǎn)生一個(gè)問題,就是接收時(shí),出現(xiàn)了超時(shí)的情況,如我們預(yù)設(shè)是8個(gè)字節(jié)為填滿,在經(jīng)過上一次工作后新數(shù)據(jù)還沒有填滿8個(gè),只填了4個(gè),那么此時(shí)產(chǎn)生超時(shí)中斷,也就意味著其中4個(gè)是新數(shù)據(jù)剩下4個(gè)是舊的沒有填充的數(shù)據(jù),所以這里需要注意一下
FIFO 輸入與輸出中斷
輸入的中斷條件是緩沖區(qū)里的數(shù)據(jù)達(dá)到用戶設(shè)置的長度后產(chǎn)生中斷告知用戶來取走
輸出的中斷條件是緩沖區(qū)里的數(shù)據(jù)達(dá)到用戶設(shè)置的長度并發(fā)出去后產(chǎn)生中斷
FIFO緩沖區(qū)取數(shù)據(jù)時(shí)的原理
FIFO去取數(shù)據(jù)時(shí)不能指定地址位且只能一次取一個(gè)字節(jié),不能取指定地址上的字節(jié),每次產(chǎn)生輸入中斷取數(shù)據(jù)時(shí)FIFO里有個(gè)地址寄存器,當(dāng)我們每次去取一次以后,這個(gè)地址位自動加1,需要用戶手動判斷是否取完然后清空標(biāo)志位
其它
一般情況下我們是不會用FIFO的因?yàn)閁ART是低速通訊方式,它每次只傳一個(gè)BIT在波特率的速率計(jì)算下其實(shí)速度是很慢的
FIFO在對一些一個(gè)字節(jié)就要求有響應(yīng)的一些工作條件下是不建議使用的
UART FIFO
跟上面說的一樣,UART這里也只不過將FIFO存儲器設(shè)計(jì)到了UART串口芯片里去了,會提供對應(yīng)的寄存器讓你去配置FIFO存儲器,也提供了對應(yīng)的標(biāo)志位用于表示當(dāng)FIFO存儲器的當(dāng)前狀態(tài),如TX Ready與RX Ready位用于表示輸入與輸出緩沖區(qū)里是否有數(shù)據(jù),當(dāng)完成一次中斷后它倆會被清0,當(dāng)有新數(shù)據(jù)覆蓋時(shí)才會置1,RXIFLSEL與TXIFLSEL標(biāo)志位用于表示輸入與輸出緩沖區(qū)里的數(shù)據(jù)長度是否達(dá)到用戶設(shè)置的長度,這兩個(gè)位會置1并產(chǎn)生中斷,這個(gè)位不是自動清空的,是需要用戶手動去置0,如果不置0會無限進(jìn)入中斷
FIFO緩沖區(qū)是有最大字節(jié)數(shù)的,這個(gè)具體要看你的MCU手冊里UART這塊針對FIFO的設(shè)置,UART若支持FIFO功能則會有對應(yīng)的FIFO寄存器用于控制與開啟即nofifo模式與fifo模式
FIFO有兩種中斷,一種是填滿深度中斷,一種是超時(shí)中斷,這兩個(gè)參數(shù)都需要手動設(shè)置,第一個(gè)中斷即需要設(shè)置好當(dāng)前FIFO的深度,如設(shè)置為8字節(jié),當(dāng)FIFO緩沖區(qū)填滿為8個(gè)字節(jié)時(shí)則響應(yīng)中斷
FIFO針對發(fā)送與接收都有對應(yīng)的緩沖區(qū),當(dāng)緩沖區(qū)達(dá)到標(biāo)準(zhǔn)時(shí)會將對應(yīng)的中斷標(biāo)志位置1
?
USART
USART是支持同步的一種串口模式,它基于UART,全名是:Universal Synchronous/Asynchronous Receiver/Transmitter(通用同步/異步串行接收/發(fā)送器)
這里說一下同步、異步,半雙工與全雙工的意思
異步
異步是一種通訊方式,是指不需要知道何時(shí)開始通訊,也不需要知道目標(biāo)方的時(shí)鐘頻率是多少,只需要一個(gè)起始信號,來告訴別人開始通訊了,即異步操作,不需要另外一方一直等著或者每隔一段時(shí)間來一次通訊,另外一方只需要在一個(gè)周期里進(jìn)行采樣,當(dāng)采樣到了起始信號則開始通訊
半雙工
即一個(gè)線可以傳也可以收,但是不能一邊傳一邊收
全雙工
即兩根線,一根線穿,一根線收,UART就是異步全雙工,可以同時(shí)傳也可以同時(shí)收
同步
同步要求兩根線在傳輸時(shí)必須保證數(shù)據(jù)的一致性,異步是不考慮這個(gè)的,異步是可以一邊發(fā)一邊收,它不管發(fā)送的與接收的數(shù)據(jù)是否具有一致性,異步是非阻塞的,而同步是阻塞的,它要求數(shù)據(jù)發(fā)送之后在沒有接收到數(shù)據(jù)之前是不會進(jìn)行下次通訊的
即同步要求發(fā)送與接收都完成之后才開學(xué)下一次傳輸,保證兩根線是同步工作。
總結(jié)
以上是生活随笔為你收集整理的UART工作原理详解的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 内存条上的数字代表的意义
- 下一篇: 什么是IP化改造