mcpField
S
spi-i2c-baremetal

spi-i2c-baremetal

github.com/mohitmishra786开发269305 次安装18 周前更新
代码仓库

关于 spi-i2c-baremetal

这项技能介绍如何为传感器和存储器件实现裸机 SPI 与 I2C 主机驱动,说明总线配置、寄存器事务及常见通信故障。

主要功能

  1. 01配置 STM32 SPI 主机
  2. 02编写 I2C 寄存器读取序列
  3. 03设置 SPI 模式和时钟
  4. 04处理常见事务模式
  5. 05诊断 NACK 和总线故障

适用场景

  1. 01读取 I2C 传感器寄存器
  2. 02调试 SPI Flash 或显示屏
  3. 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 dataI2C/SPI
`0x80reg` 读取(MSB 置位)
16 位大端长度前缀SPI 闪存
4. Agent 使用方式
/spi-i2c-baremetal I2C read of register 0x0F from device 0x68

常见问题

现象原因解决方法
I2C NACK7 位地址错误(数据手册给出的是 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