【MSSPモジュールの概要】
PIC18シリーズの内蔵されている、MSSP(Master Synchronous Serial Port)モジュール
はボード内の他のデバイスICと高速にシリアル通信をするためのモジュールで、SPIと
I2Cという2種類の動作モードで使うことができます。
・SPI(Serial Peripheral Interface)
比較的簡便なシリアル通信で2つのシフトレジスタが環状に接続されてその間を
シリアルで通信する構成となります。
・I2C(Inter-Integrated Circuit)
フィリップス社が提唱するシリアル通信方式で、3個以上のデバイスをパーティー
ラインで接続してマスター・スレーブの関係を構成して通信をします
【MSSPのI2Cモードでの使い方】
MSSPモジュールはI2Cモードでの使い方が可能で、すべてのマスター/スレーブモード
に対応しています。また同報アドレス指定やマルチマスターモードもサポートしています。
I2C通信は2種類の信号で通信が可能で、PICの場合には、 SCL :RC3 SDA:RC4
の2ピンが対応しています。I2Cモードで使うときには、この2つのピンはオープンドレイン
の回路にする必要があるため、TRISレジスタで入力モードに設定しておく必要があります。
このときのMSSPモジュールの構成は下図のようになり、やや複雑な動きをします。
送受信はシフトレジスタSSPSRが中心となって行い、マスタ側が出力するクロック
信号(SCL)に合わせてSSPSRに取り込み/送り出しを実行します。
また送受信データのプログラムとの受け渡しは、バッファとなるSSPBUF経由で行います。
スレーブの時の自アドレスはSSPADDレジスタにセットし、これと受信したアドレスとが
一致したとき、Addr Match 信号が出力されてその後の送受信動作に入ります。
通信の開始終了はStart・Stopシーケンス検出回路で各々を検出することで行われ
ます。送受信の結果のステータスは、SSPSTATレジスタに保持されます。
PICのI2Cでは、下記のモードでの使い方ができます。この設定はSSPCON<3:0>の
4ビットで指定します。
1.マスターモード
2.スレーブモード
7ビットアドレス 同報アドレス可能
3.スレーブモード
10ビットアドレス 同報アドレス可能
4.スレーブモード
7ビットアドレス+Start/Stop Bit割込み許可
マルチマスターモードで使用する
5.スレーブモード
10ビットアドレス+Start/Stop Bit割込み許可
マルチマスターモードで使用する
6.ファームウェア制御によるマスターモード
スレーブはアイドル状態
【MSSP制御用レジスタの内容】
MSSPを使うためには、MSSPを設定したり状態を確認するためのレジスタを使う必要が
あります。関係する制御用レジスタには、SSPSTAT、SSPCON1、SSPCON2の3種類の
レジスタがあり、それぞれの詳細は下図のようになっています。
もともとMSSPにはI2Cモード以外にSPIモードでの使い方もあるので、両方兼用の内容
になっていますが、下図ではI2Cモードに関係するもののみ解説しています。
(1) SSPSTAT:MSSPの状態レジスタ
I2Cの動作シーケンスのどの段階での割込みかをこの状態レジスタで知ることができ
ます。またRead要求かWrite要求かも判定することができます。
(2) SSOCON1、SSPCON2:設定レジスタ
MSSPの使用モードの初期設定や、受信エラー検出、その他の動作モードの
指定などに使います。
【通信手順とデータフォーマット】
I2Cで通信を行うときの信号フォーマットは下図のようになっています。
まずスレーブのアドレス指定方法に7ビットと10ビットの2種類があります。現状では
大部分が7ビットアドレスです。
(1) 7ビットアドレスの場合
この場合にはアドレスが1バイトで送信できるため、手順としては簡単になっています。
最初にマスタからアドレスとRead/Writeを指定するデータが送信され、あとはReadか
Writeかによって手順が分かれますが、データ8ビット送受信後、受信側がACKを返す
という手順で進行します。そして通信の最後はStop Conditionで終了します。
スレーブ側から送信する場合には、処理時間を確保するために、クロックストレッチに
よってマスタを待たせることができます。
さらにマスタ側は、送信終了のStop Conditionを発行する代わりに、Repeated Start
Conditionを発行することで、連続して別のスレーブとの通信を行うことができます。
このときにはI2Cバスを開放しないので、マルチマスタの時にも連続通信となります。
実際の通信では、1バイトの通信毎にSSPIFがセットされるので、割込みが許可されて
いればその都度割込みが発生します。割込みを受けつけたら(あるいはSSPIFをセンス
したら)、まずSSPSTATの内容によりどの条件による割込みかを判定します。
割込みにはStart、Stop、バッファフル、エラーなどいくつかあります。そして通常の
バッファフルの割込みである場合には、受信の時は、SSPBUFの内容を読みこんでから、
あるいは送信の時には、SSPBUFに送信データを書き込んでから、SSPIFをクリアして
次の割込みに備えます。特に受信の場合には、これらの一連の処理を次のバイトの受信
が完了する前に終える必要があります。そうしないと受信エラーとなってしまいます。
(2) 10ビットアドレスの場合
アドレスが10ビットの場合にはアドレスを送信するのに2バイトが必要となるため、通信
の開始手順が複雑となります。
まず受信の場合には、単純にアドレスの1バイト目を受信要求で送り、続いてアドレスの
2バイト目を送ります。特に異常もなくACKが返ってくれば、そのまま続いてデータを送信
します。スレーブ側では、アドレスが一致したスレーブだけが、以降のデータ受信動作を
行います。
マスタが送信要求を出す場合には、複雑になります。まず2バイトのアドレスを送信します。
これで特定のスレーブだけが指定されます。続いて Repeated Start Conditionとして
再スタートをします。この時にRead/WriteビットにRead要求を出力します。すでにアドレス
指定されていたスレーブがこれに対応してデータを出力しマスタがそれを受信して正常な
らACKを返送します。最後はマスタはACKを返送せずにStop Conditionを発行して終了と
なります。このときにもスレーブ側がクロックストレッチをすることで処理時間を確保できる
のは同じです。
この場合にも1バイトの受信毎に割込みが発生するのは同じですので、SSPSTATの内容
によってそれぞれのシーケンスな処理をする必要があります。