docs: 重构系统层级为自下而上,剥离独立事件管理模块,全量校正GPIO引脚映射为原理图线标
This commit is contained in:
@@ -9,20 +9,20 @@
|
||||
## 2. 关键代码片段与逻辑实现
|
||||
|
||||
### 2.1 驱动初始化与管脚分配
|
||||
WS2812B 输入脚接在单片机硬件 SPI 组管脚中的 MOSI (`P2.3`):
|
||||
WS2812B 输入脚接在单片机物理引脚 `LED_RGB` (`P2.6`):
|
||||
```c
|
||||
sbit WS2812_DI = P2^3;
|
||||
sbit WS2812_DI = P2^6; // Pin 27
|
||||
|
||||
void WS2812_Init(void) {
|
||||
// P2.3 (MOSI) 配置为推挽输出,默认输出低电平 0
|
||||
P2M1 &= ~(1 << 3);
|
||||
P2M0 |= (1 << 3);
|
||||
// P2.6 (LED_RGB) 配置为推挽输出,默认输出低电平 0
|
||||
P2M1 &= ~(1 << 6);
|
||||
P2M0 |= (1 << 6);
|
||||
WS2812_DI = 0;
|
||||
}
|
||||
```
|
||||
|
||||
### 2.2 硬件 SPI 防噪声极速发送 (WS2812_Write24Bit)
|
||||
由于 SPI 时钟 SCLK 与马达引脚复用 `P2.5`,发送期间关闭总中断并将 `P2.5` 设为高阻输入以规避马达杂音,通过 SPDAT 展开 24bit 数据串行输出。
|
||||
### 2.2 驱动防噪声发送 (WS2812_Write24Bit)
|
||||
由于马达引脚占用 `P2.4` (Pin 25),为了规避马达震动时的共地杂噪,在串行输出数据期间关闭总中断并将马达引脚 `P2.4` 设为高阻输入。
|
||||
展宽 LUT 定义:
|
||||
```c
|
||||
const u16 code SPI_LUT[16] = {
|
||||
@@ -45,11 +45,11 @@ void WS2812_Write24Bit(u8 g, u8 r, u8 b) {
|
||||
b4 = buf[4]; b5 = buf[5]; b6 = buf[6]; b7 = buf[7];
|
||||
b8 = buf[8]; b9 = buf[9];
|
||||
|
||||
EA = 0; // 关中断保证 SPI 传输的连续性
|
||||
EA = 0; // 关中断保证串行传输的连续性
|
||||
|
||||
// 配置 P2.5 为高阻输入模式,屏蔽马达噪声
|
||||
P2M1 |= (1 << 5);
|
||||
P2M0 &= ~(1 << 5);
|
||||
// 配置 P2.4 (MOTOR_PWM) 为高阻输入模式,屏蔽共地马达干扰
|
||||
P2M1 |= (1 << 4);
|
||||
P2M0 &= ~(1 << 4);
|
||||
|
||||
SPSTAT = 0xC0; // 清除 SPI 状态寄存器
|
||||
SPDAT = b0; // 发送数据
|
||||
@@ -81,9 +81,9 @@ void WS2812_Write24Bit(u8 g, u8 r, u8 b) {
|
||||
SPCTL = 0x90; // 关闭 SPI 硬件使能
|
||||
WS2812_DI = 0;
|
||||
|
||||
// 恢复 P2.5 为推挽输出,控制马达常规功能
|
||||
P2M1 &= ~(1 << 5);
|
||||
P2M0 |= (1 << 5);
|
||||
// 恢复 P2.4 (MOTOR_PWM) 为推挽输出,恢复马达控制
|
||||
P2M1 &= ~(1 << 4);
|
||||
P2M0 |= (1 << 4);
|
||||
MOTOR = 0; // 确保马达断开
|
||||
|
||||
EA = 1; // 恢复中断
|
||||
|
||||
Reference in New Issue
Block a user