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バイト送信の手順を次に示す。

この手順は、調歩同期式通信の時と同じである。

  1. SCSSR.TDRE = 1(TDRエンプティ)になるまでまつ
  2. SCTDRに送信データを書き込む
  3. TDREフラグを0クリアする。TDREは自動的にクリアされることがないため、ここでクリアする必要がある。

複数バイトの送信を行う場合は、上の手順を必要なだけ繰り返す。

このフローチャートを抜けた状態では、TxD信号線上はまだデータが送られている途中である可能性がある。本当に送信が完了したことを検出したい場合は、SCSSR.TENDビットを確認する。

 

・1バイト受信

1バイト受信の手順を次に示す。

この手順も、調歩同期式通信の時と同じである。

  1. SCSSR.RDRF = 1(受信データフル)になるまで待つ
  2. SCRDRから受信データを読み出す
  3. SCSSR.RDRFフラグを0クリアする

複数バイト受信する場合は、上の手順を必要なだけ繰り返す。

 

・1バイト送受信

クロック同期式シリアル通信において、送信の場合も受信の場合も、クロックは必要である。

SH7085がクロックを出力するように設定した場合においても、受信動作においてクロックは必要である。しかしSCIを受信許可の状態に設定しただけでは、クロック(SCK)は発生しない。

受信のためのクロックを出力するには、送信動作をしなければならないので、送信と受信を同時に行う手順が一般的である。受信だけをしたい場合は、通信相手に悪影響のないダミーデータを送信し、受信を行う。

 

この手順は、学習用に簡略化しているため、エラー処理が含まれていないが、信頼性の高いプログラムには、エラー処理が必須である。

SH7085のクロック同期式通信では、エラーの扱いは次のようになっている。

  • オーバーランエラー:RDRF = 1(受信データフル)の状態で、新たなシリアル受信を完了した時に発生する
  • フレーミングエラー:クロック同期式通信では発生しない
  • パリティエラー:SH7085のSCIを用いたクロック同期式通信では、パリティを付加することはできない。よってパリティエラーは発生しない。

 

Copyright © 2012-2024 ミームス(MEMEs)のサポートページ All rights reserved.
This site is using the Desk Mess Mirrored theme, v2.5, from BuyNowShop.com.