背景
- RS485一主多从网络中
- 主机已经确定
- 从机不具备(不方便)设置从机地址
解决办法
- 主机发放从机地址,从机竞争方式抢占地址编号
- 利用MCU的唯一编号进行随机延时回复进行对地址编号的抢占注册
- 按照STM32的UID含义,进行分为4步的抢占注册 + 1次地址确认。
- 使用UID作为种子生产对应的延时基数(8/16/32 Bit数据)
- 抢占发送前检测到局域网内有数据发送则需要本次地址的竞争
- 根据波特率进行计算延时最小延时单位
- 例115200波特率,1Bit = 8.68uS ,1字节约为86uS,设置最小延时单位要远大于该值
- 根据延时基数和最小延时单位计算出协议超时时间
非完整测试:需要自证是否合理
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作为种子进行随机延时回复
从机延时时间计算
#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+