uart串口的調試學習


用FPGA設計了數據接收和發送模塊,FIFO模塊,此處FIFO調用的是Show-ahead模式,在下一篇博客中將會分析這個問題。

用串口調試工具發送數據,數據接收模塊將接收到的串行數據轉換為並行數據(串轉並),並存入FIFO中,當FIFO中的數據個數大於某個值的時候,讀出數據,通過發送模塊將並行數據轉換為串行數據(並轉串),然后就可以在串口調試工具上看到接收到的數據。

注意的點:

1、接收數據時,接收的數據因為不確定什么時候會來,所以有可能出現亞穩態,因此要進行同步處理,打兩拍。

2、不論是接收還是發送數據都是從低位開始的。

3、采數據的時侯要在數據中間取值,原因下文有講。


 基本概念:

波特率與比特率?

波特率:單位時間內傳輸碼元的個數(碼元是攜帶數據信息的信號單元,有可能是1位的,也有可能是多位)

比特率:單位時間內傳輸了多少位數據

比特率=波特率*碼元的位數

因為UART數據是一位一位傳輸的,所以波特率與比特率在這里可以認為是等效的,不用過於糾結,我們就直接理解成1s傳送了多少位數據就可以了。

這是一個很不專業的總結,但是能很快理解二者關系

常用的波特率有 9600,19200,38400等,這里用9600進行詳細講解

波特率位9600,則每一位數據的時間為 1s/9600=1000_000_000 ns/9600 =104166.67ns

因為時鍾頻率是50Mhz,因此需要104166.67ns/20ns=5208個時鍾周期。

這里需要注意的問題是我們的時間並不能整除,有誤差,因此設計的時候要在數據的中間取值,這樣就可以避免數據出錯。


 UART數據傳輸格式

 

數據格式由起始位、數據位(位數可以位7、8等)、奇偶校驗位(可有可無)、停止位(接收數據時可以忽略,發送數據時必須要有停止位)

上面已經說過每個數據的時間為5208個時鍾周期,因此需要設計一個計數器cnt_5208

接收數據時為 起始位+8位數據位,即9位數,因此需要一個計數器來指示是哪一位數,cnt_bit。

接收數據時怎么檢測有數據要來呢?

空閑時刻,數據線處於高電瓶,有數據來時要發送低電平,因此我們可以利用這個特性進行一個邊沿檢測,檢測到下降沿的時候就知道有數據要來了。

接收數據注意的要點有哪些?

1、亞穩態問題:並不能確定數據什么時候來,所以為了避免出現亞穩態,我們需要對到來的數據進行同步化處理,就是簡單的打兩拍。

2、最好是在數據穩定的時候采集數據,所以有 clk_en =(cnt_5208 ==TIME_5208/2 -1)? 1'b1:1'b0,這個使能信號,可以保證在數據中間時刻采值,正確率高。

 

發送數據時 起始位0 +8位數據位 +停止位1,同樣也需要一個計數器來指示是哪一位數。

發送數據模塊注意的要點有哪些?

發送數據模塊就是把接收到的數據一位一位發出去,這時候就要設計一個rdy信號告訴外面的模塊系統是否處於工作模式,這樣可以防止數據的丟失,

我們一板將要發送的數據先緩存起來,然后再一位一位發出去,這樣也避免了再發送數據的時候受其他因素影響造成信息錯誤。

 

還要注意數據傳送的時候都是從低位開始。這一點很重要很重要,否則發送的數據和接收到的數據就不一樣,我是深深被傷到了,浪費了好多時間,以后要細心,不能再想當然,要遵守協議。。。。。

 


調試結果:當發送超過60字節的數據時,就會接收到數據,結果如下。

發送了01020304050607,即4位*14=56位數,即一次發送7字節的數據。

代碼已經打包

http://files.cnblogs.com/files/aslmer/%E4%B8%B2%E5%8F%A3%E8%B0%83%E8%AF%95%E4%BB%A3%E7%A0%81.zip

 

 

轉載請注明出處:http://www.cnblogs.com/aslmer/p/5869015.html


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM