SPI通信
同期式シリアル通信の一つに、SPI通信がある。Serial Peripheral Interface の略で、I2Cとともに、基板内の通信などに使われている。
主な用途は、基板内のEEPROMや、各種センサ類、A/Dコンバータ、D/Aコンバータなどとの接続である。SPIインターフェースを持ったデバイスを、少ない信号線で複数個接続することができるため、I2Cとともに、よく使われている。
SDカードとの通信にも(限定的ではあるが)用いられている。
SPIの概要
SPI通信はSCK, SDO, SDIの3本の信号線を用いる。I2Cと同様に、バス接続が可能であり、一つのマスタに対して、複数のスレーブを接続することができる。
マスタのSDO出力は、スレーブのSDIへ接続する。逆にスレーブのSDOはマスタのSDIへ接続する。
クロック(SCK)はマスタが出力するものを、スレーブに接続する。
SPIでは、バス上の複数のスレーブのうち、通信相手を特定するためにSS(Slave Select)信号を用いる。Lアクティブの信号であり、通信する相手のSS端子をLレベルにする。
SPI通信は、クロックに同期して、送信データをSDO端子から送り出し、同時にSDI端子から受信データを受け取る。1バイト送信すると同時に1バイト受信する、というのが基本動作である。
データはMSBファーストで送り出され、同時にMSBから順に受信も行う。8個のクロックにより、マスタとスレーブのシフトレジスタの内容が入れ替わることになる。
SPI通信のタイミングを下に示す。
マスタはSS信号をL(アクティブ)にして、クロックを8個発生する。同時に送信データをSDO信号に出力し、SDI信号から受信データを取得する。8個のクロックで1バイトの送信と受信とが同時に行われる。
SPI通信には細かな規定がなく、正しく通信するためには、マスタとスレーブとで通信条件を取り決めておく必要がある。上の図でいえば、無通信時のSCK信号のレベル、データをシフトするタイミングはSCKの立ち上がりか立ち下がりなのか、を取り決めておかなければならない。
SH7085のSCIとSPI通信
SH7085内蔵のSCIはクロック同期式通信に用いることもできる。
SPI通信はクロック同期式シリアル通信の一種であり、SH7085のSCIを適切に設定することにより、SPI通信を行うことができる。
ここでは、調歩同期式通信の時と違う部分に注目して解説する。
・SCSCR(シリアルコントロールレジスタ)
送信/受信動作の禁止/許可、割り込みの禁止/許可を設定する。
また、CKEビットでクロックソースの設定を行う。クロック同期式では、内部クロックを選択した場合にSCK端子はクロック出力になる。
・SCSMR(シリアルモードレジスタ)
ビット6~2の設定は調歩同期式通信の時にのみ有効で、クロック同期式の時は無効である。
・SCBRR(ビットレートレジスタ)
SCSMR.CKSビットと組み合わせて、通信速度の設定を行う。
クロック同期式モードでは
B:ビットレート(bit/s)
N:SCBRRの設定値
Pφ:20MHz
n:SCSMR.CKSの設定値(0~3)
とすると、
という関係が成立する。
例えばPφ=20.0MHz、n=0の時、384kbit/sの速度にする場合
N=12となる。
・SCSDCR(シリアルディレクションコントロールレジスタ)
シリアルデータを送受信する際の、LSBファースト/MSBファーストの設定を行う。
SPI通信ではMSBファーストを用いる。(調歩同期式では、LSBファーストが標準的)
これらのレジスタを適切に設定することで、SH7085を用いてSPI通信を行うことができる。
SH7085でのSPI通信は、下図のようなイメージになる。
SCIのTxD出力は、SPIスレーブのSDIへ接続し、スレーブへの送信データとなる。
逆に、SPIスレーブのSDOはSCIのRxD入力に接続し、スレーブからの受信データとなる。
送受信手順
・1バイト送信
1バイト送信の手順を次に示す。
この手順は、調歩同期式通信の時と同じである。
- SCSSR.TDRE = 1(TDRエンプティ)になるまでまつ
- SCTDRに送信データを書き込む
- TDREフラグを0クリアする。TDREは自動的にクリアされることがないため、ここでクリアする必要がある。
複数バイトの送信を行う場合は、上の手順を必要なだけ繰り返す。
このフローチャートを抜けた状態では、TxD信号線上はまだデータが送られている途中である可能性がある。本当に送信が完了したことを検出したい場合は、SCSSR.TENDビットを確認する。
・1バイト受信
この手順も、調歩同期式通信の時と同じである。
- SCSSR.RDRF = 1(受信データフル)になるまで待つ
- SCRDRから受信データを読み出す
- SCSSR.RDRFフラグを0クリアする
複数バイト受信する場合は、上の手順を必要なだけ繰り返す。
・1バイト送受信
クロック同期式シリアル通信において、送信の場合も受信の場合も、クロックは必要である。
SH7085がクロックを出力するように設定した場合においても、受信動作においてクロックは必要である。しかしSCIを受信許可の状態に設定しただけでは、クロック(SCK)は発生しない。
受信のためのクロックを出力するには、送信動作をしなければならないので、送信と受信を同時に行う手順が一般的である。受信だけをしたい場合は、通信相手に悪影響のないダミーデータを送信し、受信を行う。
この手順は、学習用に簡略化しているため、エラー処理が含まれていないが、信頼性の高いプログラムには、エラー処理が必須である。
SH7085のクロック同期式通信では、エラーの扱いは次のようになっている。
- オーバーランエラー:RDRF = 1(受信データフル)の状態で、新たなシリアル受信を完了した時に発生する
- フレーミングエラー:クロック同期式通信では発生しない
- パリティエラー:SH7085のSCIを用いたクロック同期式通信では、パリティを付加することはできない。よってパリティエラーは発生しない。