アクセス数の多い方から優先し、できるだけご迷惑をおかけすることはないにします。 このビットは、データ送受信する一時的なデータ保存場所にデータがあるかないかの状態を示すビットです。I2C通信でデータを送受信する場合、送受信が終わったかどうかを判定する方法は別にありますので、通常のI2C通信ブログラムを作る場合、このビットを見ることはそれほどないと思います。このビットは状態を示すビット(=読み取りビット)ですので値を設定しても無効です。, 補足として、先ほどのR/Wビットでもデータ送受信完了はわかりますが、BFビットはACK/NACK信号は含んでいません。R/Wビットは、「8ビットのデータ + 1ビットのACK/NACK信号」の送受信が終わったかどうかがわかります。BFは「8ビットのデータの送受信」(ACK/NACK信号は含まない)が終わったかどうかがわかります。, 一般的なI2C通信のマスターモードの場合、SSPxSTATレジスタは以下の設定のどちらかになります。, SSP1STAT = 0x80; // クロック信号が100kHzの場合 このビットはSPIの名前が付いていますが、I2C通信の場合は以下の設定になります。, 突然「SMBus」という用語が出てきました。これはI2C通信の派生仕様の通信方法になります。通常のI2C通信の場合は0に設定します。, D/A: Data/Address bit     Wire.write(b++); でも、念のため畳の上でテスト。, 当初、スレーブ側から送信した1バイトのデータをマスター側で表示させるというプログラムを作成して動作の検証を行っていた。 このビットはI2C通信でもアドレスを10ビットモードで使用しているときのアドレス状況を示すビットです。10ビットアドレスは使用しませんので説明は省略します。このビットは状態を示すビット(=読み取りビット)ですので値を設定しても無効です。, BF: Buffer Full Status bit 使用するPICマイコンのデータシートを見て確認する必要があります。. プログラムはC言語でgccでコンパイル。, Raspberry Pi用のGPIOインターフェイスライブラリ「wiringPi」を使用するので事前にインストールしておく。 前回の説明で、I2C通信のクロック信号の速度について説明するのを忘れてしまいました。, SPI通信もI2C通信も、データの送受信はクロック信号の変化で読み取る、というルールにしています。クロック信号の速さによらずクロック信号の変化のタイミングでデータ信号を読み取ればいいので、クロック信号の速さは特に決めておく必要はありません。そのためSPI通信ではクロック信号の速度は特に規定はありませんでした。(マスター、スレーブ共に限界値はありますが…), 一方、I2C通信ではクロック信号の速度は標準化されています。I2C通信のバージョンによって異なりますが、以下のように規定されています。単位は、bits/s(1秒あたりに何ビット送信できるか)です。また、それぞれの速度には通称がつけられています。, このようにクロックの速度は標準化されていますが、これ以外の速度では通信できない、というわけではありません。ただ、実践編では初めてのI2C通信プログラムということで、標準のスタンスダードモード(100k bits/s)でプログラムを作成します。, なお、クロック信号を速くすると当然ながらその分データを早く送ることができますが、あまり速いと電気的な信号は乱れてきますので通常は100k bits/s、速くても400k bits/sあたりがよいと思います。, この後の説明で出てきますが、400k bits/sにする場合、PICマイコンの設定のなかに、波形がなるべく乱れないように、あらかじめクロック信号とデータ信号の波形を調整する機能がありますので、クロックの速度に合わせた設定をするようにします。, I2C通信のプログラムは、PICマイコンに内蔵されているI2C通信機能を使用します。I2C通信のプログラムは今まで出てきた他の機能と同様、最初にピンのデジタル/アナログ設定、入出力設定やその他関連する機能の設定などの初期設定が必要です。, 初期設定を行うと、I2C通信ができるようになります。I2C通信の基本的な通信の流れは、スタートコンディションの生成から始まり、スレーブセレクトの送信、データの送受信、ストップコンディションの生成、という順番ですが、I2Cモジュールによってパターンが異なります。そこで、それぞれの通信を関数にして利用することにします。I2C通信を行う際は、I2Cモジュールの仕様に合わせて、これらの関数を呼び出してデータ通信を行うことになります。, I2C通信に使用するピンはクロック信号ピン(SCLピン)とデータ信号ピン(SDAピン)ですが、これら2ピンは以下の設定にします。, クロック信号はマスターが出力しますし、データ信号は入出力になりますので、両方とも「入力」に設定するのはちょっと不思議ですが、仕様上このように設定することになっています。ピンの設定をこのようにしておき、I2C通信を有効にすると、それぞれのピンは正しく動作するようになります。, まず、レジスタ名をよく見ると、全て「SSP1」で始まっています。設定レジスタ理解のための最初の一歩は、この「SSP1」の意味の解明からです。, すみません、今までの説明で「PICマイコンの中にはI2C通信モジュールが2個あります」という説明をしてきました。, 実はこれらのモジュールは、一つのモジュールでSPI通信とI2C通信の両方をサポートしているんです。, このモジュールことを「MSSPモジュール」と呼んでいます。MSSPは「Master Synchronous Serial Port」の略で、日本語としては「マスター同期型のシリアルポート」という訳になります。今まで説明してきましたSPI通信やI2C通信は、マスターがクロック信号を生成して、全てのスレーブはそのクロック信号に合わせてデータのやり取りを行います。これは、「マスター(のクロック信号に)同期(して通信を行う)型」という意味合いです。また「シリアルポート」とは、以前の記事でシリアル通信を説明しましたが、そのシリアル通信を行うポート、という意味になります。, PIC16F18857には、このMSSPモジュールが2個搭載されています。レジスタ名で表現する場合、これら2個のモジュールに対して「SSP1」「SSP2」という名称がつけられています。「SSP1」は「MSSPモジュール1」に関するレジスタ、ということになります。, また、データシートを調べる場合「SSP1STAT」はこの名称では説明されていません。モジュール1の「SSP1STAT」もモジュール2の「SSP2STAT」も同じ内容になりますので、データシートでは数字の部分を「x」として、「SSPxSTAT」という名称で説明されています。, これから上の表のそれぞれのレジスタの設定内容を説明します。ただ、設定項目が多いですが、一般的なI2C通信を行う場合は一般的な設定がありますので「とりあえずこう設定しておけば動く」という設定値も記載します。, なお、これらのレジスタはSPI通信とI2C通信兼用です。データシートには「SPI通信の時はこういう意味の設定、I2C通信の時はこういう意味の設定になる」と記載されていますが、以下ではI2C通信のみの説明になります。また、PICマイコンのMSSPモジュールは、I2Cのマスターとスレーブ両方に対応していますが、以下の説明はマスターの部分のみの説明になります。もしご自分でPICマイコンを使ってスレーブのデバイスを作る場合は、データシートをご確認いただければと思います。, 「SSP1 Status Register」は SSP1モジュールのステータスが格納されるレジスタです。このレジスタを調べると現在の通信状況(通信ステータス)がわかります。また一部のビットは設定にも使用されています。, SMP: SPI Data Input Sample bit これは単にPICマイコン側のクロックの設定が正しいか、MSSPモジュールが有効になっているかの確認のみなので、実際に実行する部分としてはLEDの点滅のみの簡単なもの。, マスター側のRaspberry Pi3で「i2cdetect」コマンドを実行し、スレーブのアドレスが表示されれば電圧レベル変換モジュールを経由してPICマイコンも所定のクロックでI2Cスレーブとして動作していることの疎通確認ができるというものだった。, Raspberry Pi用のGPIOインターフェイスライブラリ「wiringPi」の使い方も含めた検証なので、単純に1バイトのデータの送受信のみ。, 試験にあたっては、スレーブ側のPICマイコンはブレッドボード上に置いたが、実際に使用する電圧レベル変換モジュールを取り付けた基板とは2メートルほどのLANケーブルで接続し、実環境に近づけた。, よく他人様のHPでみかけるような奇麗に整理された環境とは程遠いゴチャゴチャの環境。, ちなみに、Raspberry Pi3は透明のプラケースに入れ、他の基盤の裏面にはプラダンなどの絶縁物のシートをネジ止めして絶縁しているので、テキトーな位置にポっと置いてもショートすることはない・・ハズ。