2009-12-21B_921600_baud_傳輸測試  黎煥欣

在 MCS51 系統中, 雙向資料傳輸, 如上篇所述, 115200 是它的極限. 但現在常常需要更快的資料傳輸至PC 時, 還是相當麻煩的事情. 在 NTU-ARRAY 上 FPGA 板上的資料就是用 921600 baud 的 RS232 protocol 傳送至主控電腦, 而且有四個板子一起傳送. 這個 through put 對 USB 1.1 12M 的能量而言, 並沒有什麼問題. 當資料只要單向傳送時, 是否有簡單的方法. 就是這個課題的目的. 當然我們測試的是用 TTL 位準傳送, 並且直接送到 USB chip (下圖中的 FTDI 公司的 FT232RL) 中, 它可以 handling.  而我的程式就如同一般的 serial port 操作就可以了.

921600 的頻率就從一個  1.8432MHz 的 OSC 過來除 2 就有了. 問題是出在如何用簡單的 TTL IC 產生 RS232 的協定. 以一個 8 bits 資料而言, 它有一個前置的 "L" 為起始 bit, 接著是 8 個位元, LSB 在前的資料. 最後是 1~2 個的 "H" 做為停止位元, 後面的 stop bits 簡單, 只要把 shift register 的 input 接 "H" 就可以了. 麻煩的是前面的起始位元.

shift register 是用 74HC165, 它需要一個 /LOAD 信號把外部的平行資料弄進來. 而後就會以 CLK 的速率將資料在下圖的 TXD8 送出去.

 

 我配合了同步計數器 LS161, 它有 RCO 輸出, 在整個 CLOCK -> CLOCK 期間會一直保持高電位完整的長度. 反相後給 HC165, 如下圖的接法, 在 /RCO 結束前, HC165 的輸出都會被 BLOCK 住, 等到 /RCO 完畢, HC165 的平行資料才會一個個出來.

下圖就是一個典型的 39H 加上前後置位元, 連續輸出的樣子. CH1 是 /RCO, 表示資料的起始.

而這是 LAB 的佈置

39H 的 ASCII 是 "9", 我們若是接收成功的話, 應該會看到一堆 "9", 那就對了.

不過 RS232 protocol 有個問題, 它一旦同步錯誤, 所有的資料都會讀錯. 上上圖 CH1 是 /RCO, 代表一個位元傳送的起始. 但我用的是 LS160, 它每隔 10 個 CLOCK 就會偱環一次,  它就會送出 1個 S + 8bits DATA + 2 bits STOP. 理論上應該可以看得, 但 PC 可不一定, 除非之前有很長一段空白的時間, 它才可以 "認知" 新傳進來東西的結構. 若是想我言個硬體一股腦的去傳, 那要有很多的 STOP BITS 它才能搞清楚資料到底從那邊開始的. LS160 的 10 CLOCK cycle 是不行的. 結果只會收到一堆亂碼

所以最後的辦法就是加長 space bits 的數量, 用 LS161 的話就是加上 6 個, 總共 8 個 stop bits, 那正常的 PC 接收端就會收到正確的的資料. 如下圖 space bits 多了很多.

 PC 就可以正確的讀取了.

確認它是用 921600 baud 接收的.







arrow
arrow
    全站熱搜
    創作者介紹
    創作者 huanhsin 的頭像
    huanhsin

    黎煥欣的工作部落格

    huanhsin 發表在 痞客邦 留言(0) 人氣()