RS485是一個定義平衡數字多點系統中的驅動器和接收器的電氣特性的標準,該標準由電信行業協會和電子工業聯盟定義。使用該標準的數字通信網絡能在遠距離條件下以及電子噪聲大的環境下有效傳輸信號。RS-485使得廉價本地網絡以及多支路通信鏈路的配置成為可能。
RS485有兩線制和四線制兩種接線,四線制只能實現點對點的通信方式,現很少采用,現在多采用的是兩線制接線方式,這種接線方式為總線式拓撲結構,在同一總線上最多可以掛接32個節點,如圖1所示。
圖1 RS485組網結構
在RS485通信網絡中一般采用的是主從通信方式,即一個主機帶多個從機。很多情況下,連接RS-485通信鏈路時只需要簡單地用一對雙絞線將各個接口的“A”、“B”端連接起來,忽略信號地的連接。這種連接方法能夠在許多場合正常工作,但是在更加惡劣的工作環境中,還是應該保證所有設備都良好的接地,以保證通信的可靠性。
數字電路中,由TTL電子元器件組成電路使用的電平,電平是個電壓范圍,規定輸出高電平>2.4V,輸出低電平<0.4V。在室溫下,一般輸出高電平是3.5V,輸出低電平是0.2V。最小輸入高電平和低電平:輸入高電平>=2.0V,輸入低電平<=0.8V,噪聲容限是0.4V。
RS-485的電氣特性:邏輯“1”以A、B兩線間的電壓差為+(2~6)V表示;邏輯“0”以兩線間的電壓差為-(2—6)V表示。接口信號電平比RS-232-C降低了,就不易損壞接口電路的芯片,且該電平與TTL電平兼容,可方便與TTL 電路連接。雖然標準情況下要求壓差為2~6V,但是實際上大多數的收發器芯片都將壓差限制到了不低于200mV即可,這樣能夠確保數據不會在網絡負載很大的時候因為壓差降低而被遺漏。
在很多工業設備,尤其是電力系統的儀器儀表中,大多使用RS485接口實現設備和主控站的通信。RS485接口屬于電氣接口,實現的是通信網絡中的物理層?;?/span>RS485物理層接口,使用UART控制器接收和發送按照標準串口協議編碼的數據,即可實現設備間最基本的數據收發。然后,再使用常見的上層應用層協議,典型的例如MODBUS協議,完成多個設備的通信管理。該通信層級模型如圖2所示:

圖2 基于MODBUS的RS485通信數據流圖
發送設備發送數據時,數據走向為:
MODBUS協議棧將用戶數據打包為一個MODBUS數據幀;
UART驅動以字節為單位將MODBUS數據幀交付給UART控制器;
UART控制器將字節數據完成并串轉換,然后通過發送腳送到RS485收發器的驅動器輸出(DI)端;
RS485收發器將DI端每一個bit的數據轉換為RS485標準的電平,通過雙絞線傳輸到遠端。
接收設備接收數據時,數據走向為:
RS485收發器檢測到雙絞線上的RS485電平的每一個單bit數據,將其轉換為普通的TTL電平信號,并通過接收器輸出腳(RO)腳送給UART控制器的接收腳;
UART控制器將接收腳上的每一個單bit信號按照UART協議進行接收解碼,得到以字節為單位的實際數據。
MODBUS協議棧將UART接收到的多個字節數據進行解析得到完整的數據幀,并解幀得到實際的數據部分
在實際應用時,MODBUS協議棧一般由CPU通過軟件方式實現。雖然使用FPGA,以HDL的方式也能實現一些特定的功能,但是總體來說復雜度高,靈活性差,應用局限性大。如果確實希望在FPGA內部實現MODBUS協議,除了使用HDL編程以外,還可以使用更加靈活的SOPC技術,通過在FPGA內部嵌入NIOS II或其他軟核CPU以軟件編程的方式實現。
鑒于上述情況,本實驗不對如何實現MODBUS協議棧做介紹,僅介紹如何完成基本的數據收發。
上文提到,要實現基于RS485接口的數據收發,需要有RS485的物理層收發器。能夠提供RS485收發器的廠家有很多,常見RS485收發器有MAX485、SP3485(3.3V供電)、ADI公司磁隔離方式的ADM2587以及周立功單片機有限公司開發的RSM485收發模塊等。在AC620開發板上,使用的是能夠支持3.3V供電的SP3485芯片,該芯片電路簡單,能夠實現完整的RS485收發器功能。表1為該收發器的功能框圖和引腳功能介紹。

表1 SP3485芯片引腳功能介紹
No. |
功能 |
功能描述 |
1 |
RO |
接收器數據輸出腳,輸出接收到的數據位 |
2 |
RE |
接收器使能腳,低電平有效 |
3 |
DE |
驅動器使能腳,高電平有效 |
4 |
DI |
驅動器數據輸入腳,待發送的數據位由此輸入 |
5 |
GND |
地 |
6 |
A |
未反轉的發送器輸出/接收器輸入腳 |
7 |
B |
經過反轉的發送器輸出/接收器輸入腳 |
8 |
VCC |
電源引腳 |
圖3為AC620開發板上RS485收發器的電路圖

