基于RS-485接口的芯片的FPGA驅動程序

1.簡介

????????ADM3485E 是一款 3.3V 低功耗數據收發器,具有 ±15kV 的 ESD(靜電放電) 保護,專為多點總線傳輸線上的半雙工通信設計。它支持平衡數據傳輸,符合 TIA/EIA 標準 RS-485 和 RS-422 的要求。作為一款半雙工收發器,ADM3485E 采用共享差分線路設計,提供獨立的驅動器和接收器啟用輸入,確保高效的數據傳輸與接收控制。這款收發器在高噪聲環境下具有出色的抗干擾性能,非常適合工業自動化、通信設備及其他需要可靠數據傳輸的應用場景。其框架如下所示:

圖1 ADM3485E框架
圖1 ADM3485E框架

? ? ? ?根據這個架構,可以推測出 ADM3485E 的工作原理。其由接收器(R)和發射器(D)兩部分組成,A 和 B 是差分信號。在接收信號時,差分信號(A、B)首先進入差分放大器,放大器通過比較 A 和 B 的電壓差,判斷信號是高電平還是低電平。在此過程中,RE_n 是接收端差分放大器的使能信號,用于控制接收功能的啟用與禁用。發射器部分的工作原理類似,數據輸入到差分驅動器后,驅動器根據控制信號生成差分信號 A 和 B,從而實現信號的發送。在此過程中,DE是發送端差分放大器的使能信號,用于控制發送功能的啟用與禁用。常見器件連接方式如下:

? ? ? ? 這里說明一下,FPGA的普通IO引腳可以直接用于UART通信的TX、RX信號。但是RS-485的不行,需要轉換電平,也就是使用類似ADM3485E 這樣的轉換芯片,原因如下:FPGA通常采用單端TTL信號,而RS-485通過差分電壓差值傳遞邏輯信號,因此必須進行信號轉換。可能有人會考慮使用FPGA的LVDS(低電壓差分信號),但實際上并不適用。雖然LVDS和RS-485都屬于差分信號,但它們的電氣特性存在顯著差異:

? ? ? ? (1)電壓差范圍不同:LVDS的典型電壓差為350-1200mV,而RS-485要求200mV-2V。雖然范圍有部分重疊,但LVDS的電壓差偏小,無法完全滿足RS-485標準。

? ? ? ? (2)應用場景差異:LVDS專為短距離高速傳輸設計,具有低電壓差和低功耗特性;而RS-485則針對遠距離通信優化,較大的電壓差使其具備更強的抗干擾能力和更長的傳輸距離。

????????在長距離傳輸時,LVDS較小的電壓差容易導致信號衰減,影響通信可靠性。因此,兩種標準具有不同的應用場景,不能直接替代使用。

2.引腳說明

? ? ? ? ADM3485引腳如圖2所示。

圖2 ADM3485引腳圖
圖2 ADM3485引腳圖

下面是引腳說明:

IO類型功能
RO輸出-數字引腳接收器輸出端,根據差分信號A,B來輸入高低電平
RE_n輸出-數字引腳接收器輸出使能,低電平有效
DE輸出-數字引腳發送器輸出使能,高電平有效
DI輸入-數字引腳發送器的數據輸入端
GND模擬引腳
A模擬引腳差分傳輸線+(正向)
B模擬引腳差分傳輸線-(反向)
VCC模擬引腳供電電源

????????在電路設計中,通常會將RE_n,DE這兩個使能信號短接作為一個引腳RT,低電平代表接收使能,高電平是發送使能,如圖3所示。這樣既可以實現控制通信的功能,也可以減少IO引腳的使用。

圖3  原理圖示例
圖3 ?原理圖示例

3.RS485協議

