2022.12.7
前へ
次へ
ホームページトップへ戻る


PIC−USBIO using BASIC

〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜
USBインターフェースを内蔵したPICを使ってWindowsパソコンで外部回路を制御するための各種I/O基板の製作記事です。
〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜

[第122回]



●PICUSBIO−03(71)SPIモード(3)マスターモード

前回からの続きです。
SPIモードにはマスターモードとスレーブモードがありますが、まずはマスターモードから読み解いていきます。
下はSPIのI/O端子を使用可能にするための説明です。

[出典]Microchip Technology Inc. PIC18F13K50/14K50 Data Sheet

シリアルポート(SPI)を使用可能にするためにはSSPCON1レジスタのSSPイネーブルビットSSPENをセットしなければなりません。
SSPCON1レジスタは[第120回]で説明しました。
SPIモードをリセットするか再設定するにはSSPENビットをクリアしてSSPCON1レジスタを再設定してからSSPENビットをセットします。
この設定によってSDI、SDO、SCK、SS端子がシリアルポート端子になります。
各端子がシリアルポートの端子として正しく機能するためにその向きを(プログラムでTRISレジスタに対して)次のように設定する必要があります。
●SDIはSPIモジュールによって自動的にコントロールされます
●SDOは対応するTRISレジスタのビットを0にしなければなりません
●SCKは対応するTRISレジスタのビットを0にしなければなりません(マスターモード)
●SCKは対応するTRISレジスタのビットを1にしなければなりません(スレーブモード)
●SSは対応するTRISレジスタのビットを1にしなければなりません(スレーブモード)

SDIの各入出力はI/Oポートと端子を共用しています。
PIC18F13K50で各端子の共有について確認するための端子図は[第96回]にあります([第117回]にもあります)が参考までに再掲します。

[出典]Microchip Technology Inc. PIC18F13K50/14K50 Data Sheet

SDIはRB4とpin13を共有しています。
SDOはRC7とpin9を共有しています。
SCKはRB6とpin11を共有しています。
SSはスレーブモードではRC6とpin8を共有しています。
SSはマスターモードにはありませんからマスターモードで使用するときは汎用I/OポートをスレーブのSSに対する出力として使います。

15.2.4はSPIモードの接続例についての説明です。
Figure15−2はマイクロコントローラ間の接続例です。
マスターコントローラ(Processer1)はSCK信号を送ることでデータ送信を開始します。
データは両方のシフトレジスタからプログラムで設定されたクロックエッジで送出され、クロックの反対側のエッジでラッチされます。
両方のマイクロコントローラは同じクロック極性(CKP)にするようにプログラムされなければなりません。
そうすることで両方のマイクロコントローラは同時にデータの送受信が行なわれるようになります。
(送受信されるデータが)意味のあるものか(またはダミーデータなのか)はアプリケーションソフトウェアによります。
それには以下の場合が考えられます。
●マスターがデータを送信する − スレーブはダミーデータを送信する
●マスターがデータを送信する − スレーブもデータを送信する
●マスターがダミーデータを送信する − スレーブはデータを送信する

下はマスターモードの説明です。

[出典]Microchip Technology Inc. PIC18F13K50/14K50 Data Sheet

マスターはいつでもデータの送信を開始できます。
なぜならそれはSCKによってコントロールされているからです。
マスターはスレーブ(Processer2、FIGURE 15−2)がデータを送信するタイミングをソフトウェアで決めることができます。

マスターモードではデータの送受信はSSPBUFへデータを書き込むことで開始されます。
SPIが受信のみのモードであるときにはSDOの出力を無効にすることができます(その向きを入力に設定することで)。
SSPSRレジスタはSDI端子から入力されるデータをプログラムで決められたクロックレートでシフトします。
受信データは8ビット受信される都度SSPBUFレジスタにロードされます(割り込みフラグとステータスビットがセットされます)。

SSPCON1レジスタのCKPビットの設定によってクロックの極性を選択することができます。
FIGURE15−3、FIGURE15−5、FIGURE15−6はSPI接続の波形図です(データは最上位ビットから送られます)。
FIGURE15−5、FIGURE15−6はスレーブモードの図なので今は省略します。
マスターモードではSPIクロックレート(ビットレート)は下記のうちからユーザープログラムで決めることができます。
●Fosc/4(12Mbps、1/12μsec)
●Fosc/16(3Mbps、1/3μsec)
●Fosc/64(3/4Mbps、4/3μsec)
●Timer2出力/2

