关于 spi-i2c-baremetal
这项技能介绍如何为传感器和存储器件实现裸机 SPI 与 I2C 主机驱动,说明总线配置、寄存器事务及常见通信故障。
主要功能
- 01配置 STM32 SPI 主机
- 02编写 I2C 寄存器读取序列
- 03设置 SPI 模式和时钟
- 04处理常见事务模式
- 05诊断 NACK 和总线故障
适用场景
- 01读取 I2C 传感器寄存器
- 02调试 SPI Flash 或显示屏
- 03排查 NACK 或 SCL 线路卡低
安装
复制下面的命令,在终端中运行。
$
npx skills add https:/ / github.com/ mohitmishra786/ low-level-dev-skills --skill spi-i2c-baremetal安装后在 Claude Code 中输入/spi-i2c-baremetal确认已加载。
详细介绍
SPI 和 I2C(裸机)
用途
为传感器和存储芯片实现 SPI 和 I2C 主机驱动:时钟配置、相位/极性(SPI)、START/ACK 序列(I2C),以及常见的寄存器读写事务模式。
适用场景
- 读取 I2C 传感器(WHO_AM_I 寄存器)
- SPI 闪存或显示屏的初始化
- 调试 NACK 或 SCL 卡住的问题
- 用最精简的代码替代 HAL_I2C/SPI
工作流
1. SPI 主机(STM32)
/* Mode 0: CPOL=0, CPHA=0 — check slave datasheet */
SPI1->CR1 = SPI_CR1_MSTR | SPI_CR1_SSM | SPI_CR1_SSI
| (3 << SPI_CR1_BR_Pos); /* baud divider */
SPI1->CR1 |= SPI_CR1_SPE;
uint8_t spi_xfer(SPI_TypeDef *spi, uint8_t tx) {
while (!(spi->SR & SPI_SR_TXE))
;
*(volatile uint8_t *)&spi->DR = tx;
while (!(spi->SR & SPI_SR_RXNE))
;
return *(volatile uint8_t *)&spi->DR;
}
CS(GPIO 位操作):
GPIO_CS_LOW();
spi_xfer(SPI1, reg | 0x80); /* read */
uint8_t val = spi_xfer(SPI1, 0xFF);
GPIO_CS_HIGH();
2. I2C 主机——寄存器读取
/* START → addr+W → reg → repeated START → addr+R → data → STOP */
bool i2c_read_reg(I2C_TypeDef *i2c, uint8_t dev7, uint8_t reg, uint8_t *out) {
if (!i2c_start(i2c)) return false;
if (!i2c_tx(i2c, (dev7 << 1) | 0)) return false;
if (!i2c_tx(i2c, reg)) return false;
if (!i2c_restart(i2c)) return false;
if (!i2c_tx(i2c, (dev7 << 1) | 1)) return false;
*out = i2c_rx(i2c, false); /* NACK last byte */
i2c_stop(i2c);
return true;
}
根据参考手册轮询 SB、ADDR、TXE、RXNE、BTF。
3. 常见协议
| 模式 | 总线 |
|---|---|
reg + write data | I2C/SPI |
| `0x80 | reg` 读取(MSB 置位) |
| 16 位大端长度前缀 | SPI 闪存 |
4. Agent 使用方式
/spi-i2c-baremetal I2C read of register 0x0F from device 0x68
常见问题
| 现象 | 原因 | 解决方法 |
|---|---|---|
| I2C NACK | 7 位地址错误(数据手册给出的是 8 位地址) | 移位地址;检查 R/W 位 |
| SPI 读到乱码 | CPOL/CPHA 不匹配 | 按从设备模式表配置 |
| 总线 SCL 被拉低而卡住 | 从设备时钟延展/故障 | 总线恢复(发送时钟脉冲) |
| CS 出现毛刺 | CS 与时钟时序不匹配 | 在第一个 SCK 到来前拉低 CS |
相关技能
skills/baremetal/gpio-baremetal— CS、SDA、SCL 引脚skills/baremetal/peripherals-from-datasheet— 时序要求skills/kernel-dev/bus-drivers-i2c-spi— Linux 内核端
评论
支持 Markdown