4 Commits
Author SHA1 Message Date
wangfq d4ce0ba23a chore(vd960DBN): 固件版本 1.02.03 → 1.02.04 (SPI 存储适配)
内容: SPI Flash 识别去厂商代码 + 恢复 factory 配置写入 (板级验证通过)。
README/CHANGELOG/devlog 同步; 手册/规格书配套版本更新 (文档保持 V1.02, 同日补充不升版)
2026-08-19 15:23:35 +08:00
wangfq 881a774c0c docs(vd960DBN): devlog 标注 factory 写入修复板级验证通过 (W25Q128 读写正常) 2026-08-19 15:21:40 +08:00
wangfq 8e58d5fdd1 fix(vd960DBN): 恢复 factory 配置写入 — 换新空片后配置永久丢失
8-13 止血(SPI 写触发复位)根因已 8-17 闭环(栈溢出+printf 重入, 非 SPI 问题),
offlog/snapshot 8-18 起持续 SPI 写入稳定 → 解除止血。
新空片(W25Q128)参数区无 magic + write_net_config 不写 magic → 每次上电
memory defaults, 保存配置永久丢失。恢复: mismatch 分支调 factory_dev_info()
写 magic+默认参数到 flash, 首次上电自动初始化。
2026-08-19 15:13:18 +08:00
wangfq f1d9ac4e48 fix(vd960DBN): SPI Flash 识别去厂商代码判断 — 兼容其他厂家同容量型号
- W25Qxx 宏 0XEF13~17 -> 0X13~17 (去掉厂商前缀, 只留设备 ID)
- SPI_Flash_ReadJEDEC_ID() 删除 id[0]!=0xEF||id[1]!=0x40 校验, 直接返回容量码 id[2]
  (JEDEC 容量码跨厂商标准化, offlog/snapshot 分区判断随之生效)
- storage_init() switch 改 Flash_Model & 0xFF 低字节匹配
- 换非华邦芯片 (如 0x1A 厂商) 时识别不再不一致
2026-08-19 14:45:30 +08:00
8 changed files with 131 additions and 30 deletions
+22
View File
@@ -5,6 +5,28 @@
--- ---
## vd960DBN V1.02.04 — 2026-08-19DBN 通信板单侧更新)
> 本次为 **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-19DBN 通信板单侧更新) ## vd960DBN V1.02.03 — 2026-08-19DBN 通信板单侧更新)
> 本次为 **vd960DBN 单侧发布**(Loop 固件未变,协议未变更,可正常配套)。 > 本次为 **vd960DBN 单侧发布**(Loop 固件未变,协议未变更,可正常配套)。
+2 -2
View File
@@ -1,6 +1,6 @@
# vd_960 — DLD960 四通道车辆检测器(双 MCU 架构) # vd_960 — DLD960 四通道车辆检测器(双 MCU 架构)
> 当前发布:**vd960DBN V1.02.03**2026-08-19DBN 单侧更新)· 完整版本见 [CHANGELOG.md](CHANGELOG.md) > 当前发布:**vd960DBN V1.02.04**2026-08-19DBN 单侧更新)· 完整版本见 [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/IPWCHNET)、MQTT、串口桥接、4G 扩展(RFU) | | vd960DBN | `vd960DBN/` | CH32V208 | 1.02.04 | 蓝牙管理、TCP/IPWCHNET)、MQTT、串口桥接、4G 扩展(RFU) |
> ⚠ 发布约束:自协议 V1.05 起(variation 2B无符号 → 3B有符号),**Loop 固件与 DBN 固件必须同版本配套发布**,禁止混刷。 > ⚠ 发布约束:自协议 V1.05 起(variation 2B无符号 → 3B有符号),**Loop 固件与 DBN 固件必须同版本配套发布**,禁止混刷。
+4 -3
View File
@@ -1,7 +1,7 @@
# DLD960 四通道车辆检测器 产品手册 # DLD960 四通道车辆检测器 产品手册
> Product Manual · 产品型号:**DLD960GA** > Product Manual · 产品型号:**DLD960GA**
> 文档版本 V1.02 · 2026-08-19 · 适用固件:整机 V1.02.03Loop 1.0 + DBN 1.02.03 > 文档版本 V1.02 · 2026-08-19 · 适用固件:整机 V1.02.04Loop 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.03BLE 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 |
+6 -6
View File
@@ -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.03UART2 RX 0x9F OTA 透传机制说明(§2/§5/§7)、协议矩阵与版本配套矩阵更新、已知约束补充 OTA 无自动退出 | wangfq | | V1.02 | 2026-08-19 | 配套整机发布 V1.02.03→V1.02.04UART2 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;
+73
View File
@@ -4,6 +4,76 @@
> >
> 项目定位: DLD960 通信板 — BLE 配网、TCP JSON 协议服务、Loop MCU 串口桥接 > 项目定位: DLD960 通信板 — BLE 配网、TCP JSON 协议服务、Loop MCU 串口桥接
## 2026-08-19 — 固件版本 V1.02.04SPI 存储适配两项修复)
### 内容
| 项 | 说明 |
|------|------|
| 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**magicPRODUCT_MODEL 字符串)不匹配 → 每次上电走内存默认
3. **`write_net_config`/`set_ble_safe_pass` 保存配置只改字段不写 magic** → 即使保存过,下次上电 magic 仍 0xFF → 配置"永久丢失"
### 变更(cfig_flash.cUTF-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.cGBK+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 对齐), 工具禁用未实现按钮 |