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モジュールは。
コメント