一、概述
在
二总线、485、CAN等总线系统中,每个设备都会有个自身独立的地址,而地址的设置:有的采用设备端配置,如通过拨码开关或者通过按键交互界面,有的采用专用工具厂家内部先配置好,还有的是通过专用工具现场配置,当然还有的是自动地址分配,可参见《
二总线,替代传统485总线通讯,地址自动分配或主动上报方案-CSDN博客》;当从机体积非常小时,为了节约时间,用也可以采用在线地址分配的方式,通过一个按键触发主机按规则自动分配地址。
二、本文内容
本文利用使用《
二总线,替代传统485总线通讯,低成本直流载波方案实现及原理-CSDN博客》方案做的灯带方案来分析如何实现在线地址分配方案,以及提供整个灯带方案的通讯协议。
三、直流载波灯带方案
直流载波灯带的安装环境原因,使得整个灯带宽度只有7.5mm,需要安装在灯槽中,因此面积和提及都非常有限,若需分配地址,最佳的方案则是在线地址分配。如下图原理图所示,利用单片机NY8AE51F实现单路LED的PWM驱动。
单片机引脚功能定义如下表;XF2485直流载波芯片则使用单臂驱动方式,以节约器件数量减少PCB空间,通过单片机的PB3口作为按键触发在线地址分配。
引脚号
|
引脚名
|
引脚功能
|
2
|
PB5
|
空闲
|
3
|
PB4
|
空闲
|
4
|
PB3
|
地址上报按键(自身地址与临时地址)
|
5
|
PB2
|
LED驱动PWM口,1024级,低电平0%,高电平100%
|
6
|
PB1
|
串口发送TX,接XF2485-pin2-D
|
7
|
PB0
|
串口发送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);
}
六、总结
对于在线地址分配,除了解决设备自身尺寸问题导致的不便,也优化了施工过程初次地址分配时的工作的效率,当然在不同的使用条件下,也并没有一定就是在线地址分配好,需要根据实际情况来决定策略或者混合使用;欢迎大家随时来讨论相互学习,也希望多多关注和点赞,先谢谢大家了。