MSSPモジュールのSPIモードの使い方


【MSSPモジュールの概要】

MSSP(Master Synchronous Serial Port)モジュールはボード内の他のデバイスICと
高速にシリアル通信をするためのモジュールで、SPIとI2Cという2種類の動作モード
で使うことができます。

・SPI(Serial Peripheral Interface)
  比較的簡便なシリアル通信で2つのシフトレジスタが環状に接続されてその間を
  シリアルで通信する構成となります。従って送信と受信が同時に行われることに
  なります。
・I2C(Inter-Integrated Circuit)
  フィリップス社が提唱するシリアル通信方式で、3個以上のデバイスをパーティー
  ラインで接続してマスター・スレーブの関係を構成して通信をします
  PIC18FシリーズのI2Cモードでは下記の動作モードで使うことができます。
     ・マスターモード
     ・マルチマスターモード
     ・スレーブモード

【MSSPのSPIモードでの使い方】

 MSSPモジュールをSPIモードで使うときの内部構成は、下図のようになります。
外部接続信号としては、SDO、SDI、SCKの3本が基本となりますが、これ以外に
SS信号が追加されていて、スレーブ選択に使います。
   ・SDO(Serial Data Out)
   ・SDI(Serial Data In)
   ・SCK(serial Clock)
   ・SS(Slave Select)





基本の動作は、マスターとスレーブで大きく異なり、マスターの場合にはクロック
信号の供給元となり、スレーブの場合にはクロックは外部のマスタから供給される
ものとして動作します。
データは、8ビットのシフトレジスタであるSSPSRレジスタへのシフト入出力として
行われます。
スレーブの場合には、SS信号で入出力の許可/禁止が行われますので、選択
されたスレーブだけが通信するようにすることができます。


【基本の通信の信号シーケンス】

 SPIモードでのマスター、スレーブの接続は、基本の構成は下図のようになります。
単純な接続でシフトレジスタを直列に接続し環状にしただけという形になります。





 この接続構成の元での通信のタイミングは下図のようになります。

《マスタ側の時》
 下図はマスター側の動作タイミングで、マスタから送受信するときには、下記
手順となります。(送信も受信も同じタイミングとなる)
 (1) SSPBUFに送信データを書き込む
 (2) マスタからクロックが出力され、同時にデータも上位ビットから出力される。
    クロックとデータのタイミングは4通りの設定ができますが、スレーブ側と
    合わせておく必要があります。
 (3) マスタ側は、クロックの真中で、入力データをシフトレジスタの取り込みます。
 (4) 8ビットのデータの送信、受信が完了するとSSPIFビットが1となります。

マスタモードの時のクロック速度は、4種類から選択でき、40MHzクロックのときの
最高速度は10MHzとなります。
また出力ピンを入力モードにしておけば、外部への出力は出ませんので、受信
だけの動作を行うことができます。







《スレーブ側の時》
 スレーブの場合には、クロックのモードによって少しタイミングが異なります。
下図は、CKEビットが0でデータとクロックが同じタイミングの場合です。この場合には
クロックの最初のエッジで出力が出ます。そしてクロックの真中で受信データを取り込
みます。8ビットの受信が完了した時点でSSPIFビットが1となります。
いずれの場合にも、SS信号がLowになっているスレーブだけがこの動作をしますが、
この場合にはSS信号とクロック、データが同時に開始になっても問題ありません。





下図はスレーブで、CKEビットが1の場合のタイミングです。この場合には、出力
データは常時出ていて、クロックで次にシフトするという動作になります。
従って受信もクロックの開始側のエッジで取り込まれます。8ビットのデータの送信
が完了した時点でSSPIFビットが1となります。
こちらの動作モードの場合には、SS信号が1/2クロック以上早めに出ている
必要があります。








【MSSP制御用レジスタの内容】

SPIモードで使うときのMSSPモジュールの制御用レジスタは、SSPSTAT、SSPCON1
の2つです。 SSPCON2レジスタはI2Cモードでのみ使い、SPIモードの時には使いません。
それぞれの詳細は下図となります。

《SSPSTATレジスタ》
 基本的な動作モードの設定と、受信バッファのレディーチェック用のビットがあります。



《SSPCON1レジスタ》
 SPIモードの時のSSPCON1レジスタの内容です。基本モードの設定と
クロックの極性切替を行います。





【アセンブラでの使い方】

2つのPIC同士をSPIで接続し、マスタとスレーブ間の通信を行った例題です。
マスタ側は、USARTでパソコンと接続し、パソコンからのコマンドにより動作
を開始します。
マスタは、「w」コマンドを受信すると30Hから5FHまでのASCII文字をスレーブ
に送信し、同時に、スレーブから受信したデータをパソコンに送信します。

 スレーブ側は、液晶表示器を組み込み、割込みによりSPIで受信した内容を
表示すると同時に、マスタに返送します。
受信したデータが改行コードの場合には、液晶表示器を全消去するとともに
返送するデータを初期値(30H)とします。

下記がマスタ側のプログラムリストの主要部です。
(a) 初期設定とメイン部





(b) SPI送受信処理部
 スレーブ側の動作時間を確保するため、送信する間隔を確保しています。
特に、全消去とカーソルホームは数msecの時間が必要です。
送信だけの場合と、送信と同時に受信もする場合のサブルーチンを分けて
います。




下記がスレーブ側のプログラムリストです。SPIは割込みを使ったプログラム
になっていますが、割込みは最初だけで、一度通信を始めたら割込み処理
の中で、通信を完了させています。

(a) 初期設定とメインループ部





(b) 割込み処理部
 受信データが0Dの時は、液晶表示器を全消去し、返送データ
を初期値(30H)に戻しています。







 上記のマスタ側とスレーブ側のプログラムリストです。ダウンロード
してお使い下さい。

★ SPI通信マスタ側プログラムファイル(spimaster1.asm)

★ SPI通信スレーブ側プログラムファイル(spislave1.lzh)
  (spislave1.asm + lcdlib18.asm)


【C言語での使い方】

CCS社のPCHコンパイラで用意されているSPI用の組込み関数には
下表のようなものがあります。

組込み関数と書式 機能内容 と 使用例
setup_spi(mode)

SSPをSPIモードに初期化する。
modeには下記のような4組が用意されていて
これらのORを取ったパラメータとします。
 (1) SPI_MASTER   SPI_SLAVE

 (2) SPI_L_TO_H    SPI_H_TO_L
 (3) SPI_CLK_DIV_4  SPI_CLK_DIV_16
    SPI_CLK_DIV_64 SPI_CLK_T2
 (4) SPI_SS_DISABLED
《例》
 setup_spi(SPI_MASTER | SPI_L_TO_H |
          SPI_CLK_DIV_16);

return=spi_data_is_in( )

データ受信が完了していればTRUE(1)を返し、
未完了であればFALSE(0)を返します。
《例》
  while(!spi_data_is_in() && input(PIN_B2));
  if (spi_data_is_in())

indata=spi_read(outdata)
 indata:入力データINT型
 outdata:出力データINT型

SSPBUFから受信データを取り出す。
もし受信データが無ければ受信するまで待つ。
受信するときに送信データがあれば
outdataとして同時に出力する。
《例》
   if (spi_data_is_in())
   new_data=spi_read();

spi_write(value)
 valueは送信データINT型

valueを送信データとしてSSPBUFに書き込みSPI送信する。
 <例>
   spi_write( data_out);
   data_in = spi_read();



【実際の使用例】




  トップページへ