Figure15−3はマスターモードの波形図です。
CKEビット=1のときSDOデータはSCKのクロックエッジよりも前に確定します。
図に示すSDI入力のサンプリングはSSPSTATレジスタのSMPビットの設定によります。
SSPSTATレジスタは[第120回]で説明しました。
受信データがSSPSRからSSPBUFにロードされるタイミングを図に示しています(一番下のSSPSR to SSPBUF)。

上の波形図では上部に4つのクロック波形が描かれていて、右側に4 Clock Modesと書かれています。
SPIの一般的な説明を見ますとMODE0〜MODE3とかMODE0,0、MODE0,1、MODE1,0、MODE1,1というような名前でSPIモードについて解説しているものを多く見ます。
上の波形図も同じことについて説明しているようなのですが実にわかりにくい描き方です。
上の4つの波形とその下のSDO、SDIとを組み合わせて考えないと何を説明しているのか意味不明になってしまいます。
まずは4つの波形の極性について。
SSPCON1レジスタのCKPビット=0のときCLKがない状態(アイドル)はLレベルです(波形の上から1、3番目)。
CKPビット=1のときCLKがない状態(アイドル)はHレベルです(波形の上から2、4番目)。
問題はSSPSTATレジスタのCKEビットです。
CKEビット=0のときCLKがアクティブになるエッジでSDOからデータが送出されます。
上の図ではSDO(CKE=0)の波形が後ろにずれてしまっているので誤解してしまいます。
CKEビット=1のときCLKがアクティブからアイドルになるエッジでSDOからデータが送出されます。
SDO(CKE=1)の波形も後ろにずれてしまっているのでわかりにくいです。
一般にSPIモードの説明ではCPOLとCPHAという名称を使うのですがどういうわけかPICのSPIモードの説明ではそれに代わるものとしてCKPとCKEを使っています(ひょっとすると商標権か何かの関係かも)。
CKPは波形の極性でこれは一般的なSPIモードの説明でのCPOLと同じです。
それならばCKEはCPHAと同じかというとどうもそれは違うようです。
実はPIC18F13K50のData SheetのSPIの説明が余りにわかりにくいのでプログラムを作って実際に信号を出力して波形を確認してみました。
その結果わかったことですがCKEはCPHAとロジックが逆になっているようです。
それと一般的なSPIのモードでは入力データのサンプリングを基準にして説明しているようですが、PICの場合にはデータの出力タイミングを基準にしています。
ですからそのあたりもずれがあるようですが、ここでは入力についてはとりあえず考えないで出力のタイミングだけでモードを整理してみました。

MODE0(MODE0,0) CPOL=0(CKP=0)、CPHA=0(CKE=1) クロックはアクティブH(正極性)、クロックがH→LのときデータOUT
MODE1(MODE0,1) CPOL=0(CKP=0)、CPHA=1(CKE=0) クロックはアクティブH(正極性)、クロックがL→HのときデータOUT
MODE2(MODE1,0) CPOL=1(CKP=1)、CPHA=0(CKE=1) クロックはアクティブL(負極性)、クロックがL→HのときデータOUT
MODE3(MODE1,1) CPOL=1(CKP=1)、CPHA=1(CKE=0) クロックはアクティブL(負極性)、クロックがH→LのときデータOUT

このように整理したらSPIモードが理解できるかというとやっぱりこれだけではわかりませんでしょう。
まずはマスターモードを理解するために実際にスレーブ型の回路をPICUSBIO−03に接続して、その回路に(マスターモードで)データを送出するプログラムを作って試してみるのが一番の近道かと思います。

こんなところに書いてありました(上のところを書いたあとで発見しました)。
やっぱりData Sheetはよく読むべきです。



上の表の下には「入力データのサンプリングにはSMPビットの設定が必要」と書かれています。
SMPビットはSSPSTATレジスタのbit7です([第120回]参照)。

PIC−USBIO using BASIC[第122回]
2022.12.7upload

前へ
次へ
ホームページトップへ戻る