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&…