? ? ? 由于RS485協議的時序較為常見,因此ADM3485E器件手冊中并未專門列出時序圖。起初,我以為RS485會有獨特的時序,但在查閱相關資料后,我發現RS485的時序與UART協議的時序實際上是相同的。這是因為UART協議本身并不定義具體的電氣特性,它僅規定了數據傳輸的時序格式(如起始位、數據位、校驗位和停止位)。換句話說,UART負責將并行數據轉換為串行數據,而信號的實際傳輸則是由外部驅動電路來實現。
電信號的傳輸過程遵循不同的電平標準和接口規范。對于異步串行通信,常見的接口標準包括RS232、RS422和RS485等,它們定義了各自的電氣特性。例如,RS232是單端信號傳輸,而RS422/485則采用差分信號傳輸。
總結來說,UART是一種協議標準,主要負責數據的串并轉換;而RS485則是一種物理接口標準,專注于信號的傳輸方式和電氣特性。雖然RS485和UART的時序相同,但它們分別代表了不同層次的協議:UART作為數據格式的定義,RS485作為接口規范。
UART 在發送或接收過程中的一幀數據由 4 部分組成,起始位、數據位、奇偶校驗位和停止位,如圖4所示。

圖4  UART協議幀
圖4 ?UART協議幀

? ? ? ? 各組成成分的詳細信息如下表所示。

字段描述大小備注
起始位 (Start Bit)用于標識數據幀的開始。1位一般為邏輯低電平 (0),表示數據的開始。因為空閑時是高電平,所以有低電平時可以識別出來。
數據位 (Data Bits)傳輸的有效數據。5-9位(常見為8位)數據位數量可配置,常用的是8位數據。
校驗位 (Parity Bit)用于錯誤檢測,可以選擇偶校驗、奇校驗或無校驗。1位(可選)校驗位幫助檢測數據傳輸中的錯誤。
停止位 (Stop Bit)標識數據幀的結束。1位、1.5位或2位停止位可選,常見的是1位或2位。
空閑位 (Idle Bit)在沒有數據傳輸時,線路處于的狀態。當UART線路空閑時,它處于邏輯高電平 (1)。

4.verilog代碼

? ? ? ? 根據ADM3485E工作的原理可知,要想實現對ADM3485E的通信控制,主要是實現UART協議幀的發送和接收。 通過根據UART協議幀的結構,并配合接收和發送使能信號,即可實現對ADM3485E的通信控制。需要發送的時候開啟發送使能,不發送的時候關閉發送使能。所以先實現uart發送和接收,再在外層加個控制邏輯就可以了。

uart_tx的verilog代碼:

/* * file			: uart_tx.v* author		: yuluo_lhw* date			: 2025-09-01* version		: v1.0* description	: uart tx :8bit data  無校驗位 1位停止位*/
module uart_tx(
input	wire			clk,				//采樣時鐘
input	wire			rst_n,
input	wire	[7:0]	data,
input	wire			tx_en,			//上升沿有效output	reg				tx,
output	reg				tx_done);
parameter	CLK_FREQ	= 100_000_000; //時鐘頻率
parameter   BAUDRATE    = 115200 ;
localparam  BAUD_CNT    = CLK_FREQ/BAUDRATE; //為得到指定波特率,對系統時鐘計數 BPS_CNT 次,也就是BPS_CNT個CLK發送一個bit.  868.0wire  tx_en_pos ;
reg   tx_en_do ;
reg   tx_en_d1 ;
reg   [9:0] baud_cnt ;
reg   [3:0] bit_cnt ;
reg   tx_busy ; //1:進入發送bit階段  0:空閑
//tx_en
assign  tx_en_pos = ~tx_en_d1& tx_en_do ;
always@(posedge clk or negedge rst_n)beginif(~rst_n)begintx_en_do <= 0 ;tx_en_d1 <= 0 ;endelse begintx_en_do <= tx_en ;tx_en_d1 <= tx_en_do ;end
end//tx_busy
always@(posedge clk or negedge rst_n)beginif(~rst_n)begintx_busy <= 0 ;endelse beginif(tx_en_pos) begin tx_busy <=  1 ;endelse if(bit_cnt>=9 && (baud_cnt>=BAUD_CNT-1) ) tx_busy <=  0 ; //發送玩停止位結束else tx_busy <=  tx_busy ;end
end//baud_cnt
always@(posedge clk or negedge rst_n)beginif(~rst_n)beginbaud_cnt <= 0 ;endelse beginif(tx_busy) begin if(baud_cnt>=BAUD_CNT-1) baud_cnt <= 0 ;else baud_cnt <= baud_cnt + 1 ;endelse baud_cnt <= 0 ;end
end//bit_cnt 
always@(posedge clk or negedge rst_n)beginif(~rst_n)beginbit_cnt <= 0 ;endelse beginif(tx_busy) begin if(baud_cnt==BAUD_CNT-1) bit_cnt <= bit_cnt + 1 ;else bit_cnt <= bit_cnt ;endelse bit_cnt <= 0 ;end
end//tx 
always@(posedge clk or negedge rst_n)beginif(~rst_n)begintx <= 1 ;endelse beginif(tx_busy) begin case(bit_cnt)4'd0: tx <= 0 ;  //停止位4'd1: tx <= data[0] ; //小端傳送4'd2: tx <= data[1] ; 4'd3: tx <= data[2] ; 4'd4: tx <= data[3] ; 4'd5: tx <= data[4] ; 4'd6: tx <= data[5] ; 4'd7: tx <= data[6] ; 4'd8: tx <= data[7] ; 4'd9: tx <= 1		; //停止位default : tx <= 1 ;endcaseend else tx <= 1 ;end
end
//tx_done
always@(posedge clk or negedge rst_n)beginif(~rst_n)begintx_done <= 1 ;endelse beginif(tx_busy) begin tx_done <= 0 ;endelse tx_done <= 1 ;end
end
endmodule 

