feat: complete assembly mesh relay control path

- synchronize STM8 application and external flash layout updates\n- add assembly bootloader and assembly application test projects\n- add UART1 interrupt receive ring buffer\n- parse JDY-28M Mesh outer frames and source addresses\n- add CRC-16/MODBUS validation\n- implement relay control command 0x01 and response 0x81\n- support unicast and broadcast relay control frames\n- update host protocol, OTA documents, and serial tools
This commit is contained in:
十七
2026-11-05 16:12:51 +08:00
parent df1aad3d16
commit ebef6a8694
40 changed files with 2133 additions and 307 deletions
+67 -13
View File
@@ -36,12 +36,13 @@ DST_L = 0C
### 1.2 接收端串口收到的 Mesh 数据格式
```text
F1 DD 09 00 0A | SRC_H SRC_L | BUSINESS | 0D 0A
F1 DD 09 | SRC_H SRC_L | DST_H DST_L | BUSINESS | 0A
```
这是接收方 UART 侧看到的接收格式,不是设备或主机发送时使用的格式。
其中两字节是 JDY-28M 接收帧中携带的地址字段;业务发送方短地址仍然放在
业务帧 `BUSINESS` 的 `SRC_H SRC_L` 字段中。
其中前两字节是发送方短地址,后两字节是接收方短地址;业务帧中不再重复
嵌入发送方或接收方地址。部分模块/串口工具可能显示为`0D 0A`,设备解析器
兼容`0A`和`0D 0A`两种接收表现。
无论发送方是主机还是设备,发送时都统一使用第1.1节的格式:
@@ -54,15 +55,16 @@ F1 DD 09 00 0A | SRC_H SRC_L | BUSINESS | 0D 0A
JDY-28M完整Mesh帧最大20字节。当前业务帧最大DATA长度为4字节:
```text
BUSINESS = SRC_H SRC_L CMD LEN DATA CRC16_H CRC16_L
BUSINESS = CMD LEN DATA CRC16_H CRC16_L
```
业务帧长度为`6 + LEN`,完整外层发送帧长度为`16 + LEN`,因此`LEN`最大为4。
业务帧长度为`4 + LEN`,完整外层发送帧长度为`14 + LEN`,按20字节限制计算,
`LEN`最大为6;当前继电器控制命令使用`LEN=1`。
## 2. 业务帧格式
```text
SRC_H SRC_L | CMD | LEN | DATA[0..LEN-1] | CRC16_H CRC16_L
CMD | LEN | DATA[0..LEN-1] | CRC16_H CRC16_L
```
### 2.1 CRC16规则
@@ -73,7 +75,7 @@ SRC_H SRC_L | CMD | LEN | DATA[0..LEN-1] | CRC16_H CRC16_L
初始值:0xFFFF
输入反射:是
输出反射:是
计算范围:SRC_H、SRC_L、CMD、LEN和DATA
计算范围:CMD、LEN和DATA
发送顺序:CRC高字节在前,低字节在后
```
@@ -88,8 +90,8 @@ CRC错误时设备直接丢弃整帧,不执行命令,也不返回错误应
```
当请求通过 Mesh 广播地址 `FFFF` 发送时,设备不会立即同时回复。设备会
根据本机短地址和系统时间生成约20~170ms、按10ms分档的随机延时,然后向业务帧中的
发送方 `SRC_H SRC_L` 单播回复,以降低多个设备同时应答造成的网络拥塞。
根据本机短地址和系统时间生成约20~170ms、按10ms分档的随机延时,然后向外层
接收帧中的发送方地址单播回复,以降低多个设备同时应答造成的网络拥塞。
单播请求仍然直接回复。
错误应答:
@@ -118,7 +120,7 @@ CMD = 07
LEN = 00
```
发送方短地址位于业务帧的 `SRC_H SRC_L` 字段中,因此该命令不需要 DATA,
发送方短地址由JDY-28M外层提供,因此该命令不需要 DATA,
其他设备收到后不回复。主机或其他设备可据此更新在线状态;如果后续长期
未收到该设备的上线或业务消息,可以结合应用层超时判断设备是否离线。
@@ -154,7 +156,7 @@ DATA[2] = 需要升级的版本高字节
DATA[3] = 需要升级的版本低字节
```
设备短地址位于响应业务帧的`SRC_H SRC_L`字段中。主机收到多个`0x90`后,
设备短地址由JDY-28M外层提供。主机收到多个`0x90`后,
生成待升级设备列表,由人工选择设备,再对选中的短地址执行后续OTA流程。
## 4. 主机下发的普通命令
@@ -173,7 +175,7 @@ DATA[0] = 01:继电器吸合
业务帧结构示例:
```text
SRC_H SRC_L 01 01 01 CRC16_H CRC16_L
01 01 01 CRC16_H CRC16_L
```
设备执行后返回:
@@ -191,6 +193,33 @@ DATA[0] = 当前继电器控制状态
注意:当前没有继电器触点反馈,设备只能确认PA1控制输出已经设置,不能确认触点机械动作是否真实成功。电流异常由故障检测功能另行上报。
以主机地址`34FA`向设备地址`35FA`发送吸合命令为例,主机串口发送:
```text
41 54 2B AA A1 35 FA A0 01 01 01 50 E0 0D 0A
```
设备接收侧看到:
```text
F1 DD 09 34 FA 35 FA 01 01 01 50 E0 0A
```
设备向主机地址`34FA`回复:
```text
41 54 2B AA A1 34 FA A0 81 01 01 B8 E1 0D 0A
```
广播吸合时,将目标地址改为`FFFF`:
```text
41 54 2B AA A1 FF FF A0 01 01 01 50 E0 0D 0A
```
设备收到广播后执行控制,并向发送方地址回复`0x81`。正式多设备版本应对广播
应答增加随机错峰延时,避免多个设备同时发送。
### 4.2 `0x02` 查询继电器状态
主机发送:
@@ -462,7 +491,7 @@ DATA[0] = 01:校验失败
当`DATA[0]=00`时,设备已经完成外部Flash固件校验并写入升级元数据。
设备会先发送`0x8B`应答,随后自动触发MCU复位,由Bootloader把OTA固件
搬运到内部Flash的`0x8800`区域。`0x8B`不代表Bootloader已经搬运完成,
搬运到内部Flash的`0x8500`区域。`0x8B`不代表Bootloader已经搬运完成,
主机必须继续等待设备重新启动后主动上报的`0x0D`。
### 7.5 `0x0C` 取消OTA
@@ -541,3 +570,28 @@ DATA[0] = 对应的升级结果码
设备收到确认后清除`0x005010`。
如果主机没有发送`0x8D`,设备不会清除结果记录,后续启动时可能再次上报,
便于主机发现升级结果确认丢失。
## 9. 整片初次烧录
整片初次烧录使用合并固件,不用于OTA:
```bash
make full
```
生成文件:
```text
build/stm8_mesh_full.hex:带绝对地址的完整HEX
build/stm8_mesh_full.bin:从0x8000开始的连续BIN
```
合并地址范围为:
```text
0x8000~0x84FF:Bootloader
0x8500~0x9FFF:主程序
```
使用ST-LINK V2/SWIM烧录时优先使用HEX文件;OTA升级仍只发送
`build/mesh_relay.bin`,不能发送合并固件。