当前位置: 首页 > news >正文

单片机-STM32部分:10-1、485

飞书文档https://x509p6c8to.feishu.cn/wiki/LNUjw1bHDiIkICkKRSRc6NccnQj

什么是RS485


RS485是美国电子工业协会(Electronic Industries Association,EIA)于1983年发布的串行通信接口标准。
 

RS485的特点:


总线标准,RS485具有支持多节点

一条RS485总线能并联多少台设备要看什么芯片,可以控制多少个设备的问题是与该485网络中的电气特性和协议特性所决定的,并和所用电缆的品质相关,节点越多、传输距离越远、电磁环境越恶劣,所选的电缆要求就越高。
支持32个节点数的芯片:SN75176,SN75276,SN75179,SN75180,MAX485,MAX488,MAX490
支持64个节点数的芯片:SN75LBC184
支持128个节点数的芯片:MAX487,MAX1487
支持256个节点数的芯片:MAX1482,MAX1483,MAX3080~MAX3089

传输距离远(最大1219m)

连接简单(在构成通信网络时,仅需要一对双绞线作传输线)

能抑制共模干扰(差分传输)

在多站、远距离通信等多种工控环境中获得了广泛应用。

多个设备进行485通讯的接线

RS-485通信链路时只是简单地用一对双绞线将各个接口的“A”、“B”端连接起来

在低速、短距离、无干扰的场合可以采用普通的双绞线,反之,在高速、长线传输时,则必须采用阻抗匹配(一般为120Ω)的RS485专用电缆(STP-120Ω(用于RS485 & CAN)),而在干扰恶劣的环境下还应采用铠装型双绞屏蔽电缆(ASTP-120Ω(用于RS485 & CAN))。

STM32RS485通信

STM32是没有硬件485接口的,所以通常使用485收发器将UART的TTL电平转换成RS485的差分信号。MCU的串口控制器TxD发送数据,经485收发器转换成差分信号,传输到总线上。接收数据时,485收发器将总线上的差分信号转化成TTL信号由RxD到串口控制器。

这里的485收发器,我们使用SP3485芯片。

我们先看看普通的收发电路。

DE: 1 发送使能;0发送禁止
RE: 0 接收使能;1接收禁止

当单片机要发送数据的时候,控制CTRL为高电平,数据通过485_TXD发送出去。
当单片机要接收数据的时候,控制CTRL为低电平,数据通过485_RXD接收回来。

这里我们可以看到需要485_RXD、485_TXD、CTRL 3个IO进行控制,如果我们希望使用更少的IO控制,有没有办法呢?

那我们可以使用自动收发电路,不用单片机引脚CTRL,当数据进来的时候,数据会自动通过RXD到单片机,当需要发送数据时,自动通过TXD发送出去。也就是只需要连接单片机的RXD和TXD引脚就可以,无需用单片机引脚连接485芯片的DE RE引脚。

R5的作用是限流,保护引脚,R5的大小,可以选择470欧、1K、4.7K都可以。
R6是上拉电阻,一般可以选择4.7K,也可以选择10K。
Q1是N型MOS管,当TXD高电平,MOS管导通,RE DE引脚接地,进入接收模式。当TXD低电平,MOS管截止,RE DE引脚接高电平,进入发送模式。
C3是电源旁路电容,作用是给485芯片提供一个干净的电源,使它稳定的工作。
电阻R1和R2,SP3485推荐电路,R1是下拉电阻,接到B上。R2是上拉电阻,接到A上。
电阻R3,匹配电阻。
双向稳压二极管D1、D2、D3的作用是把A、B引脚对地的电压以及A和B引脚之间的电压,牵制到6.5V以内,保护485芯片。

发送数据过程
发送数据,用的是单片机的TX引脚,也就是说,在TX引脚上表现数据。要发送数据0x32,写成二进制就是0x00110010,TXD引脚上就会依次的用高低电平体现1和0。
当TX发送0时,三极管不导通,DE接高电平,进入发送模式,485芯片会把DI上的电平反应到AB引脚上输出,因为DI已经接地,所以AB引脚会传输0。所以,当TXD发送0时,AB引脚发送0。
当TX发送1时,三极管导通,RE接低电平,进入接收模式,485芯片的AB引脚进入高阻状态,因为R2把A拉高,R1把B拉低,所以,AB传输的是1。所以,当TXD发送1时,AB引脚发送1。
一句话:TXD发1,AB就发1;TXD发0,AB就发0。

接收数据过程
接收数据,用的是单片机引脚RX,在RXD引脚上表现数据。在接收数据的过程中,TX引脚是一直保持高电平的,当TXD是高电平时,RE是低电平,正好变成了接收状态,然后485芯片的RO引脚(也就是接RX的引脚)就会接收AB传输过来的数据。

接线

因为我们电脑也是没有485接口的,所以如果需要接收485信号,则需要用485转UART的模块进行转换。

485通信接线是不交叉的,即A接A,B接B,可以多节点的挂载在总线上。

原理图

R3为120欧的阻抗匹配电阻,如果长距离通信的话,一定要在最后一个节点接上这一个电阻;

我们可以看到这里的UART转485使用PD2和PC12两个IO,对应UART5,

新建或复制工程,开启UART5,UART5对应PD2和PC12

代码和串口部分逻辑一样:

  /* USER CODE BEGIN 2 */uint8_t rxbuf[12];uint8_t ackbuf[]="ack";/* USER CODE END 2 */while (1){/* USER CODE BEGIN 3 */
//    uint8_t txbuf[]="Hello,world!";
//    HAL_UART_Transmit(&huart5,txbuf,sizeof(txbuf),1000);
//    HAL_Delay(500);    if(HAL_UART_Receive(&huart5,rxbuf,sizeof(rxbuf),1000) == HAL_OK){HAL_UART_Transmit(&huart5,ackbuf,sizeof(ackbuf),1000);}}

参考工程

参考飞书文档

相关文章:

  • TIME - MoE 模型代码 3.4——Time-MoE-main/time_moe/models/modeling_time_moe.py
  • 【并发编程】基于 Redis 手写分布式锁
  • 鸿蒙系统使用ArkTS开发语言支持身份证阅读器、社保卡读卡器等调用二次开发SDK
  • VBA将PDF文档内容逐行写入Excel
  • OpenLayers根据任意数量控制点绘制贝塞尔曲线
  • Lua—元表(Metatable)
  • c++——二叉树进阶
  • vue 中的ref
  • 多线程 2 - 死锁问题
  • c#建筑行业财务流水账系统软件可上传记账凭证财务管理系统签核功能
  • MindSpore框架学习项目-ResNet药物分类-模型优化
  • CSS渲染性能优化
  • STM32实现九轴IMU的卡尔曼滤波
  • 阿里云购买ECS 安装redis mysql nginx jdk 部署jar 部署web
  • STM32-ADC模数转换器(7)
  • 数据链共享:从印巴空战到工业控制的跨越性应用
  • Axure :基于中继器的列表删除 、 列表编辑
  • 深入理解 TCP:重传机制、滑动窗口、流量控制与拥塞控制
  • arXiv2025 | TTRL: Test-Time Reinforcement Learning
  • CDGP数据治理主观题评分标准与得分策略
  • 中美经贸高层会谈在瑞士日内瓦开始举行
  • 央行谈MLF:逐步退出政策利率属性回归流动性投放工具
  • 中国一重集团有限公司副总经理陆文俊被查
  • 马上评丨维护学术诚信别陷入“唯AI检测”误区
  • 青岛双星名人集团管理权之争:公司迁址,管理层更迭
  • 习近平同俄罗斯总统普京举行会谈