spi-i2c-baremetal について
センサーやメモリデバイス向けに、ベアメタルのSPIおよびI2Cマスタードライバーを実装するスキルです。バス設定、レジスタ転送、よくある通信障害を説明します。
主な機能
- 01STM32 SPIマスターの設定
- 02I2Cレジスター読み取り手順
- 03SPIモードとクロックの設定
- 04一般的な転送パターン
- 05NACKとバス障害の診断
活用シーン
- 01I2Cセンサーのレジスター読み取り
- 02SPIフラッシュやディスプレイの初期化
- 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 data | I2C/SPI |
| `0x80 | reg` 読み取り(MSB をセット) |
| 16 ビットのビッグエンディアンの長さプレフィックス | SPI フラッシュ |
4. エージェントの使用方法
/spi-i2c-baremetal I2C read of register 0x0F from device 0x68
よくある問題
| 症状 | 原因 | 対処方法 |
|---|---|---|
| I2C NACK | 7 ビットアドレスの誤り(データシートでは 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 カーネル側
コメント
Markdown 対応