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


PIC−USBIO using BASIC

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

[第127回]



●PICUSBIO−03(76)SPIモード(8)スレーブモード(2)PICUSBIO−03を2台接続してテストする

SPIは通信機能ですから単独ではテストできません。
マスターモードではMPC4911と接続してテストをしました。
スレーブモードのテストということになりますと相手はマスターということになります。
前回までのところでマスターモードについて検証してきましたからこれはもうマスターとしてPICUSBIO−03を使ってスレーブにも同じPICUSBIO−03を使ってその両者を接続してSPI通信のテストをするということになりますでしょう。
2台のPICUSBIO−03を接続するためにはどの端子とどの端子を接続するかということから始めなければなりません。
PIC18F13K50の端子図を見ながら確認することにします。
PIC18F13K50の端子図は[第96回]にあります([第117回][第122回]にもあります)が参考までに再掲します。

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

上の端子図を参考にして2台のPICUSBIO−03を下の図のように結線しました。

スレーブのSSはRC6と端子を共有しています。
マスター側はSSに対する出力としては空いている端子ならどのポート端子を使ってもよいのですがここはスレーブに合わせて同じRC6にしました。
RC7(SDO)とRB4(SDI)は互いに相手とは反対の関係になりますから図のようにクロスして結線します。
RB6(SCK)とRB6(SCK)、GNDとGNDを結線すれば接続は完了です。

下はそのように接続した写真です。

2台のPICUSBIO−03の16pinケーブルの必要な線のみを結線しました。
未接続の線は途中でカットしたままにしていますからごちゃごちゃしています。
ラインの観測をするためにCPLDロジアナ(写真右側)もつないでいますから余計にごちゃごちゃしています。

スレーブモードについては前回Data Sheetをざっと読みましたが実際にプログラムを書くためにはSSPSTATレジスタとSSPCON1レジスタのビットの設定が重要です。
SSPSTATレジスタとSSPCON1レジスタは[第120回]にありますが下に再掲します。
下はSSPSTATレジスタです。

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

bit7 SMP:サンプルビット
 SPIマスターモードのとき
 1=受信データはデータ出力タイムの終わりにサンプリングされます。
 0=受信データはデータ出力タイムの中央でサンプリングされます。
 SPIスレーブモードのときはbit7は0にしなければなりません。

ここはマスターモードもスレーブモードもともに0にします。
するとこれだけで両方のモードがほぼ決まってしまいます。

bit6 CKE:SPIクロック選択ビット
 1=クロックがアクティブからアイドルに変化するときに1ビットのデータが送出されます。
 0=クロックがアイドルからアクティブに変化するときに1ビットのデータが送出されます。

bit7を決めたためマスターモードもスレーブモードもともにCKE=0にすることになります。

下はSSPCON1レジスタです。

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

bit5 SSPEN:SSPイネーブルビット
 1=SSPがイネーブル。SCK、SDO、SDI、SSの各端子が使用可能
 0=SSPはディスイネーブル。上記端子は通常のI/O端子として使われる

ここは当然1にします。

bit4 CKP:クロックの極性選択ビット
 1=アイドルステートはHレベル
 0=アイドルステートはLレベル

どちらも選べますがここはノーマルに0を選択します。

bit3−0 SSPM<3:0>:SSPモード選択ビット
 0101=SPIスレーブモード。CLK=SCK端子。SS端子は使用しない。SS端子は通常のI/O端子として使われる
 0100=SPIスレーブモード。CLK=SCK端子。SS端子を使用する。
 0011=SPIマスターモード。CLK=TMR2出力/2
 0010=SPIマスターモード。CLK=Fosc(48MHz)/64
 0001=SPIマスターモード。CLK=Fosc(48MHz)/16
 0000=SPIマスターモード。CLK=Fosc(48MHz)/4

ここはマスターモードは0011、スレーブモードは0101を選択します。

作成したプログラムです。

左側がマスターで右側がスレーブです。
両方ともほとんど同じですから最初にマスターの方のプログラムを作ってそれからそのプログラムをスレーブ側にロードしてそこで必要なところをスレーブ用に書き換えました。
最初にマスターモード(左側)のプログラムから説明します。
10行〜60行は前回までのプログラムとほぼ同じです。
10行はRB6(SCK)が出力、RB4(SDI)が入力ですからTRISBに$BFを設定します(そのほかのビットは入力にしておきます)。
20行はRC6とRC7(SD0)が出力ですからTRISCに$3Fを設定します(そのほかのビットは入力にしておきます)。
30行でPORTCに$40を出力します。
RC6はスレーブのSSにつながっています。
実際に通信を開始するまではこのラインはHにしておきます。
35行はSTOP文です。
ここで一旦ストップして先にスレーブ側をスタートさせます。
ソフトウェアを工夫すればそのようにしなくてもできる方法はあると思いますがこれが簡単な方法です。
スレーブ側がスタートしたら40行から実行を再開します。
40行〜60行は今までのプログラムと同じです。
40行でTimer2を初期設定し50行と60行でCKE=0、CKP=0に設定します。
80行〜160行は前回までのプログラムと基本的には同じことをやっています。
前回までと違うのは100、130、160行でスレーブからデータを受信してそれを表示しているところです。
今回はテストですが実際の通信では正しくデータを受信できるように工夫する必要があります。
今回はデータの前後に送信開始マークSTX(02)と送信終了マークETX(03)を送るようにしました。
簡単なテストですからマスターからは「A」の文字コード($41)を、スレーブからは「a」の文字コード($61)を送るようにしました。

受信側のプログラムの説明です。
10行はRB6(SCK)とRB4(SDI)が入力ですからTRISBに$FFを設定します(そのほかのビットは入力にしておきます)。
20行はRC6(SS)が入力、RC7(SDO)が出力ですから$7Fを設定します(そのほかのビットは入力にしておきます)。
50行でCKE=0を設定します。
60行でCKP=0、スレーブモードに設定します。
80行〜160行は左側のプログラムとほとんど同じですが一部違っているところがあります。
最初は80行でSTX(02)をSSPBUFに書くようにしたのですが正しく送信してくれません。
それでこれは65行に移動しました。
このことについては後の回で書くことになるかと思います。
それから後ろはマスター側のプログラムと同じです。

プログラムを実行しました。

右側で複数回受信データが表示されていますがこれは繰り返しテストをしたためです。
左側に表示されているプログラムの実行に対応しているのは右側では最後の>runから下の表示です。

上のプログラムの実行時に観測したCPLDロジアナの波形です。

PROBE0はRC6です。
PROBE1はRB6(SCK)です。
PROBE2はRC7(マスターのSDO)です。
PROBE3はRB4(マスターのSDI)です。
データはクロックの立ち上がりに同期して変化しています。
SDOとSDI(スレーブからのSDO)はともに同時にクロックに同期して変化しています。
データは最初のSTX(00000010)です。

2番目のデータです。

PROBE2は$41(01000000)です。
PROBE3は$61(01100000)です。

3番目のデータです。

PROBE2とPROBE3はどちらもETX(00000011)です。

PIC−USBIO using BASIC[第127回]
2022.12.12upload

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