ブログパーツ レンタルCGI
TAKAさんの毎日が発見・ブログ
アマチュア無線の機器製作を中心にした日常の活動記録です (by Taka JA2GRC、このブログはFC2_BLOGを使わせていただいてます。)
≪09月   2017年10月   11月≫
1  2  3  4  5  6  7  8  9  10  11  12  13  14  15  16  17  18  19  20  21  22  23  24  25  26  27  28  29  30  31  
BME280 Pressure Sensor・その3
 I2Cの信号をもう少し詳しく調べてみました。
 今まで、I2Cと言う名前は何度も聞いていましたし、センサーやその他デバイスも何度か使ったことが有りましたが、ネットの実例通り繋いで、Arduino やRaspberry Pi のライブラリを入れて、用意された関数を使えば、難なくデータが取り込めていたので、ある意味ブラックボックスで、気に掛けることもなく使っていました。 まあ、通常はこれで良い訳で、そのためのI2Cで有るとは思うのですが。

 ところが、ちょうど、良い教材が出てきましたし、安静を言い渡されている身で、ある意味、結構な時間が出来てしまったので、ここは、じっくりと、I2Cと言うものを理解してみようという気になっています。 それで、早速、デジタルオシロでI2Cの2つの信号、SCLとSDAを眺めてみました。 昨日、実行したBMP180とBME280を平行に動かすスケッチを実行していると、こんな感じで信号が流れています。 2つバースト的に信号が見えていますが、最初の600μSぐらいの信号はBMP180とArduino の通信で、後ろ側の約1mSの信号の塊はBME280とArduinoの通信みたいです。 2つの通信の間に有る500μS程の空白は、BMP180から取り込んだデータから、温度と気圧を計算してシリアルポートにはき出す処理をしている時間だと思います。 温度と気圧の計算に浮動小数点演算を使用しているのと、シリアルポートの速度が9600ボーなのでそこそこ時間が掛かっているのだと思います。 BME280との通信の後も同じような処理が入っている訳ですが、この波形では見えていません。

160501_bme280_pressure_sensor_13.jpg

 さて、BMP180との通信の頭の所を詳しく見てみます。 I2Cの信号の意味づけについては、こちらの解説が分かり易かったので参考にさせてもらいました。

 まずは、クロック(SCL)は10μ周期になっていますので、このI2Cは標準モードの100kbpsで動いているようです。

 I2C通信のスタートは、SCLがHighの間にSDAがLowに変化した時にスタートされるみたいです。 その後、SCLがLowになったら、マスター側は最初のD0をSDAラインに設定し、SCLのLow→Highでスレーブ側がD0を取り込むみたいです。 後は順にD1~D7まで送られて、D7が終わった所で、スレーブ側はSDAラインをLowに落とすと、次のSCLラインがLow→Highになるタイミングで、ACKと判定されるようです。 こうして、8ビットのデータがマスターからスレーブに送られる様になっている見たいです。 なお、SDAラインがマスター・スレーブ両方からアクセスされる為、オープンドレインになっていて、プルアップ抵抗でVddに引っ張られているみたいですね。

160501_bme280_pressure_sensor_14.jpg

 スタート部分をもう少し詳しく調べてみると、最初の8ビットはアドレスが送出されているみたいで、D0がアドレスのMSB、D6がアドレスのLSB、で7ビットのI2Cデバイスアドレスを表しています。 この場合は、「1110111」で、0X77となっており、BMP180のデバイスアドレスを送っているみたいです。 最後のD7はデバイスアドレスを送る場合は、次に送られるデータの方向(リードかライトか)を示している様で、Highならマスターから見てリード、Lowならマスターから見てライトになるようです。 この場合はLowですのでライトですね。

 続いて送られている信号はデバイス固有の物になって、BMP180の場合はコントロールレジスタのデータが送られています。 この場合もD0がMSB側で、D7がLSBみたいで、この場合は「11110100」で0XF4で、BMP180の場合はPressureの測定スタートコマンドになっています。 なるほど、なるほど、こうやってコツコツと一つずつデータを送り込んで、結構ややこしい気圧の測定を行っているのですね。

160501_bme280_pressure_sensor_15.jpg

 この後、結構長いデータが続きますが、これを解析するのは専用のI2Cデータラインアナライザみたいな物がないと面倒ですね。 一番最後の所は、最後のACKを確認したあと、マスタがSDAをLowにしたあと、クロックを停止してHighにしてから、SDAをLow→Highにするとストップシーケンスと判定されるみたいです。

160501_bme280_pressure_sensor_16.jpg

 しかし、SCLとSDAの2本の線のみで、結構、巧妙なことをやっていますね。 USBなんかも、電源とGNDを除けば、信号線は2本ですが、通信方式は別の方法でやっている模様ですね。
コメント
この記事へのコメント
URL :
コメント :
パスワード :
管理者にだけ表示を許可する
 
トラックバック
この記事のトラックバックURL
Template designed by アクセラと+αな生活

Powered by まとめ .