【マスタモードの使い方】
MSSPをマスタモードで使うときには、SSPCON1レジスタのSSPMビットを
セットします。これでマスターモードとなり、下記の処理が必要となります。
・Start Conditionの発行
・Repeated Start Conditionの発行
・アドレスとデータ送信のためのSSPBUFへのアクセス
・データ受信毎のACK発行
・Stop Conditionの発行
・データ受信のためのConfiguration
そしてこれを制御するために、下記のイベントが発生します。
・Start Condition発行終了
・Stop Condition発行終了
・データの送受信完了
・ACKの送信完了
・Repeated Start Conditionの発行完了
そしてマスタモードの時のMSSTの動作は下記ブロックのようになります。
まず(BRG)Boud Rate Generatorは指定された速度でのクロック信号を発生し、SCL
ラインに出力します。その出力は一定のシーケンスで制御されてピンに出力されます。
このBRGにセットするデータはSSPADDレジスタにあらかじめセットしておけば自動的に
BRGに転送されます。
アドレスや送信データをプログラムでSSPBUFにセットすると、あとは自動的にSSPSR
に転送され、クロックに従って順次データピンSDAに出力されます。
Start ConditionやStop Conditionはプログラムの指示に従って出力されます。
マルチマスターモードをサポートするために衝突検出回路が設けられており、衝突を
検出するとプログラムに通知し、衝突時のリトライ処理をすることができます。
【マスタ側の送信時の動作概要】
マスタモードで送信をするときは、すべてマスタ側のプログラムで制御することに
なります。その手順は下記のようになります。
(1) まずStart Conditionを発行するため、SSPCON2のSENをセットします。
(2) 発行が終了するとSSPIFがONとなり、割込みが発生します。
(3) 一定時間内にスレーブアドレスをSSPBUFに書き込み送信を開始します。
このときR/Wのビットには0を指定して
(4) 送信が完了すると割込みが発生するので、スレーブ側からACKが返送されて
いることをSSOCON2のACKSTATが0となっていることで確認します。
(5) 次に送信データをSSPBUFにセットすれば送信が開始されます。
(6) 送信が完了すると割込みが発生するので、このときスレーブ側からACKが
返送されているかをACSTATで確認します。
このデータ送信をすべてのデータが完了するまで繰り返します。
(7) データ送信が完了したらStop Condition発行のためにSSPCON2のPENビット
をセットします。
または、次の送信を開始するために、RSENビットをセットしてRepeated Start
Conditionを発行します。
(8) 正常にStop ConditionまたはRepeated Start Conditionの発行が完了すれば
割込みが発生することで確認します。
【マスタ側の受信動作の概要】
マスタ側がスレーブからデータを受信する場合の動作もすべてマスタ側が制御する
ことになります。その手順は下記のようにします。
(1) まずStart Conditionを発行するため、SSPCON2のSENをセットします。
(2) 発行が終了するとSSPIFがONとなり、割込みが発生します。
(3) 一定時間内にスレーブアドレスをSSPBUFに書き込み送信を開始します。
このときR/Wは1のReadを指定して出力します。
(4) 送信が完了すると割込みが発生するので、スレーブ側からACKが返送されて
いることをSSOCON2のACKSTATが0となっていることで確認します。
(5) 次にスレーブからのデータ送信を待ちます。データの受信が正常にできたら
すぐにACKを返送するべくACKENをセットします。
(6) 受信データをSSPBUFからとり出します。再度受信を待ちます。
これを必要な回数繰り返しますが、最後のデータの受信に対してだけACKを
返さないでおきます。スレーブ側はこれでデータ送信の完了を知ることになります。
(7) データ受信が完了したらStop Condition発行のためにSSPCON2のPENビット
をセットします。
または、次の送受信を開始するために、RSENビットをセットしてRepeated Start
Conditionを発行します。
(8) 正常にStop ConditionまたはRepeated Start Conditionの発行が完了すれば
割込みが発生することで確認します。