二总线,替代传统485总线通讯,主动上报方案简易实现方法

 二总线通信设计专栏

一、概述

    二总线通讯和传统485通讯类似,不能像CAN一样,在物理层面实现总线冲突检测,但在实际产品需求中,确实存在少量的偶发性上报,但又有即时性要求的需求,这种少量、偶发性主动上报功能利用软件也同样可以实现。

二、本文类容

    本文主要利用XM2BUS的从站芯片XM332芯片的CSMA端口引脚,配合软件逻辑来实现主动上报的原理讲解,本文所涉及的主动上报主要针对少量、偶发性的主动上报,比如电子围栏、货架、生产线传感器异常报警、车库系统车位传感器检测等。

三、XM332功能介绍

    在博文《二总线,选型及应用-CSDN博客》中以及介绍了XM620+XM332的基本原理,有需要可以先去了解,XM620为主站,XM332为从站,其通讯方式为半双工主从模式,即主站下发数据所有从站均可收到,从站上传数据,只有主站能够收到。

    XM332引脚说明如下所示,其中第4脚为CSMA载波监听引脚,主要监控总线当前数据(包括主站下发和其它从站上传),有数据(低电平),空闲(高电平);但是要注意的是由于二总线通讯波特率是2400bps/9600bps,本身单字节数据就超过1ms以上,所以仍然会产生数据冲突,需要理解这点,才能设计比较靠谱的冲突检测逻辑。

引脚

名称

输入

输出

说明

1

VCC

电压输入:(2.7~5.0)V

2

TX

芯片串口发送端

3

RX

芯片串口接收端,建议串联100Ω电阻

4

CSMA

载波监听,有数据(低电平);空闲(高电平)

5

PO

总线信号输出,外接三极管控制100欧电阻接入总线

6

NC2

预留,请悬空或者与7脚短接

7

PI

总线信号输入,需要外接分压电阻

8

GND

电源地

四、主动上报实现方法

    主从通讯中,由于主动上报的内容只是偶发性的,即时性要求高,更多的是对即时性要求不高的巡检操作,首先要区分轮询命令上报和主动上报;在主机轮询命令下,XM332的CSMA引脚有2~3byte的延迟释放时间,从机应改在这个时段内尽快回复,以抢占总线,这样就能避免主动上报和轮询上报的冲突,如果从机无法及时上报,那也可以先回复已经收到指令的上报内容,下次再轮询查询结果。

    主机轮询上报区分后,那么在主动上报中最大的坑就是切忌不要等CSMA一空闲马上上报,因为前面提到CSMA是有单字节延迟的,如果系统中若有2台设备同时需要上报,那么就必然会在这1ms内产生冲突;而是要等CSMA引脚释放后,随机等待N Byte,若还空闲则进行上报。

    如果做到随机数产生,一般简单的方案是采用的就是TIM定时器,不分频的计数值,在产生串口中断/人工触发中断来产生,也可以利用某个AD口采样的bit0,多次采样组合成8 bit形成一个随机值。

    疑问:若还是运气不好,产生了冲突怎么办?主动上报数据增加CRC校验即可;首先主机收到从机的主动上报数据,并进行CRC校验正确,则告知从机数据已经收到,避免从机多次重复上报,若从机未收到主机成功收到,那可以到下一轮再主动上报,并主动延长N Byte延时值减小冲突概率,这些细节问题可以根据产品实际情况而调整,也可以和我一起相互讨论。

五、总结

   本文主要针对XM2BUS二总线对偶发性的主动上报提供解决方案思路,而对于更复杂的多从机,大量并发性主动上报,如自动地址分配,采用的策略则完全不同,当然还有即时性的设备掉线检测等方案,后续也会发布出来,希望一起相互讨论学习,也希望大家多多关注和收藏,谢谢啦。

相关推荐

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-05-09 14:50:04       98 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-05-09 14:50:04       106 阅读
  3. 在Django里面运行非项目文件

    2024-05-09 14:50:04       87 阅读
  4. Python语言-面向对象

    2024-05-09 14:50:04       96 阅读

热门阅读

  1. mysql IF语句,模糊检索

    2024-05-09 14:50:04       29 阅读
  2. c++--引用干货

    2024-05-09 14:50:04       32 阅读
  3. opencv 轮廓区域检测

    2024-05-09 14:50:04       38 阅读
  4. C++堆结构与堆排序深度解析

    2024-05-09 14:50:04       32 阅读
  5. js 关于数组排序的方法

    2024-05-09 14:50:04       32 阅读
  6. C++ 可变参数模板

    2024-05-09 14:50:04       38 阅读
  7. 网闸与防火墙的区别

    2024-05-09 14:50:04       36 阅读
  8. 本地加载hugging face模型:Bert

    2024-05-09 14:50:04       37 阅读
  9. 【Excel VBA】在 Excel VBA 中使用 For 循环全面指南

    2024-05-09 14:50:04       31 阅读
  10. 神经网络和深度学习之间有什么区别

    2024-05-09 14:50:04       29 阅读