STM32のI2Cはよくわからん

I2Cで1バイトのレジスタリードをするとき、通常は

START → スレーブアドレス(W)送信(W/ACK) → サブアドレス送信(W/ACK) → START(リスタート) → スレーブアドレス(R)送信(W/ACK) → レジスタデータ読み出し(withoutACK) → STOP

とするが、

START → スレーブアドレス(W)送信(W/ACK) → サブアドレス送信(W/ACK) → STOP → START → スレーブアドレス(R)送信(W/ACK) → レジスタデータ読み出し(withoutACK) → STOP

としないとデータが出てこないへんなデバイスがあった(デバイスメーカ自らこのようにしてくれと公言)

で、これを STM32の I2C で使おうとしたら、、、レジスタデータ読み出しまではできるようだが、そのあとなんかへんなシーケンスにはまってしまうみたいで、以後動かなくなってしまう。
(SDAがLのままになってしまい、それでI2Cモジュールは他からI2Cバスを占有されてると思ってしまうみたい?)

I2CモジュールをいったんDISABLEにしたり、SWRSTビットがあるのでそれでソフトウェアリセットしようとしてみても、できない。
しょうがないので、I2Cモジュールを使うのをあきらめて、ソフト駆動でI2Cして逃げるはめになってしまった・・・。

よくわからんなーSTM32のI2Cモジュールは。

コメント

タイトルとURLをコピーしました