現在、I2C 経由で通信するための stm32l152 (検出キット) のペアを取得しようとしています。(i2cを自分で実装したいので、STMが提供する標準周辺ライブラリを使用していません..)
私の構成は次のとおりです。
7 ビット アドレッシング モード (デュアル アドレスなし、OAR1 のみ)
100kHzの速度
ACK 有効 (スレーブ上)
ACK 無効 (マスターでは、常に 1 バイトのみがマスター/スレーブ間で転送されるため)
GPIOB (PB10) を SCL として、GPOB (PB11) を SDA として使用して、マスター/スレーブの両方で
ここで奇妙な部分があります。2 つの GPIOB ピンをプッシュプル (プルアップ/ダウンなし) として構成すると、マスターが開始ビット、アドレス バイトを送信するのをオシロスコープで見ることができます。
しかし、私のスレーブは確認応答を返していません。マスターがSR1でADDRビットをアサートしなかったため、これは確かです。スコープにACKが表示されず、スレーブも割り込みに移行しませんでした(スレーブでI2Cイベント割り込みを有効にしました)。
オシロスコープの波形を詳しく見てみると、信号 (SCL、SDA の両方) が完全に 0 ボルトになっていないことがわかりました。スレーブがマスターからアドレス バイトを読み取ることができず、ACK を返さなかったのは、おそらくこれが原因だと推測しています。
そこで、2 つの GPIO ピンをオープン ドレイン (プルアップ/ダウンなし) に構成します。しかし、マスターがスタート ビットを送信できなくなりました。 STARTビットを設定します..しかし、スコープのSDAおよびSCL信号に応答が見られません(両方とも3Vでハイです)。
(各ラインで 10kΩ を使用して、SCL と SDA の両方を 3v にプルしました)。