RS485总线 从机设备地址自动注册(随机延时回复)

该文描述了一种在RS485主从网络中,当从机无法手动设置地址时,利用STM32的唯一ID进行随机延时回复,通过四步抢占注册和CRC8校验来自动获取地址的方法。主机通过发送地址注册请求,从机根据其UID生成的CRC8值计算延时后回复,以此竞争并确认地址。在115200波特率下,最小延时单位大于86uS。文中提供了测试日志,显示了主机尝试注册从机地址的过程及结果。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

背景

  • RS485一主多从网络中
  • 主机已经确定
  • 从机不具备(不方便)设置从机地址

解决办法

  • 主机发放从机地址,从机竞争方式抢占地址编号
  • 利用MCU的唯一编号进行随机延时回复进行对地址编号的抢占注册
    • 按照STM32的UID含义,进行分为4步的抢占注册 + 1次地址确认。
    • 使用UID作为种子生产对应的延时基数(8/16/32 Bit数据)
    • 抢占发送前检测到局域网内有数据发送则需要本次地址的竞争
  • 根据波特率进行计算延时最小延时单位
    • 例115200波特率,1Bit = 8.68uS ,1字节约为86uS,设置最小延时单位要远大于该值
    • 根据延时基数和最小延时单位计算出协议超时时间

非完整测试:需要自证是否合理

STM32唯一ID含义

STM32唯一ID含义

    /* 自动注册读取时长度必须为2 */  
    /* 此处为Modbus,寄存器数据长度为2字节,长度2时4字节,刚好可以回传从机的4步抢占注册时间*/
    MODS_R_REG_ADDR_REG = 0x4010,   //自动注册地址响应      4010
    MODS_R_REG_ADDR_REG1,           //自动注册地址第1次抢占 4011 
    MODS_R_REG_ADDR_REG2,           //自动注册地址第2次抢占 4012
    MODS_R_REG_ADDR_REG3,           //自动注册地址第3次抢占 4013
    MODS_R_REG_ADDR_REG4,           //自动注册地址第4次抢占 4014
  • 获取UID
    • 生产批号
    • 晶圆编号
    • 晶圆X位置编号
    • 晶圆Y位置编号
  • 将UID作为种子进行随机延时回复
    • 采用CRC8限制数据为1字节

从机延时时间计算

#define UNIQUE_ID_ADDR      0X1FFFF7AC  
#define FLASH_ADDR          0x1FFFF7CC

uint8_t gCRC8_LotNumber = 0;
uint8_t gCRC8_WaferNumber = 0;
uint8_t gCRC8_WaferX = 0;
uint8_t gCRC8_WaferY = 0;

void Get_ChipInfoCRC8(void)
{
    uint8_t WaferX[2] = {0};
    uint8_t WaferY[2] = {0};
    uint8_t WaferNumber = 0;
    uint8_t LotNumber[7] = {0};

    /* 获取UID各个字段 */
    /* 高位在前 */
    WaferX[1] = *(__IO uint8_t *)(UNIQUE_ID_ADDR);
    WaferX[0] = *(__IO uint8_t *)(UNIQUE_ID_ADDR+1);    
    WaferY[1] = *(__IO uint8_t *)(UNIQUE_ID_ADDR+2);
    WaferY[0] = *(__IO uint8_t *)(UNIQUE_ID_ADDR+3);
    WaferNumber  = *(__IO uint8_t *)(UNIQUE_ID_ADDR+4);
    LotNumber[6] = *(__IO uint8_t *)(UNIQUE_ID_ADDR+5);
    LotNumber[5] = *(__IO uint8_t *)(UNIQUE_ID_ADDR+6);
    LotNumber[4] = *(__IO uint8_t *)(UNIQUE_ID_ADDR+7);
    LotNumber[3] = *(__IO uint8_t *)(UNIQUE_ID_ADDR+8);
    LotNumber[2] = *(__IO uint8_t *)(UNIQUE_ID_ADDR+9);
    LotNumber[1] = *(__IO uint8_t *)(UNIQUE_ID_ADDR+
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值