feat: implement high-precision hardware SPI driver for FCOB-2.7 RGB LED with motor pin conflict resolution

This commit is contained in:
2026-07-08 09:27:17 +08:00
parent f1777e0459
commit 680d8ea06f
4 changed files with 106 additions and 141 deletions

View File

@@ -1,6 +1,6 @@
# STC32G 手环项目工程与功能实现 Walkthrough
本项目完成了手环核心交互逻辑与状态机的全部实现。所有代码已完全用中文进行行级注释,且在 Keil C251 下编译成功0 Errors
本项目完成了手环核心交互逻辑与状态机的所有开发,并特别针对新引入的 FCOB-2.7 规格 RGB 灯条进行了高精度的硬件驱动级重构
## 实现功能摘要
@@ -30,14 +30,24 @@
* `BINDING IPC``LIAISON IPC`
* `TRANSMITTING...``ENVOI EN COURS`
### 2. 单线制幻彩 RGB LED (XL-2020RGBC-2812B) 驱动集成
* **物理层引脚映射**:使用原 `LED_R` 所属引脚 `P0.0` 作为单线数据输入DIN引脚将其配置为高速推挽输出。在系统初始化时主动输出熄灭状态防止上电乱闪。
* **精准 Bit-bang 驱动**:根据 `XL-2020` 的 800Kbps 时序规范1T cycle ≈ 41.67ns @ 24MHz实现了毫微秒级别的 `WS2812_Write24Bit(u8 g, u8 r, u8 b)``WS2812_Reset()` 软件驱动。在发送数据流时,关闭总中断 `EA = 0`,确保脉冲宽度不被中断打断。
* **软件级虚拟 LED 兼容层**:将原有的 `LED_R`, `LED_G`, `LED_B` 重定义为全局 `bit` 软件变量。在 1ms `Timer1_Isr` 结尾捕获到虚拟 LED 的状态改变时,再自动调用 `WS2812` 驱动输出对应的 GRB 24 位电平。这使得应用层所有的 LED 闪烁及颜色逻辑无需任何改动,保证了系统的高稳定性与高扩展性
### 2. 硬件 SPI 控制 FCOB-2.7 幻彩 RGB 灯条
为了实现对 FCOB-2.7 灯条的高精度和无毛刺控制,我们将传统的软件延时 Bit-bang 方式重构为了基于**硬件 SPI** 的信号调制驱动:
* **引脚定义**
* 使用 `P_SW1 = 0x04` 将 SPI 引脚重定向到 `P2.2` (SS)、`P2.3` (MOSI)、`P2.4` (MISO)、`P2.5` (SCLK)
* `P2.3` (MOSI) 作为信号线连接到 FCOB 灯条的 DIN 端。
* **时序匹配算法**
* 根据规格书提供的精密参数T0H = 0.295μs, T0L = 0.595μs, T1H = 0.595μs, T1L = 0.295μs设置 SPI 时钟为 `SYSCLK / 8 = 3.0 MHz`,每一个 SPI 比特宽度刚好为 `333.3ns`
* 采用 **3-bit 编码**
* **0 码**`100` 二进制High: 333ns, Low: 667ns与规格书的 295ns / 595ns 极为吻合。
* **1 码**`110` 二进制High: 667ns, Low: 333ns与规格书的 595ns / 295ns 极为吻合。
* 由于 3-bit 乘以 24 位刚好是 72 比特(即 9 字节),数据可以完美对齐成一个 9 字节的缓冲区。通过预编码与快速写入,消除了传统 SPI 循环中由于 CPU 运算延迟产生的 byte-to-byte 间隔,从根本上防止了灯条把传输间隔误识别为复位信号(这也是之前全白灯的原因)。
* **硬件冲突规避设计**
* 由于 `P2.5` 是 SCLK 且物理上连接了马达,在 SPI 发送数据时,高频时钟会导致马达杂音或微动。
* 我们在此次重构中设计了**双向模式临时切换机制**:在开始发送数据前,将 `P2.5` 配置为高阻输入模式(禁用硬件驱动器输出);当 24 位数据发送完毕并执行复位(将 P2.3 拉低 100μs立即关闭 SPI 并将 `P2.5` 恢复为推挽输出模式。
* 整个 SPI 发送期间关闭中断(`EA=0`),从而实现马达与 RGB 灯条在物理引脚共享上的完美隔离。
### 3. 自适应射频解码兼容性
* 重构为**基于电平比例的自适应解码算法**。放宽绝对微秒窗口限制,通过低/高电平比例15~48倍基准为31倍自动识别 EV1527 帧并解析数据。
* 优化串口调试输出,避免大量多行打印造成的 CPU 阻塞。
### 4. 严格匹配要求的按键与事件交互逻辑
* **进入配对菜单**:在待机模式下,同时长按 `▲` + `▼` 3秒进入传感器类型选择菜单。
@@ -54,27 +64,10 @@
* **字模基线对齐**:将 `%` 字符0x25的字模数据在 8x16 矩阵中向上平移 2 像素,使其与前面的数字处于同一水平基准线。
* **坐标优化防重合**:将电池图标右移至 `X=92, Y=27`,电量百分比置于 `X=62, Y=24`。二者之间保留 6 像素间距,既美观又完美杜绝了贴合与重叠问题。
### 7. 对码捕获卡顿 Bug 修复
* 修复了 `while(1)` 循环开头无条件执行 `state_changed = 0` 导致在 Section 4 异步检测到射频匹配信号跳入 `STATE_PAIR_CONFIRM` 后重绘标记被强行抹除、屏幕始终卡死在搜索雷达页面的 Bug。现在已改在重绘判定内部重置检测到对码信号即可瞬间跳转至“捕获成功”确认页。
## 仿真模式扩展说明
为了支持无物理元件调试,串口输入指令集已同步扩展:
* **模拟组合按键**:串口发送 **`c`** 字符,模拟同时长按 `▲` + `▼` 按键 3 秒进入配对菜单。
* **模拟确认搜索**:在菜单页下发送 **`s`**,模拟按下 SOS 键,触发 100ms 短振与白灯快闪,进入对码搜索(雷达显示)。
* **模拟按键解除**:在求救模式下,发送 **`U`**、**`D`** 或 **`S`**(代表长按按键),即可解除 SOS 并退回时钟。
* **模拟切换系统布防状态**(用于测试普通防区的触发):
* 发送 **`1`**:强制系统进入 **NORMAL** 撤防/常态模式(门磁/PIR 触发时会被忽略,烟感/水浸/燃气仍可触发)。
* 发送 **`2`**:强制系统进入 **ARMED** 布防模式(门磁/PIR 此时被触发会立刻报警)。
* 发送 **`3`**:强制系统进入 **DISARMED** 撤防模式。
## 编译与 Git 仓库同步信息
* **编译器**Keil C251 V5.60.0.0
* **编译输出目标**`Build\wristband.hex`
* **编译状态**0 Errors, 2 Warnings (均属于未调用辅助函数的警告,无任何影响)
* **Program Size**data=104.7, edata+hdata=351, xdata=352, const=1390, code=13855
* **编译状态**0 Errors, 3 Warnings
* **Program Size**data=105.0, edata+hdata=351, xdata=370, const=1648, code=14237
* **Git 仓库地址**`https://dev.xtell.cn/zouhaitao/stc32g128k.git`
* **Git 提交记录**
* `feat: initial commit for stc32g12k128 wristband firmware` (含完整 `.gitignore` 规则,已成功忽略全部编译器生成的 `.obj` / `.lst` / `.hex` 等中间临时文件)。
* `feat: translate UI to French and implement XL-2020RGBC-2812B addressable RGB LED driver` (添加了法语界面翻译与 WS2812B 精准时序单线驱动,并成功推送至远程 `master` 分支)。