PAGE TOP

I2C通信・・複数バイトの送受信テスト・・

I2Cで複数バイト送受信テスト

Nゲージのレイアウトで使用する制御盤ポイントマシンの制御、信号LEDの制御などをラズベリーパイとPICマイコンを使用して製作中。

ラズベリーパイとPICマイコン間のデータのやり取りはI2C通信で行いたい。

だが、「I2C通信・・複数バイトの受信終了がわからない・・」という問題があった。

ちょっと試行錯誤の上、なんとか動くんじゃないか?というテストプログラムができた。



 

今回作ろうとしているのは、I2CのマスターがRaspberry Pi、スレーブがPICマイコン。
I2C通信・・複数バイトの受信終了がわからない・・」ということで調べたところの結論から言うと、複数バイトのデータの送信送完了時にはStop Conditionビットを立てる必要があるが、Raspberry Pi側をc言語で作った場合、このビットの操作が難しいということ。

なので、Stop Conditionビットではなく他の方法を考慮した方が近道らしいということ。

と、いうことで先にも検討したように、Raspberry Pi側から複数バイトのデータを送る時は、最初に送るデータのデータ長を送信しておき、PICマイコン側では指定のバイト数を受信したら受信完了とみなす方法をとることにした。

 

レングス 割り込み データ 割り込み データ 割り込み データ 割り込み

 

PICマイコン側では割り込みの回数をカウントしながらデータを受信し、レングス分データを取得したら受信完了とみなす。

逆に、PICマイコン側からRaspberry Pi側に送信するときは。
PICマイコンはStop Conditionビットを容易に立てることができるが、同一のデータフォーマットとするため、PICマイコンからの送信データも上記のように先頭のデータは送るデータのデータ長としてみた。

マスター側プログラム

Raspberry Pi側。

文字列をスレーブ側にデータを送信し、その後データを受信する。
送受信したデータはprintfでコンソールに表示するため、このテストプログラムでは表示可能な文字を送受信しているが、実際に使用するときはバイナリデータを送受信しても問題はない。

 

スレーブ側プログラム

PICマイコン側(PIC16F886)。

受信したデータの先頭に「RECEIVED:」という文字列を付加して送り返している。

 

実行すると・・

プログラムは細部をよ~くチェックする必要があるが、とりあえず無事、送受信することができた。

I2Cで複数バイト送受信テスト


課題としては、スレーブ側が受信したデータの処理が終わらないうちにマスター側が次のデータを送信してきたとき。

マスター側に「ちょっと待ってね」を返信しなくちゃならん。

 

余談だが、スレーブ側の電源が入っていない状態でマスター側を実行すると、wiringPiI2CSetupでエラーになる。

strerror(errno)で結果を表示すると・・

 

pi@raspberrypi-1:/var/www/html/ngauge/i2c $ ./i2cserver
I2C send error : Remote I/O error
pi@raspberrypi-1:/var/www/html/ngauge/i2c $

Remote I/O errorが戻ってきた。



趣味の部屋 スマホ/タブレットサイト 趣味の部屋 PCサイト