Compare commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
d4ce0ba23a | ||
|
|
881a774c0c | ||
|
|
8e58d5fdd1 | ||
|
|
f1d9ac4e48 |
@@ -5,6 +5,28 @@
|
|||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
|
## vd960DBN V1.02.04 — 2026-08-19(DBN 通信板单侧更新)
|
||||||
|
|
||||||
|
> 本次为 **vd960DBN 单侧发布**(Loop 固件未变,协议未变更,可正常配套)。
|
||||||
|
|
||||||
|
**配套版本矩阵**
|
||||||
|
|
||||||
|
| 组件 | 版本 |
|
||||||
|
|------|------|
|
||||||
|
| vd960DBN 固件 (CH32V208, DLD960GA) | **1.02.04** |
|
||||||
|
| vd960Loop 固件 (AT32F421) | 1.0(不变) |
|
||||||
|
| DLD960Loop 串口协议(0x7F / 0x9F OTA) | V1.05(不变) |
|
||||||
|
| DLD960 TCP JSON 协议(:5960) | V1.03(不变) |
|
||||||
|
| DLD960 IoT MQTT 协议 | V1.07(不变) |
|
||||||
|
| DLD960 BLE 协议 | V1.02(不变) |
|
||||||
|
|
||||||
|
### 🔧 SPI Flash 存储适配修复
|
||||||
|
- **识别去厂商代码**:`W25Qxx` 宏去 `0XEF` 前缀、`SPI_Flash_ReadJEDEC_ID()` 删厂商校验、`storage_init` 低字节匹配——兼容其他厂家同容量型号(如 0x1A 厂商)
|
||||||
|
- **恢复 factory 配置写入**:解除 2026-08-13 止血(根因 8-17 已闭环),换新空片(W25Q128)后不再每次上电进出厂初始化,配置读写恢复正常
|
||||||
|
- **板级验证通过**(2026-08-19):W25Q128 配置读写正常
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
## vd960DBN V1.02.03 — 2026-08-19(DBN 通信板单侧更新)
|
## vd960DBN V1.02.03 — 2026-08-19(DBN 通信板单侧更新)
|
||||||
|
|
||||||
> 本次为 **vd960DBN 单侧发布**(Loop 固件未变,协议未变更,可正常配套)。
|
> 本次为 **vd960DBN 单侧发布**(Loop 固件未变,协议未变更,可正常配套)。
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
# vd_960 — DLD960 四通道车辆检测器(双 MCU 架构)
|
# vd_960 — DLD960 四通道车辆检测器(双 MCU 架构)
|
||||||
|
|
||||||
> 当前发布:**vd960DBN V1.02.03**(2026-08-19,DBN 单侧更新)· 完整版本见 [CHANGELOG.md](CHANGELOG.md)
|
> 当前发布:**vd960DBN V1.02.04**(2026-08-19,DBN 单侧更新)· 完整版本见 [CHANGELOG.md](CHANGELOG.md)
|
||||||
|
|
||||||
## 产品概述
|
## 产品概述
|
||||||
|
|
||||||
@@ -41,7 +41,7 @@ DLD960 是一款基于环形线圈检测原理的四通道车辆检测器,支
|
|||||||
| 子项目 | 目录 | MCU | 固件版本 | 功能 |
|
| 子项目 | 目录 | MCU | 固件版本 | 功能 |
|
||||||
|--------|------|-----|---------|------|
|
|--------|------|-----|---------|------|
|
||||||
| vd960Loop | `vd960Loop/` | AT32F421 | 1.0 | 线圈驱动、频率采样、车辆检测算法、0x7F 串口上报 |
|
| vd960Loop | `vd960Loop/` | AT32F421 | 1.0 | 线圈驱动、频率采样、车辆检测算法、0x7F 串口上报 |
|
||||||
| vd960DBN | `vd960DBN/` | CH32V208 | 1.02.03 | 蓝牙管理、TCP/IP(WCHNET)、MQTT、串口桥接、4G 扩展(RFU) |
|
| vd960DBN | `vd960DBN/` | CH32V208 | 1.02.04 | 蓝牙管理、TCP/IP(WCHNET)、MQTT、串口桥接、4G 扩展(RFU) |
|
||||||
|
|
||||||
> ⚠ 发布约束:自协议 V1.05 起(variation 2B无符号 → 3B有符号),**Loop 固件与 DBN 固件必须同版本配套发布**,禁止混刷。
|
> ⚠ 发布约束:自协议 V1.05 起(variation 2B无符号 → 3B有符号),**Loop 固件与 DBN 固件必须同版本配套发布**,禁止混刷。
|
||||||
|
|
||||||
|
|||||||
+4
-3
@@ -1,7 +1,7 @@
|
|||||||
# DLD960 四通道车辆检测器 产品手册
|
# DLD960 四通道车辆检测器 产品手册
|
||||||
|
|
||||||
> Product Manual · 产品型号:**DLD960GA**
|
> Product Manual · 产品型号:**DLD960GA**
|
||||||
> 文档版本 V1.02 · 2026-08-19 · 适用固件:整机 V1.02.03(Loop 1.0 + DBN 1.02.03)
|
> 文档版本 V1.02 · 2026-08-19 · 适用固件:整机 V1.02.04(Loop 1.0 + DBN 1.02.04)
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
@@ -132,7 +132,7 @@ DLD960 是一款四通道环形线圈车辆检测器,一台设备即可覆盖
|
|||||||
| 通信 MCU | 蓝牙 OTA | 小程序选择固件直接升级 |
|
| 通信 MCU | 蓝牙 OTA | 小程序选择固件直接升级 |
|
||||||
| 检测 MCU | ISP 透传 | 小程序经蓝牙→通信 MCU 串口透传升级 |
|
| 检测 MCU | ISP 透传 | 小程序经蓝牙→通信 MCU 串口透传升级 |
|
||||||
|
|
||||||
> ⚠ **双 MCU 固件必须使用同一发布包配套升级**(V1.0.0 起为强制要求),只升级一侧会导致内部通信数据错位。当前配套:Loop 1.0 + DBN 1.02.03。
|
> ⚠ **双 MCU 固件必须使用同一发布包配套升级**(V1.0.0 起为强制要求),只升级一侧会导致内部通信数据错位。当前配套:Loop 1.0 + DBN 1.02.04。
|
||||||
>
|
>
|
||||||
> ⚠ **检测 MCU 升级完成后,若小程序无响应,请将设备断电重启**(DBN OTA 透传模式需重启恢复,V1.02.03 已知约束)。
|
> ⚠ **检测 MCU 升级完成后,若小程序无响应,请将设备断电重启**(DBN OTA 透传模式需重启恢复,V1.02.03 已知约束)。
|
||||||
|
|
||||||
@@ -148,6 +148,7 @@ DLD960 是一款四通道环形线圈车辆检测器,一台设备即可覆盖
|
|||||||
| 继电器输出正常但平台无数据 | 网络配置错误;MQTT Topic/序列码不符 | 查 IP/Broker 配置;核对 dev_serial 与 Topic |
|
| 继电器输出正常但平台无数据 | 网络配置错误;MQTT Topic/序列码不符 | 查 IP/Broker 配置;核对 dev_serial 与 Topic |
|
||||||
| 设备频繁自动重启 / 偶发数据丢失 | 通信 MCU 旧固件资源不足(V1.02.01 已修复) | 升级整机固件至 V1.02.01 及以上版本 |
|
| 设备频繁自动重启 / 偶发数据丢失 | 通信 MCU 旧固件资源不足(V1.02.01 已修复) | 升级整机固件至 V1.02.01 及以上版本 |
|
||||||
| BLE OTA 升级失败/进度卡住 | 通信 MCU 旧固件 0x9F 透传缺陷(V1.02.03 已修复) | 升级整机固件至 V1.02.03 及以上版本 |
|
| BLE OTA 升级失败/进度卡住 | 通信 MCU 旧固件 0x9F 透传缺陷(V1.02.03 已修复) | 升级整机固件至 V1.02.03 及以上版本 |
|
||||||
|
| 配置无法保存/每次上电恢复出厂 | 旧固件 factory 写入被禁用;换新存储芯片后参数区无出厂配置(V1.02.04 已修复) | 升级整机固件至 V1.02.04 及以上版本 |
|
||||||
| 事件重复上报 | 平台未按协议应答 event_report | 平台须回显 msg_id 应答(先落库后应答) |
|
| 事件重复上报 | 平台未按协议应答 event_report | 平台须回显 msg_id 应答(先落库后应答) |
|
||||||
| 线圈断开告警 | 线圈开路/引线断裂 | 万用表量线圈回路电阻(正常几欧姆以内) |
|
| 线圈断开告警 | 线圈开路/引线断裂 | 万用表量线圈回路电阻(正常几欧姆以内) |
|
||||||
|
|
||||||
@@ -177,6 +178,6 @@ DLD960 是一款四通道环形线圈车辆检测器,一台设备即可覆盖
|
|||||||
|
|
||||||
| 版本 | 修订时间 | 修订说明 | 修订人 |
|
| 版本 | 修订时间 | 修订说明 | 修订人 |
|
||||||
|------|----------|----------|--------|
|
|------|----------|----------|--------|
|
||||||
| V1.02 | 2026-08-19 | 配套整机发布 V1.02.03:BLE OTA 升级链路加固说明(检测 MCU 0x9F 响应帧透传回小程序,停等 ACK 完整);故障排查新增 OTA 失败条目;固件升级章节补断电重启提示 | wangfq |
|
| V1.02 | 2026-08-19 | 配套整机发布 V1.02.03→V1.02.04:BLE OTA 升级链路加固说明(0x9F 响应帧透传,停等 ACK 完整);故障排查新增 OTA 失败 + 配置无法保存条目;固件升级补断电重启提示;存储兼容适配(去厂商代码 + 恢复 factory 写入) | wangfq |
|
||||||
| V1.01 | 2026-08-18 | 配套整机发布 V1.02.01:通信稳定性修复说明(UART2 DMA 防丢帧、异常重启修复);新增 BLE 脱机日志/传感快照读写说明(§5.1) | wangfq |
|
| V1.01 | 2026-08-18 | 配套整机发布 V1.02.01:通信稳定性修复说明(UART2 DMA 防丢帧、异常重启修复);新增 BLE 脱机日志/传感快照读写说明(§5.1) | wangfq |
|
||||||
| V1.00 | 2026-07-16 | 初始版本,配套整机发布 V1.0.0 | wangfq |
|
| V1.00 | 2026-07-16 | 初始版本,配套整机发布 V1.0.0 | wangfq |
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
# DLD960 四通道车辆检测器 技术规格书
|
# DLD960 四通道车辆检测器 技术规格书
|
||||||
|
|
||||||
> Technical Specification · 产品型号:**DLD960GA**
|
> Technical Specification · 产品型号:**DLD960GA**
|
||||||
> 文档版本 V1.02 · 2026-08-19 · 配套整机发布 V1.02.03
|
> 文档版本 V1.02 · 2026-08-19 · 配套整机发布 V1.02.04
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
@@ -100,7 +100,7 @@ DLD960 是一款基于环形线圈(LC 振荡)检测原理的四通道车辆
|
|||||||
| 外部存储 | SPI NOR Flash | 参数存储 + 日志存储 |
|
| 外部存储 | SPI NOR Flash | 参数存储 + 日志存储 |
|
||||||
| 按键 | K1 多功能按键 | 复位等 |
|
| 按键 | K1 多功能按键 | 复位等 |
|
||||||
|
|
||||||
### 5.1 协议矩阵(V1.02.03 配套)
|
### 5.1 协议矩阵(V1.02.04 配套)
|
||||||
|
|
||||||
| 协议 | 版本 | 通道 | 要点 |
|
| 协议 | 版本 | 通道 | 要点 |
|
||||||
|------|------|------|------|
|
|------|------|------|------|
|
||||||
@@ -166,14 +166,14 @@ DLD960 是一款基于环形线圈(LC 振荡)检测原理的四通道车辆
|
|||||||
|
|
||||||
> ⚠ **自内部协议 V1.05 起,vd960Loop 与 vd960DBN 固件必须同版本配套刷写**(variation 字段 2B→3B 帧格式变更,混刷导致数据静默错位)。
|
> ⚠ **自内部协议 V1.05 起,vd960Loop 与 vd960DBN 固件必须同版本配套刷写**(variation 字段 2B→3B 帧格式变更,混刷导致数据静默错位)。
|
||||||
|
|
||||||
| 组件 | V1.02.03 配套版本 |
|
| 组件 | V1.02.04 配套版本 |
|
||||||
|------|-------------------|
|
|------|-------------------|
|
||||||
| vd960Loop 固件 | 1.0(不变) |
|
| vd960Loop 固件 | 1.0(不变) |
|
||||||
| vd960DBN 固件 | 1.02.03 |
|
| vd960DBN 固件 | 1.02.04 |
|
||||||
|
|
||||||
### 10.1 已知约束(V1.02.01)
|
### 10.1 已知约束(V1.02.01)
|
||||||
|
|
||||||
- 固件版本三段式:`FIRMWARE_VER="1.02.03"`(MAIN=1 / SUB=2 / SUBSUB=3);BLE 上报仅 MAIN/SUB 两字节(1.02),SUBSUB 只体现在字符串上报(MQTT/TCP JSON)。
|
- 固件版本三段式:`FIRMWARE_VER="1.02.04"`(MAIN=1 / SUB=2 / SUBSUB=4);BLE 上报仅 MAIN/SUB 两字节(1.02),SUBSUB 只体现在字符串上报(MQTT/TCP JSON)。
|
||||||
- 设备无 RTC,时钟同步依赖平台下发(校准前 ts 为上电秒数)。
|
- 设备无 RTC,时钟同步依赖平台下发(校准前 ts 为上电秒数)。
|
||||||
- CH32V208 RAM 预算:BLE 协议栈固定占用低 16KB(不可裁剪),用户可用 48KB;固件经 RAM 瘦身优化,栈余量约 6KB,现场升级务必使用 V1.02.01 及以上版本。
|
- CH32V208 RAM 预算:BLE 协议栈固定占用低 16KB(不可裁剪),用户可用 48KB;固件经 RAM 瘦身优化,栈余量约 6KB,现场升级务必使用 V1.02.01 及以上版本。
|
||||||
- 传感快照区延后 3s 初始化(开机 3s 内传感数据不落盘,设计接受)。
|
- 传感快照区延后 3s 初始化(开机 3s 内传感数据不落盘,设计接受)。
|
||||||
@@ -186,6 +186,6 @@ DLD960 是一款基于环形线圈(LC 振荡)检测原理的四通道车辆
|
|||||||
|
|
||||||
| 版本 | 修订时间 | 修订说明 | 修订人 |
|
| 版本 | 修订时间 | 修订说明 | 修订人 |
|
||||||
|------|----------|----------|--------|
|
|------|----------|----------|--------|
|
||||||
| V1.02 | 2026-08-19 | 配套整机发布 V1.02.03:UART2 RX 0x9F OTA 透传机制说明(§2/§5/§7)、协议矩阵与版本配套矩阵更新、已知约束补充 OTA 无自动退出 | wangfq |
|
| V1.02 | 2026-08-19 | 配套整机发布 V1.02.03→V1.02.04:UART2 RX 0x9F OTA 透传机制说明(§2/§5/§7)、协议矩阵与版本配套矩阵更新、已知约束补充 OTA 无自动退出;存储适配(SPI 识别去厂商代码 + factory 写入恢复) | wangfq |
|
||||||
| V1.01 | 2026-08-18 | 配套整机发布 V1.02.01:版本矩阵更新、UART2 RX DMA 通信可靠性说明、已知约束补充 | wangfq |
|
| V1.01 | 2026-08-18 | 配套整机发布 V1.02.01:版本矩阵更新、UART2 RX DMA 通信可靠性说明、已知约束补充 | wangfq |
|
||||||
| V1.00 | 2026-07-16 | 初始版本,配套整机发布 V1.0.0 | wangfq |
|
| V1.00 | 2026-07-16 | 初始版本,配套整机发布 V1.0.0 | wangfq |
|
||||||
|
|||||||
@@ -241,12 +241,15 @@ void load_cfg_from_flash(void)
|
|||||||
if(strncmp(mBuff, DEV_USER_FLASH_MAGIC, sizeof(DEV_USER_FLASH_MAGIC)) != 0)
|
if(strncmp(mBuff, DEV_USER_FLASH_MAGIC, sizeof(DEV_USER_FLASH_MAGIC)) != 0)
|
||||||
{
|
{
|
||||||
free(mBuff);
|
free(mBuff);
|
||||||
/* ===== 止血 (2026-08-13): factory SPI 写触发硬件复位死循环 =====
|
/* ===== 恢复 factory 写入 (2026-08-19) =====
|
||||||
现场: SPI_Flash_Write(参数区 0x00, 512B) → RST=0x00000000 硬件复位
|
8-13 止血背景: factory SPI 写触发硬件复位死循环 — 根因已在 8-17 闭环
|
||||||
→ magic 写不进 → 无限复位循环。SPI 写触发硬件复位实锤(与快照区无关)。
|
(.bss 挤占 RAM → 栈溢出 + printf 重入, 非 SPI 硬件问题);
|
||||||
临时方案: 不写 Flash, 用内存默认配置继续 (恢复原逻辑删本块即可) */
|
offlog/snapshot 自 8-18 起持续 SPI 写入稳定。
|
||||||
/* 2026-08-17 栈溢出修复后恢复 (栈~4.75KB) */
|
换新空片 (W25Q128) 参数区无 magic → 每次上电 memory defaults,
|
||||||
PRINT("CFG: magic mismatch - MEMORY DEFAULTS (factory SPI write disabled)\n");
|
且 write_net_config 保存配置不写 magic → 配置永久丢失。
|
||||||
|
恢复: 首次 mismatch 写出厂默认 (magic+参数) 到 flash, 后续上电正常加载。 */
|
||||||
|
factory_dev_info();
|
||||||
|
PRINT("CFG: magic mismatch - factory defaults written\n");
|
||||||
memset(g_dev_number, 0, 6);
|
memset(g_dev_number, 0, 6);
|
||||||
memcpy(g_dev_number, gMacAddr, 6);
|
memcpy(g_dev_number, gMacAddr, 6);
|
||||||
sprintf(g_dev_number_str, "%02X%02X%02X%02X%02X%02X",
|
sprintf(g_dev_number_str, "%02X%02X%02X%02X%02X%02X",
|
||||||
@@ -290,8 +293,7 @@ void load_cfg_from_flash(void)
|
|||||||
g_sub_code_enable.dgdus_enable = 0;
|
g_sub_code_enable.dgdus_enable = 0;
|
||||||
g_sub_code_enable.wbdus_enable = 0;
|
g_sub_code_enable.wbdus_enable = 0;
|
||||||
g_sub_code_enable.radar_enable = 0;
|
g_sub_code_enable.radar_enable = 0;
|
||||||
/* 2026-08-17 栈溢出修复后恢复 */
|
PRINT("CFG: memory defaults OK (factory written)\n");
|
||||||
PRINT("CFG: memory defaults OK (no factory write)\n");
|
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -11,11 +11,11 @@
|
|||||||
#include <stdint.h>
|
#include <stdint.h>
|
||||||
|
|
||||||
#define PRODUCT_MODEL "DLD960GA"
|
#define PRODUCT_MODEL "DLD960GA"
|
||||||
#define FIRMWARE_VER "1.02.03"
|
#define FIRMWARE_VER "1.02.04"
|
||||||
#define HARDWARE_VER "1.0"
|
#define HARDWARE_VER "1.0"
|
||||||
#define FIRMWARE_VER_MAIN 1
|
#define FIRMWARE_VER_MAIN 1
|
||||||
#define FIRMWARE_VER_SUB 2
|
#define FIRMWARE_VER_SUB 2
|
||||||
#define FIRMWARE_VER_SUBSUB 3
|
#define FIRMWARE_VER_SUBSUB 4
|
||||||
#define HARDWARE_VER_MAIN 1
|
#define HARDWARE_VER_MAIN 1
|
||||||
#define HARDWARE_VER_SUB 1
|
#define HARDWARE_VER_SUB 1
|
||||||
|
|
||||||
|
|||||||
@@ -19,11 +19,11 @@
|
|||||||
|
|
||||||
|
|
||||||
/* Winbond SPIFalsh ID */
|
/* Winbond SPIFalsh ID */
|
||||||
#define W25Q80 0XEF13
|
#define W25Q80 0X13 // device ID only, no vendor code
|
||||||
#define W25Q16 0XEF14
|
#define W25Q16 0X14
|
||||||
#define W25Q32 0XEF15
|
#define W25Q32 0X15
|
||||||
#define W25Q64 0XEF16 //64Mbit, 8MByte
|
#define W25Q64 0X16 //64Mbit, 8MByte
|
||||||
#define W25Q128 0XEF17
|
#define W25Q128 0X17
|
||||||
|
|
||||||
/* Winbond SPIFalsh Instruction List */
|
/* Winbond SPIFalsh Instruction List */
|
||||||
#define W25X_WriteEnable 0x06
|
#define W25X_WriteEnable 0x06
|
||||||
@@ -228,8 +228,10 @@ u16 SPI_Flash_ReadID(void)
|
|||||||
/*********************************************************************
|
/*********************************************************************
|
||||||
* @fn SPI_Flash_ReadJEDEC_ID
|
* @fn SPI_Flash_ReadJEDEC_ID
|
||||||
*
|
*
|
||||||
* @brief Read JEDEC ID (0x9F). Return 3rd byte (device id).
|
* @brief Read JEDEC ID (0x9F). Return 3rd byte (capacity code).
|
||||||
* W25Q32=0x16 Q64=0x17 Q128=0x18 Q256=0x19; 0 if not Winbond.
|
* W25Q32=0x16 Q64=0x17 Q128=0x18 Q256=0x19.
|
||||||
|
* 2026-08-19: no vendor code check (id[0]/id[1]) - compatible
|
||||||
|
* with other vendors same-capacity parts.
|
||||||
*
|
*
|
||||||
* @return device id byte
|
* @return device id byte
|
||||||
*/
|
*/
|
||||||
@@ -244,7 +246,8 @@ uint8_t SPI_Flash_ReadJEDEC_ID(void)
|
|||||||
id[2] = SPI1_ReadWriteByte(0xFF);
|
id[2] = SPI1_ReadWriteByte(0xFF);
|
||||||
GPIO_WriteBit(GPIOA, GPIO_Pin_4, 1);
|
GPIO_WriteBit(GPIOA, GPIO_Pin_4, 1);
|
||||||
|
|
||||||
if (id[0] != 0xEF || id[1] != 0x40) return 0;
|
/* 2026-08-19: no vendor code check - JEDEC capacity code (id[2])
|
||||||
|
is standardized across vendors (e.g. 0x16=32Mbit for ISSI/GD too) */
|
||||||
return id[2];
|
return id[2];
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -505,7 +508,7 @@ void storage_init(void)
|
|||||||
SPI_Flash_Init();
|
SPI_Flash_Init();
|
||||||
|
|
||||||
uint16_t Flash_Model = SPI_Flash_ReadID();
|
uint16_t Flash_Model = SPI_Flash_ReadID();
|
||||||
switch(Flash_Model)
|
switch(Flash_Model & 0xFF) /* device ID low byte only, no vendor check */
|
||||||
{
|
{
|
||||||
case W25Q80: PRINT("W25Q80 OK!\r\n"); break;
|
case W25Q80: PRINT("W25Q80 OK!\r\n"); break;
|
||||||
case W25Q16: PRINT("W25Q16 OK!\r\n"); break;
|
case W25Q16: PRINT("W25Q16 OK!\r\n"); break;
|
||||||
|
|||||||
@@ -4,6 +4,76 @@
|
|||||||
>
|
>
|
||||||
> 项目定位: DLD960 通信板 — BLE 配网、TCP JSON 协议服务、Loop MCU 串口桥接
|
> 项目定位: DLD960 通信板 — BLE 配网、TCP JSON 协议服务、Loop MCU 串口桥接
|
||||||
|
|
||||||
|
## 2026-08-19 — 固件版本 V1.02.04(SPI 存储适配两项修复)
|
||||||
|
|
||||||
|
### 内容
|
||||||
|
|
||||||
|
| 项 | 说明 |
|
||||||
|
|------|------|
|
||||||
|
| SPI Flash 识别去厂商代码 | `W25Qxx` 宏去 `0XEF` 前缀、`SPI_Flash_ReadJEDEC_ID()` 删厂商校验、`storage_init` 低字节匹配(f1d9ac4) |
|
||||||
|
| 恢复 factory 配置写入 | 解除 8-13 止血,空片首启写 magic+默认参数,配置读写恢复正常(8e58d5f + 881a774) |
|
||||||
|
| 版本号 | `cmcng.h` 三段式一致:FIRMWARE_VER="1.02.04" + MAIN=1/SUB=2/SUBSUB=4 |
|
||||||
|
|
||||||
|
**板级验证**:W25Q128 配置读写正常(用户 2026-08-19 确认)。
|
||||||
|
|
||||||
|
文档同步:README 当前发布/版本表、CHANGELOG V1.02.04 条目、产品手册/技术规格书配套版本(文档保持 V1.02,同日内补充不升版)。
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 2026-08-19 — 恢复 factory 配置写入(换新空片后"老是进入出厂初始化配置")
|
||||||
|
|
||||||
|
### 背景
|
||||||
|
|
||||||
|
换 W25Q128 新片后每次上电日志 `CFG: magic mismatch - MEMORY DEFAULTS (factory SPI write disabled)`,用户保存的配置不生效。
|
||||||
|
|
||||||
|
### 根因
|
||||||
|
|
||||||
|
1. **8-13 止血禁用了 factory 写入**(当时 SPI 写触发硬件复位死循环,临时方案:不写 Flash 用内存默认)——但该根因已在 8-17 闭环(.bss 挤占 RAM → 栈溢出 + printf 重入,**非 SPI 硬件问题**),offlog/snapshot 自 8-18 起持续 SPI 写入稳定,止血早该解除
|
||||||
|
2. **新空片(W25Q128)参数区全 0xFF**,magic(PRODUCT_MODEL 字符串)不匹配 → 每次上电走内存默认
|
||||||
|
3. **`write_net_config`/`set_ble_safe_pass` 保存配置只改字段不写 magic** → 即使保存过,下次上电 magic 仍 0xFF → 配置"永久丢失"
|
||||||
|
|
||||||
|
### 变更(cfig_flash.c,UTF-8+CRLF)
|
||||||
|
|
||||||
|
`load_cfg_from_flash()` mismatch 分支:删除"不写 Flash"止血,恢复调用 `factory_dev_info()`(写 magic + 默认参数 + 网络配置到参数区 0x00),打印改 `factory defaults written`。首次上电自动初始化参数区,后续上电正常加载 + 保存配置生效。
|
||||||
|
|
||||||
|
### 验证
|
||||||
|
|
||||||
|
- `check_c_balance.py` OK;`gcc -fsyntax-only` 无新错误(仅原有 unused warning)
|
||||||
|
- SPI 读写实现对 W25Q128 兼容确认:4KB 扇区擦除 + 256B 页编程分页(storage.c 标准实现),指令集与 W25Q32 相同
|
||||||
|
|
||||||
|
### 板级验证(用户 2026-08-19 确认)
|
||||||
|
|
||||||
|
- ✅ **读写正常**:新片(W25Q128)配置读写恢复正常,不再每次上电进出厂初始化
|
||||||
|
- 新芯片规格书无需再核对(华邦 W25Q128,与 W25Q32 指令/结构兼容)
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 2026-08-19 — SPI Flash 识别去掉厂商代码判断(兼容多厂家同容量型号)
|
||||||
|
|
||||||
|
### 背景
|
||||||
|
|
||||||
|
`SPI_Flash_ReadID()`(0x90 指令)返回 `0xEF15`(华邦:厂商 0xEF + 设备 ID 0x15),`SPI_Flash_ReadJEDEC_ID()`(0x9F 指令)返回 3 字节(0xEF 0x40 0x16)。原代码在 JEDEC 读取处硬编码校验 `id[0]==0xEF && id[1]==0x40`,且 `W25Qxx` 宏含 `0XEF` 厂商前缀——换其他厂家同容量型号(如 0x1A 开头)时识别不一致。
|
||||||
|
|
||||||
|
### 变更(storage.c,GBK+CRLF 保持原编码)
|
||||||
|
|
||||||
|
| 位置 | 改动 |
|
||||||
|
|------|------|
|
||||||
|
| `W25Q80~W25Q128` 宏 | `0XEF13~0XEF17` → `0X13~0X17`(去掉厂商前缀,只留设备 ID) |
|
||||||
|
| `SPI_Flash_ReadJEDEC_ID()` | 删除 `if (id[0] != 0xEF \|\| id[1] != 0x40) return 0;`,直接 `return id[2];`(JEDEC 容量码跨厂商标准化:0x16=32Mbit 等) |
|
||||||
|
| `storage_init()` | `switch(Flash_Model)` → `switch(Flash_Model & 0xFF)`(只匹配设备 ID 低字节) |
|
||||||
|
|
||||||
|
### 验证
|
||||||
|
|
||||||
|
- `check_c_balance.py` OK;`gcc -fsyntax-only` 无新错误(仅原有 unused warning)
|
||||||
|
- 逻辑说明:真正决定分区容量的是 offlog/snapshot 用 `SPI_Flash_ReadJEDEC_ID()` 容量码(0x16/0x17/0x18/0x19)匹配 `OFFLOG_CHIP_*`——这部分本来就不含厂商判断,随本次一并生效
|
||||||
|
|
||||||
|
### 遗留
|
||||||
|
|
||||||
|
- `/* Winbond SPIFalsh ID */` 历史注释未改(宏已不限于 Winbond,后续可顺手更新)
|
||||||
|
- 待板级:换非华邦同容量芯片实测识别
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
## 2026-08-19 — UART2 RX DMA 下 BLE→Loop OTA 失效修复:0x9F 帧透传回 BLE
|
## 2026-08-19 — UART2 RX DMA 下 BLE→Loop OTA 失效修复:0x9F 帧透传回 BLE
|
||||||
|
|
||||||
### 背景
|
### 背景
|
||||||
@@ -1416,6 +1486,9 @@ TCP 超时要等 ~2 分钟才触发 `SINT_STAT_TIM_OUT`,
|
|||||||
|
|
||||||
| 版本 | 时间 | 说明 |
|
| 版本 | 时间 | 说明 |
|
||||||
|------|------|------|
|
|------|------|------|
|
||||||
|
| V4.7 | 2026-08-19 | 固件版本 1.02.03→1.02.04 (SPI 存储适配: 去厂商识别 + 恢复 factory 写入, 板级验证通过) |
|
||||||
|
| V4.6 | 2026-08-19 | 恢复 factory 配置写入: 解除 8-13 止血, 空片首启写 magic+默认参数 (换 W25Q128 后配置永久丢失修复) |
|
||||||
|
| V4.5 | 2026-08-19 | SPI Flash 识别去厂商代码: W25Qxx 宏去 0XEF 前缀, ReadJEDEC_ID 删厂商校验, storage_init 低字节匹配 (兼容多厂家) |
|
||||||
| V4.4 | 2026-08-19 | UART2 DMA 下 BLE→Loop OTA 修复: lup_feed_byte_ota 0x9F 帧解析+透传回 BLE (停等 ACK), DMA poll OTA 模式切换/溢出阈值/tick 归零, 单测 8 例 |
|
| V4.4 | 2026-08-19 | UART2 DMA 下 BLE→Loop OTA 修复: lup_feed_byte_ota 0x9F 帧解析+透传回 BLE (停等 ACK), DMA poll OTA 模式切换/溢出阈值/tick 归零, 单测 8 例 |
|
||||||
| V4.3 | 2026-08-18 | log_query 改 hex 原始字节上报 (协议 V1.03/V1.07 修订): offlog_evt_to_hex/snap_rec_to_hex, 2 条快照 406B<800B, 快照 count 恢复 2 |
|
| V4.3 | 2026-08-18 | log_query 改 hex 原始字节上报 (协议 V1.03/V1.07 修订): offlog_evt_to_hex/snap_rec_to_hex, 2 条快照 406B<800B, 快照 count 恢复 2 |
|
||||||
| V4.2 | 2026-08-18 | MQTT 命令集补齐: ssc_net_query/iot_net_query/iot_topic_query 只读组包 (协议 V1.02 对齐), 工具禁用未实现按钮 |
|
| V4.2 | 2026-08-18 | MQTT 命令集补齐: ssc_net_query/iot_net_query/iot_topic_query 只读组包 (协议 V1.02 对齐), 工具禁用未实现按钮 |
|
||||||
|
|||||||
Reference in New Issue
Block a user