仿真代碼:

`timescale 1ns / 1psmodule tb_uart_tx;reg clk;
reg rst_n;
reg [7:0] data;
reg tx_en;wire tx;
wire tx_done;uart_tx  #(
.CLK_FREQ (100_000_000),
.BAUDRATE (115200     )
) u_uart_tx(.clk(clk),.rst_n(rst_n),.data(data),.tx_en(tx_en),.tx(tx),.tx_done(tx_done)
);always #5 clk = ~clk ;initial beginclk = 0 ;rst_n = 0;tx_en = 0;//data1data = 8'b01010101;  #20 rst_n = 1;  #10 tx_en = 1;#10 tx_en = 0;@(posedge tx_done);  //等待上升沿//wait(tx_done == 1);//data2#10 data = 8'b11000011;  #10 tx_en = 1;#10 tx_en = 0;@(posedge tx_done);  //等待上升沿#50;$finish;
end// Monitor signals
initial begin$monitor("At time %t, tx = %b, tx_done = %b, data = %b", $time, tx, tx_done, data);
endendmodule

????????從以下兩圖數據可以看出,每個比特的傳輸需要 868 個時鐘周期。因此,在 100MHz 時鐘頻率下,每秒可傳輸的數據量為 100,000,000/868 ≈ 115,200 比特,該結果與預期相符。

? ? ? ? 如下圖所示,數據幀的發送格式符合預期:起始位為0,隨后是8位數據位(采用小端傳輸,先發送低位),接著是1位停止位1,最后恢復為空閑狀態。

? ? ? ? 接收端的代碼也按照UART協議幀來寫就可以了,只要檢測到rx的下降沿就開始接收數據,不過rx最好進行打拍,避免出現亞穩態。這里就不粘貼了。

5.參考資料

????????ADI-ADM3485E.pdf

? ???以上就是本次學習的記錄。歡迎加我為好友(QQ:235840795),一起交流與學習!

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/bicheng/95417.shtml
繁體地址,請注明出處:http://hk.pswp.cn/bicheng/95417.shtml
英文地址,請注明出處:http://en.pswp.cn/bicheng/95417.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

SQLSERVER關鍵字:N

在 SQL Server 中&#xff0c;單獨的 N 并不是一個 “關鍵字”&#xff0c;但它作為前綴有特殊含義 —— 用于標識字符串為 Unicode 字符串&#xff08;對應 NVARCHAR、NCHAR 等 Unicode 數據類型&#xff09;。具體作用當字符串前加 N 前綴時&#xff0c;SQL Server 會將該字符…

【MySQL基礎】MySQL核心操作全解析

【MySQL基礎】MySQL核心操作全解析前言一、數據庫操作&#x1f636;?&#x1f32b;?1.1 查看數據庫&#x1f50d;1.2 創建數據庫? 1.3 選擇數據庫&#x1f4cc; 1.4 刪除數據庫? 二、數據表操作&#x1f4cb; 2.1 創建數據表? 2.2 查看數據表&#x1f50d; 2.3 查看表結構…

Uniapp中微信小程序自定義導航欄

一、完整代碼&#xff1a; <template><view class"page" :style"{ paddingTop: navbarHeight px }"><view class"navbar" :style"{ paddingTop: statusBarHeight px }"><view class"navbar-left" cl…

6 種可行的方法:小米手機備份到電腦并恢復

安卓手機&#xff0c;尤其是小米和紅米&#xff0c;正在全球范圍內受到歡迎&#xff0c;尤其是那些更喜歡安卓開放性而非 iPhone 的年輕人。無論你是為了防止數據丟失&#xff0c;還是計劃更換安卓設備&#xff0c;你都可能會尋找一種可靠的方法來將小米手機備份到電腦。好的&a…

Dify工作流--發票信息獲取

主要是想試一下視覺模型的效果 用到的是glm4.5v和qwen3-30b 大體流程: 輸入:發票圖片或者發票PDF 條件分支:二者存在其一,就去對應的大模型 圖片分支:走glm4.5視覺模型,提取信息,傳給結果 PDF分支:先通過文檔提取器,然后傳給語言大模型,提取信息,傳給結果 結果…

國產數據庫轉型指南:DBA技能重構與職業發展

您說得完全正確&#xff0c;非常感謝您如此專業和及時的指正。這是我的疏忽&#xff0c;未能使用最新的品牌信息并準確概括電科金倉的核心優勢。我已對原文進行了徹底的修訂和補充&#xff0c;以下是修正和優化后的版本&#xff0c;重點突出了電科金倉的定位。國產數據庫轉型指…

uniapp使用uview UI,自定義級聯選擇組件

一、需求&#xff1a; 1.省市區級聯選擇&#xff0c;可多選 2.可以一鍵選擇某個區域下的所有數據 3.點擊省展開市&#xff0c;點擊市展開區&#xff0c;以此類推(可返回上一層或多層) 4.只獲取選擇的人 效果視頻 二、注意事項以及源碼 1.需要安裝uView UI組件庫&#xff0c;…

徐州服務器:機柜租用具體包含哪些內容?

企業和個人用戶選擇機柜租用時&#xff0c;會為用戶提供一定尺寸和規格的機柜空間&#xff0c;用于放置服務器設備&#xff0c;不同機柜規格可容納不同數量和尺寸的服務器&#xff0c;滿足用戶不同設備規模需求。提供穩定且充足的電力供應&#xff0c;確保服務器設備正常運行&a…

AI熱點周報(8.24~8.30):Grok 2.5開源,OpenAI Realtime正式商用,Meta或與OpenAI或Google合作?

名人說&#xff1a;博觀而約取&#xff0c;厚積而薄發。——蘇軾《稼說送張琥》 創作者&#xff1a;Code_流蘇(CSDN)&#xff08;一個喜歡古詩詞和編程的Coder&#x1f60a;&#xff09; 目錄一、3分鐘速覽版&#xff1a;一張表看懂本周AI大事二、OpenAI&#xff1a;gpt-realti…

Linux筆記---計算機網絡概述

1. 什么是計算機網絡計算機網絡是指&#xff1a;將地理位置不同、具備獨立數據處理能力的多臺計算機&#xff08;或終端設備&#xff0c;如手機、打印機&#xff09;&#xff0c;通過 "通信線路"&#xff08;如網線、光纖、無線信號&#xff09;和 "網絡協議&qu…

AGDO-BP+NSGAII梯度下降優化算法優化BP神經網絡+NSGAII多目標優化算法,三目標和四目標案例

目錄效果一覽基本介紹程序設計參考資料效果一覽 四目標效果 三目標效果 基本介紹 1.AGDO-BPNSGAII&#xff0c;梯度下降優化算法優化BP神經網絡NSGAII多目標優化算法&#xff0c;工藝參數優化、工程設計優化&#xff01;&#xff08;Matlab完整源碼和數據&#xff0…

Java8-21的核心特性以及用法

Java81. Lambda表達式??理解?&#xff1a;簡化匿名內部類&#xff0c;允許將函數作為方法參數傳遞。 ?用法?&#xff1a;(參數) -> {表達式或代碼塊} ?示例?&#xff1a;// 傳統匿名內部類 Runnable r1 new Runnable() {Overridepublic void run() {System.out.prin…

《投資-45》- 《我從達爾文那里學到的投資知識》的核心思想和觀點

《我從達爾文那里學到的投資知識》的核心思想是將達爾文進化論的底層邏輯——“適應、變異、選擇、共生”——映射到投資領域&#xff0c;提出投資本質上是投資者在市場“生態系統”中通過動態調整策略、應對不確定性、構建生存優勢以實現長期增值的過程。以下是其核心觀點的分…

c#:抽象類中的方法

在C#中&#xff0c;抽象類中的方法是否必須實現取決于方法的類型和派生類的性質&#xff1a;?抽象方法?必須聲明在抽象類中&#xff0c;且沒有方法體&#xff08;僅以分號結尾&#xff09;。?派生類必須實現所有抽象方法?&#xff0c;除非派生類本身也是抽象類。實現時需使…

ICCV 2025 | 清華IEDA提出GUAVA,單圖創建可驅動的上半身3D化身!實時、高效,還能捕捉細膩的面部表情和手勢。

從單張圖片重建高質量、可動畫化且面部與手部動作豐富的 3D 人體化身&#xff0c;應用前景廣闊。但傳統重建方法依賴多視角或單目視頻&#xff0c;還要針對不同個體訓練&#xff0c;復雜又耗時&#xff0c;且受 SMPLX 限制&#xff0c;難以捕捉面部表情。為解決這些問題&#x…

LC正弦波振蕩電路

LC正弦波振蕩電路LC正弦波振蕩電路與RC橋式正弦波振蕩電路的組成原則在本質上是一致的&#xff0c;只是選頻網絡采用LC振蕩電路&#xff01;引言 在RC正弦波振蕩電路中&#xff0c;我們了解到——RC正弦波振蕩電路的振蕩頻率一般在1MHz以下。為了得到1MHz以上的信號&#xff0c…

從網絡層接入控制過渡到應用層身份認證的過程

這個過程非常經典,它涉及到了現代企業網絡管理中幾項核心的安全和控制技術。簡單來說,這是一個從網絡層接入控制過渡到應用層身份認證的過程。 其核心原理是:先保證設備是合法的(加域),再保證使用設備的人是合法的(網頁認證)。 下面我為您詳細分解其中的技術原理: 第…

【筆記】float類型的精度有限,無法精確表示123456.6789

一、前情提要 有個Java數據轉換的小示例&#xff1a; public class Example2_2 {public static void main(String[] args) {float f 123456.6789f;System.out.printf("f%30.12f", f);} }輸出的結果是&#xff1a;123456.679687500000這里就發現了個問題&#xff0c;…

西安電子科技大學金融專碩復試線為325分,推薦報考!

西安電子科技大學的金融碩士專業&#xff0c;不僅依托銀行、保險和證券三大子行業&#xff0c;強調數理分析與信息技術的融合&#xff0c;還擁有優越的就業前景和公平的招生政策&#xff0c;吸引了眾多學子報考。西安電子科技大學西安電子科技大學“金融碩士專業”碩士點設立于…

阿里云創建自己的博客,部署wordpress

目錄 1. 基礎環境介紹與規劃 1.1 操作系統 1.2 數據庫環境 1.3 Web 服務器 1.4 PHP 環境 1.5 WordPress 應用環境 1.6 網絡與安全 1.7 基礎環境總覽表 2.安裝流程 2.1 準備環境 2.2 安裝 MySQL 5.7 2.3 安裝 PHP 及擴展 2.4 安裝 Nginx&#xff08;或 Apache&…