1. 项目背景与核心价值
SPI总线上的按钮驱动开发是嵌入式系统开发中一个看似简单但极具代表性的实战案例。在实际项目中,我们经常会遇到通过SPI接口扩展输入设备的需求,而按钮作为最基础的人机交互元件,其驱动实现质量直接影响整个系统的响应性能和用户体验。
这个项目之所以值得专门探讨,是因为它完美呈现了嵌入式开发中的几个关键挑战:
- 如何在不占用过多MCU引脚的情况下扩展输入设备
- 如何在资源受限的环境中实现可靠的消抖处理
- 如何设计高效的驱动架构来平衡实时性和资源消耗
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 硬件架构设计解析
2.1 SPI按钮扩展方案选型
常见的SPI按钮扩展方案主要有三种:
- 专用GPIO扩展芯片(如MCP23S17)
- 移位寄存器方案(如74HC165)
- 复合功能芯片(如带按键扫描的LCD驱动IC)
我们选择74HC165方案进行实现,主要基于以下考量:
- 成本优势:单颗74HC165价格不足1元
- 电路简单:仅需3个SPI引脚(CLK, MISO, CS)
- 扩展灵活:可级联多片实现更多按钮输入
2.2 典型电路连接方式
code复制 +-----+
PB0 |----| CS |
PB1 |----| CLK |
PB2 |----| PL |
PB3 |----| QH |----[下一级的SER]
| ... | 74HC165
BTN1 |---| A |
BTN2 |---| B |
... +-----+
关键设计要点:
- PL(并行加载)引脚建议接MCU GPIO
- 级联时前级的QH接后级的SER
- 每个按钮需接10kΩ上拉电阻
- 建议在CLK线上串接100Ω电阻抑制振铃
3. 驱动程序设计实现
3.1 驱动框架设计
我们采用分层设计架构:
code复制应用层
↑
事件处理层(消抖、长按识别)
↑
数据采集层(SPI通信)
↑
硬件抽象层(寄存器操作)
3.2 SPI通信核心代码
c复制#define BTN_CS_LOW() GPIO_ResetBits(GPIOB, GPIO_Pin_0)
#define BTN_CS_HIGH() GPIO_SetB
