動作環境
Raspberry Pi 2 Model B (以下RPi)
Raspbian Jessie
Tektronix TDS 2024C (200 MHz, 2GS/s)
とあるI2Cセンサ
I2Cセンサの読取りを「手軽に」行おうとRaspberry Piを使い始めた。
その結果
- i2cdumpでSCL, SDAの波形を確認
- アドレス範囲が広い場合: OK
- アドレス範囲が狭い場合: NG
- i2cgetでSCL, SDAの波形を確認
- NG
- RPi.GPIOにてpythonでコーディング
- ACKの段階で応答がおかしい
- RPiを使う意味があまりない (MSP430などのマイコンで良い)
- RTOSがからんで、波形のタイミングも変わる
考えを変更した結果、以下ではうまく動いた。
https://www.raspberrypi.org/forums/viewtopic.php?f=44&t=33334
のby edo1 » Fri Oct 30, 2015 4:49 pm
にあるコードを参考にしたら動いた。
あとは、この成功した状態でオシロにて波形を確認して、それと同等の波形を生成するコードをMSP430で実装するだけ。
問題はSDAのIN/OUTを切り替えるタイミングはオシロの波形からは分からない点。
なお、PythonでRPi.GPIOを使った後は、以下のコマンドを実行しないと最後のCコードは正常動作しなかった。
$ sudo modprobe -r i2c-bcm2708
$ sudo modprobe i2c-bcm2708
以下が実際に読み取った波形 (オレンジがSCL, 水色がSDA)。
- 左カーソルの左側がstart condition。
- その後にslave address 0x28を送信 (7bit)。
- readビットである1を送信 (1bit)。
- 右カーソルからデータ読取 (1バイト目)。
- 先頭2つはステータスビット(0x00なら正常)。
SCLは100kHz。
圧力の単位換算
http://calc-site.com/units/pressure
教えていただいた事項
@fujiwarasoftservice さんのコメントにてRepeated Start ConditionをRaspberry Piで行う方法を紹介いただきました。
情報感謝です。