二总线,替代传统485总线通讯,在线地址分配商用方案解析

 二总线通信设计专栏

一、概述

    在二总线、485、CAN等总线系统中,每个设备都会有个自身独立的地址,而地址的设置:有的采用设备端配置,如通过拨码开关或者通过按键交互界面,有的采用专用工具厂家内部先配置好,还有的是通过专用工具现场配置,当然还有的是自动地址分配,可参见《二总线,替代传统485总线通讯,地址自动分配或主动上报方案-CSDN博客》;当从机体积非常小时,为了节约时间,用也可以采用在线地址分配的方式,通过一个按键触发主机按规则自动分配地址。

XF2485灯带演示

二、本文内容

    本文利用使用《二总线,替代传统485总线通讯,低成本直流载波方案实现及原理-CSDN博客》方案做的灯带方案来分析如何实现在线地址分配方案,以及提供整个灯带方案的通讯协议。

三、直流载波灯带方案

    直流载波灯带的安装环境原因,使得整个灯带宽度只有7.5mm,需要安装在灯槽中,因此面积和提及都非常有限,若需分配地址,最佳的方案则是在线地址分配。如下图原理图所示,利用单片机NY8AE51F实现单路LED的PWM驱动。

    单片机引脚功能定义如下表;XF2485直流载波芯片则使用单臂驱动方式,以节约器件数量减少PCB空间,通过单片机的PB3口作为按键触发在线地址分配。

引脚号引脚名引脚功能
2PB5空闲
3PB4空闲
4PB3地址上报按键(自身地址与临时地址)
5PB2LED驱动PWM口,1024级,低电平0%,高电平100%
6PB1串口发送TX,接XF2485-pin2-D
7PB0串口发送RX,接XF2485-pin3-R

四、在线地址分配实现原理

    在地址未分配前,所有设备都是无地址状态,因此主机要和从机实现一对一通信,需要从机拥有自己单独的地址,有些单片机出厂则包含了唯一ID即UID编号,而有些单片机不具备这个功能,因此需要自行随机生成一个临时的唯一ID实现临时地址分配用。

    自行生成的唯一ID,这么这里包含两个关键信息,随机生成、临时唯一ID;随机生成则可利用未分频的定时器计数器,和用户触发按键的时间,但这其实也不能完全保障唯一性,就需要使用临时时间窗口,比如按下按键2秒内有效,这样就能够完整的保证唯一性;整个流程如下:

    1、主机进入地址配置状态,并按自定义规则从某个地址开始分配,如从1号地址开始,自增方式。

    2、用户触发按键,单片机根据按键按下中断和弹起中断获得定时器TIM的2个1byte的计数值CNT,组成2Byte数据作为临时地址tmp_addr,则这个地址范围是0~65535,并将临时地址上报给主机。

    3、主机收到临时地址tmp_addr,并以此地址作为寻址,分配需要分配的地址给它,比如1号地址分配给它。

    4、从机收到此地址,则完成地址分配,有必要也可以反馈给主机,以使得主机对后续分配的地址进行自增操作。

五、实物通讯协议参考

    A、PC端配置工具

    xm2busLightCfg.exe,可通过工具查看通信过程的收发数据,有需要可联系本人获取。

    B、通信地址

    1、单向广播地址:0,设备只执行,不回复
    2、通用广播地址:255,设备执行并回复
    3、设备地址:1~254
    4、临时地址:0~65535,用于多设备在总线上,主机自动分配地址使用,通过按键触发随机生成

    C、通信协议(字节序:对于2字节数据,高字节在前,低字节在后)

    通信格式:功能码(1byte)+地址(1或2byte)+内容(0~2byte)
     *功能码:标识本数据包含义,从机反馈/上报功能码:通过将bit7=1,进行标识,即→功能码|0x80
     *地址:广播地址(0/255)、设备地址(0~254)、临时地址(0~65535)
     *内容:根据功能码不同,内容含义不同

    D、功能码说明

    1、PWM值设定
     *功能码:COMM_FUNC_PWM_SET=0x01
     *说明:PWM值设定,0~1024,0对应0%,1024对应100%,值超过1023则全开
     *主机下发:01H + addr(my_addr/00H/FFH) + pwm_h + pwm_l + XOR
     *从机上报:81H + my_addr + pwm_h + pwm_l + XOR
 
    2、寻址设备地址设定新地址
     *功能码:COMM_FUNC_ADDR_SET_NORMAL=0x02    
     *说明:寻址设备地址值设定新地址
     *主机下发:02H + addr(my_addr/00H/FFH) + new_addr + XOR
     *从机上报:82H + my_addr + new_addr + XOR
 
    3、寻址临时地址设定新地址
     *功能码:COMM_FUNC_ADDR_SET_MANU=0x03
     *说明:通过手动触发地址值设定,通过按键上报临时地址,在4秒内,主机可通过临时地址设置指定地址
     *流程:
         * 1、通过PB3按键触发主动上报COMM_FUNC_TMP_ADDR_REPORT,主机获取tmp_addr1 + tmp_addr2
         * 2、主机下发:03H + tmp_addr1 + tmp_addr2 + new_addr + XOR
         * 3、从机上报:83H + tmp_addr1 + tmp_addr2 + new_addr + XOR
 
    4、读取PWM值
     *功能码:COMM_FUNC_PWM_READ=0x04
     *说明:读取当前PWM值
     *主机下发:04H + addr(my_addr/00H/FFH) + XOR
     *从机上报:84H + my_addr + pwm_h + pwm_l + XOR
 
    5、主动上报临时地址
     *功能码:COMM_FUNC_TMP_ADDR_REPORT=0x85
     *说明:通过PB3按键触发临时地址反馈,临时地址有效时间窗口:4秒左右
     *主机下发:无
     *从机主动上报:85H + my_addr + tmp_addr1 + tmp_addr2 + XOR

    E、校验

//给tx_buf[]末尾添加校验
//返回:增加校验后的tx_buf[]长度
uint8_t comm_x_xor_load(uint8_t *tx_buf,uint8_t tx_len)
{
	uint8_t i,xor=tx_buf[0];
	for(i = 1;i < tx_len;i ++)
	{
		xor ^= tx_buf[i];
	}
	tx_buf[i] = xor;
	tx_len ++;
	return tx_len;
}

//校验检查
//返回:0(成功),1(失败)
uint8_t comm_x_xor_check(uint8_t *rx_buf,uint8_t rx_len)
{
	uint8_t i,xor=rx_buf[0];
	for(i = 1;i < rx_len;i ++)
	{
		xor ^= rx_buf[i];
	}
	return (xor==0);
}

六、总结

    对于在线地址分配,除了解决设备自身尺寸问题导致的不便,也优化了施工过程初次地址分配时的工作的效率,当然在不同的使用条件下,也并没有一定就是在线地址分配好,需要根据实际情况来决定策略或者混合使用;欢迎大家随时来讨论相互学习,也希望多多关注和点赞,先谢谢大家了。

  • 21
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值