UART的16倍頻過取樣和3倍頻過取樣

2021-08-19 15:49:11 字數 3110 閱讀 2801

隨著電子設計自動化(eda)技術的發展,可程式設計邏輯器件fpga/cpld已經在許多方面得到了廣泛應用,而uart(通用非同步收發器) 是在數字通訊和控制系統中廣泛使用的序列資料傳輸協議。因此越來越多使用者根據自己的需要,以eda技術作為開發手段,用一塊fpga/cpld設計出符合自己需要的uart晶元。基於fpga/ cpld的uart設計在諸多文獻中都有論述,在此不再對uart整個功能模組實現做太多的論述。本文著重分析uart接收器起始位的檢測。

3倍頻取樣的缺陷

首先,序列非同步通訊規定了字元資料的傳送格式。每一幀資料由起始位、資料位、奇偶校驗位、停止位和線路空閒狀態組成,格式如圖1所示。一般情況起始位為1 位,資料位為5、6、7或8位、奇偶校驗位為1位,停止位為1、1.5或2位。其中的起始位和停止位就是用來實現字元的同步。在空閒狀態,傳送線為邏輯 「1」狀態。資料的傳送總是以乙個「起始位」開始的,接著是要傳送的若干資料位,低位先行,最後是乙個「1」狀態的「停止位」;那麼,當接收器檢測到乙個 「1」向「0」的跳變時,便視為可能的起始位。起始位被確認後,就知道傳送器已開始傳送,當接收了已協議好的位數後並接收到字元幀中停止位就是一幀字元資料已傳送完畢。這樣,接收器就知道傳送器何時開始傳送資料和何時結束傳送資料。

要提高接收器的接收準確性,減少誤位元速率,必須要用比資料波特率高n 倍(n≥1)的速率對資料進行取樣。文獻2中採用了非常規的3倍頻取樣方法:用3倍頻的波特率對每一位資料進行取樣(如圖2所示),然後對3次取樣結果進行判決。如果3次取樣中至少有2次為高電平,則接收這一位資料被判決為高電平,否則,為低電平。

此方法剛開始給人感覺比常規的16倍頻取樣準確性高,因為每一位資料都進行3取2的判決,而16倍頻取樣對每位資料只進行一次中間取樣。然而筆者在實際應用中發現了其存在抗干擾性差,移植性差等不足。筆者在應用中自定義的非同步資料幀長達21位,應用環境是渦輪工作間。在這樣條件下,3倍頻取樣比在良好的實驗室環境效能差了很多,誤位元速率很高。

經分析**,發現3倍頻取樣方法在檢測非同步資料起始位沒有任何的抗干擾處理。如果在接收線上存在干擾訊號,即使是乙個很窄負脈衝干擾,接收器也會誤判為是資料幀的起始位,從而產生取樣時鐘進行後續的資料取樣。圖3所示為存在干擾訊號時,檢測起始位訊號時序**波形。圖中colck3-in是3倍頻取樣時鐘,clock1-in是資料波特率,datain是接收線上的資料。從圖中看出,干擾訊號後,colck3-in時鐘產生,接收器接收資料。可見接收到的資料都是錯誤資料。簡單說,文獻2中所論述方法不能識別真假資料起始位。再從程式可移植性來說,3倍頻取樣時鐘是用三個數值進行計數判斷而得,當波特率改變,其數值都要做相應改變,這就增加了程式的修改難度。

16倍頻取樣起始位的檢測

3倍頻取樣方法無法識別真假資料起始位,導致其抗干擾性差,準確性得不到保證。筆者拋棄非常規3倍頻取樣方法,採用了常規的16倍頻取樣方法:採用資料速率的16倍進行取樣,取樣時鐘連續取樣到8個低電平訊號,可確定該低電平為真正的起始位,從而防止干擾訊號產生的假起始位現象的發生。此後,接收器每隔16個取樣時鐘取樣一次,並把取樣到的資料作為輸入資料,以移位方式存入到接收移位暫存器。

起始位檢測8個連續脈衝的另乙個更重要的原因是,採用16倍頻取樣的時鐘,第8個取樣脈衝所對應的資料波形正好是該位資料位波形的正中點(以時鐘上公升沿取樣),在該處讀寫資料應該是最安全點。

在設計時,充分抓住非同步資料的特徵進行設計:起始位為低電平、停止位為高電平、每幀資料幀結構相同。根據非同步資料這些特徵就可設計出以下相應程式:

process(clk16x,start) --產生clk1x時鐘程序

begin

if start=』0』 then

q<="0001";

elsif clk16x』event and clk16x=』1』

then

q<=q+1;

end if;

end process ;

clk1x<=q(3);

process(clk16x,i,serialin,rst) --起始位檢測程序

begin

if rst=』1』 then

start<=』0』;

elsif rising_edge(clk16x) then    if serialin=』0』 then

start<=』1』 ;

elsif over=』0』 then

start<=』1』;

else start<=』0』;

end if;

end if;

end process;

process(clk1x,serialin,i,rst) --讀資料程序

begin

if rst=』1』 then

buff<= (others => 』1』);

dout_p<= (others => 』1』);

i<=0;

over<=』1』;

elsif rising_edge(clk1x) then

if i<>

buff21<=serialin;

i<=i+1;

over<=』0』;    else

i<=0;

over<=』1』;

dout_p<=buff;

end if;

end if;

end process ;

本設計採用vhdl硬體描述語言來進行描述。clk16x為16倍頻取樣時鐘,clk1x是檢測到真正起始位後由clk16x時鐘分頻產生的取樣時鐘,start為開始接收資料訊號(接收資料期間為高電平)、serialin為非同步資料輸入埠。平常,接收器按clk16x時鐘上公升取樣 serialin。當取樣時鐘檢測到低電平時輸出乙個高電平給start訊號,clk1x分頻計數器啟動。如果連續採集8個脈衝都為低電平(起始位之半),即確定該低電平為起始位,輸出乙個低電平給接收資料完訊號over(接收資料期間為低電平,接收完資料為高電平),over訊號在低電平檢測共同作用下保持start為高電平。start長時間保持高電平(8個clk16週期t)產生clk1x時鐘。反之判別為假起始位,over仍然為高電平,start卻變為低電平,clk1x分頻計數器復位,一直等到下次檢測serialin為低電平才重新啟動。可見,只有確定了起始位,clk1x時鐘才會產生,否則不產生。而clk16x時鐘始終存在,保證不會錯過每次接收線上的資料取樣。

結語按常規的16倍頻取樣方法接收非同步資料,其抗干擾性、移植性等都優於3倍頻取樣方法。實際應用表明,提高取樣倍數,接收準確性相應提高;在一定範圍內,提高資料波特率不會影響接收準確性。

2440下的UART實驗!!

這次uart的試驗的主要目的是掌握linux下串列埠通訊程式設計的基本方法,熟悉終端裝置屬性的設定,熟悉中斷函式的使用。linux下的串列埠驅動遵循posix標準,即將所有的裝置都看成檔案,因此使用posix標準可以想操作檔案一樣。就是利用那幾個函式open,read,write。int const...

6410之uart的配置

主程式start.s define config periport base 0x70000000 define config periport size 0x13 define wtcon 0x7e004000 global start start 告訴cpu 外設的位址 ldr r0,confi...

UART與USART的區別

uart與usart都是微控制器上的串列埠通訊,他們之間的區別如下 首先從名字上看 uart universal asynchronous receiver and transmitter通用非同步收 髮器 usart universal synchronous asynchronous recei...