圖3 AC620開發板RS485收發器電路圖
可以看到,SP3485的RE和DE兩個引腳被連接到了一起,然后接到FPGA上,這是因為兩者的有效狀態本身就是相反的,RE為低電平有效,DE為高電平有效。因此,同一個信號控制這兩個引腳,總能保證任意時刻接收和發送器中有且僅有一個被使能。
當RS485_REN信號為低電平時,RE有效,DE無效,因此SP3485芯片中的接收器被使能,而發送驅動器被關閉,芯片處于接收狀態;
當RS485_REN為高電平時,RE無效,DE有效,因此SP3485芯片中的接收器被關閉,而發送驅動器被使能,芯片處于發送狀態。
本設計基于小梅哥的《FPGA設計思想與驗證方法》視頻教程中“11串口發送模塊設計與驗證”和“12 串口接收模塊設計與驗證”兩個課程對應的隨堂工程改編而來。使用時,在“11串口發送模塊與驗證”隨堂工程基礎上添加“12 串口接收模塊設計與驗證”隨堂工程中的“uart_byte_rx.v”文件,然后對頂層文件稍加修改實現。
修改后的工程框架如圖4所示:

圖4 RS485收發工程功能框圖
可以看到,對于發送數據,還是和“11串口發送模塊與驗證”視頻中介紹的一樣,通過按下按鍵產生發送使能信號,將data_byte端口上的數據通過Rs232_Tx發出。而data_byte端口又連接到了In-System Sources and Probes工具的信號源端口(source)上,這樣,通過在In-SystemSources and Probes工具中給source設置不同的值,就能修改需要通過uart_byte_tx發送的具體數值了。
同時,為了保證發送時SP3485芯片中的發送驅動器是使能的,使用了uart_byte_tx模塊中的uart_state端口驅動SP3485的RE和DE信號。當uart_byte_tx模塊處于數據發送過程中時,uart_state信號為高電平,此時DE使能,RE無效,SP3485芯片的發送驅動器被使能,DI上的信號就能夠通過發送驅動器變為RS485電平,經由A、B兩個端口輸出。實際上,小梅哥在早期講解這個uart_byte_tx模塊的設計時刻意加上這個uart_state端口,就是為了方便該模塊用于RS485接口通信的。
當uart_byte_tx模塊數據發送完成,處于空閑狀態時,uart_state保持低電平,此時SP3485芯片中的接收器被使能,發送驅動器被關閉。所以,只要RS485總線上有任何電平變化,都能夠進入SP3485的接收器,并轉換為TTL電平,由SP3485的RO腳傳遞給FPGA,再接入uart_byte_rx模塊的Rs232_Rx信號上,完成串行數據的接收。接收到的數據連接到了In-System Sources and Probes模塊的探針端口(Probes)上,方便在In-SystemSources and Probes工具中實時觀察接收到的數據。
1、驗證時,有能力的請直接按照上文描述的內容,通過兩個課程的隨堂源碼搭建對應的應用工程。不熟悉的也可以直接使用我們提供的工程源碼,在AC620的“設計實例 --> AC620_Verilog_Example”里面能夠找到,工程名為AC620_RS485_RX_TX.rar。
2、按照下述引腳分配表完成工程的引腳分配
信號名 |
信號方向 |
FPGA管腳 |
Clk |
Input |
PIN_E1 |
Rs232_Ren |
Output |
PIN_D16 |
Rs232_Rx |
Input |
PIN_C16 |
Rs232_Tx |
Output |
PIN_D15 |
Rst_n |
Input |
PIN_E16 |
key_in0 |
Input |
PIN_M16 |
led |
Output |
PIN_A2 |
3、使用一個USB轉RS485轉換器,例如圖5所示,USB一端連接電腦,RS485一端連接開發板上的RS485接口。該轉換器一般使用的是CH340實現的USB轉串口,因此插到電腦上會識別出一個COM端口,在電腦上使用時,就像使用串口功能一樣。

圖5 USB轉RS485模塊
筆者手里沒有這個轉換模塊,但是有我們自己研發的多合一調試器模塊,該調試器能夠支持USB轉TTL、USB轉RS232、USB轉RS485功能,同時還帶有USB Blaster和ST_LinkV2功能,使用很方便,因此筆者就使用該調試器的USB轉RS485功能完成本實驗的調試。
將該調試器的RS485接口連接到AC620開發板的RS485接口上,如圖6所示。在電腦上選擇對應的COM端口就可以實現PC和AC620開發板通過RS485接口通信了。

圖6 使用多合一調試器實現RS485調試
4、打開串口調試軟件(推薦使用“串口獵人”),選擇PC上該USB轉RS485模塊對應的端口號,設置波特率為115200。
5、全編譯工程,下載sof文件到開發板中。
6、打開In-System Sources and Probes工具,將source和probe的顯示格式都切換為hex格式,然后在source的data欄中輸入希望發送的數據,然后按下開發板上的S0按鍵,可以看到,串口獵人上對應顯示出了接收到的數據,如圖7所示。

圖7 FPGA發送數據
7、選中In-System Sources and Probes中的probe,然后點擊持續讀取按鈕,在串口獵人中輸入一個字節的數據并點擊發送,則可以看到In-System Sources and Probes中的probe數據立即更新為了接收到的新數據,如圖8所示。

圖8 FPGA接收RS485數據
8、使用示波器測量RS485總線上的A和B端,如圖9所示。其中藍色波形為A,黃色波形為B??梢钥吹剑谝晃徊ㄐ危?/span>A-B的差值為-1.24V左右,代表0,對應了UART串口協議的起始位,第二位,A-B的差值為1.24V,代表1,而實際發送的數據37h的二進制值為00110111b,bit0的值為1,剛好與波形對應。
圖9 SP3485傳輸數據波形圖
自此,基于FPGA的RS485基本通信就實現了,用戶可以基于此工程,編寫上層的應用邏輯,以實現更加復雜多樣化的定制功能。當然,筆者更推薦使用NIOS II軟核CPU實現這些功能。