mcpField
S
spi-i2c-baremetal

spi-i2c-baremetal

github.com/mohitmishra786開発269305 回インストール18 週間前に更新
リポジトリ

spi-i2c-baremetal について

センサーやメモリデバイス向けに、ベアメタルのSPIおよびI2Cマスタードライバーを実装するスキルです。バス設定、レジスタ転送、よくある通信障害を説明します。

主な機能

  1. 01STM32 SPIマスターの設定
  2. 02I2Cレジスター読み取り手順
  3. 03SPIモードとクロックの設定
  4. 04一般的な転送パターン
  5. 05NACKとバス障害の診断

活用シーン

  1. 01I2Cセンサーのレジスター読み取り
  2. 02SPIフラッシュやディスプレイの初期化
  3. 03NACKや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. エージェントの使用方法
/spi-i2c-baremetal I2C read of register 0x0F from device 0x68

よくある問題

症状原因対処方法
I2C NACK7 ビットアドレスの誤り(データシートでは 8 ビット)アドレスをシフトし、R/W ビットを確認する
SPI のデータが不正CPOL/CPHA の不一致スレーブのモード表に合わせる
バスで SCL が Low のままスレーブのクロックストレッチ/障害バスリカバリー(クロックパルス)
CS のグリッチクロックに対する CS のタイミング最初の SCK の前に CS をアサートする

関連スキル

  • skills/baremetal/gpio-baremetal — CS、SDA、SCL ピン
  • skills/baremetal/peripherals-from-datasheet — タイミング要件
  • skills/kernel-dev/bus-drivers-i2c-spi — Linux カーネル側

コメント