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


PIC−USBIO using BASIC

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

[第128回]



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

前回は2台のPICUSBIO−03を接続して一方をマスターモード、もう一方をスレーブモードで動作させることでスレーブモードのテストを行ないました。
ところが後で気がついたのですがこのときのスレーブモードのプログラムには考え方がおかしいところがありました。
スレーブモードのプログラムでSSPCON1レジスタのbit3−0に0101を設定しました。
SSを使わないスレーブモードの設定です。
前回書きましたようにSSPSTATレジスタのbit7はスレーブモードでは’0’にしなければならないため、その結果としてbit6のCKEも’0’に設定することになりました。
CKE=1のときはSS信号の入力は必須ですがCKE=0のときは使わなくても構わないことになっています([第126回])。
そういうことなのでまずはSSを使わないモードでテストをするつもりでSSPCON1レジスタのbit3−0に0101を設定したのでした。
ところがSSを使わない設定なのにRC6の入力をトリガとして使うというプログラムを書いてしまいました。
このプログラムに限って考えればSSを使わない設定なのですからRC6のラインを結線する必要もありませんでした。
RC6を結線したのは上記のテストのあとでbit3−0を0100にしてSSを使う設定でもテストをしようと考えたからです。
そのことをころっと忘れてしまって前回のようなみっともないプログラムを書いてしまいました。
うーん。
ボケていますなあ(お恥ずかしい)。
つまり前回のテストとしてはRC6の入力をチェックする部分は無くてもよいはずということになります(当然マスターの側もRC6の出力は不要になります)。
そういうことになりますと念のためにもう一度テストを行なわなければなりません。
やれやれ、です。

前回のプログラムを一部書き換えました。

左側のマスターモードのプログラムは70行でPORTCから$00を出力するところをコメント文にしました。
今気が付いたのですが170行も不要でした。
右側のスレーブモードのプログラムも70行でRC6の入力をチェックしているところをコメント行にしました。
そのようにしてから左側のプログラムをRUNコマンドで実行しました。
こちらのプログラムは35行で一旦ブレークします。
それから右側のプログラムを実行しました。
右側(スレーブ側)は左側(マスター)が送信を開始するまで待っています。
このあたりのところは前回説明した通りです。

マスター側でGOTO 40を実行しました。

マスター側もスレーブ側も正しく送受信が行なわれました。
SSを使わなくてもSPI通信が正しく行なわれました。

それではSSを使うモードではどうなるでしょうか。
次はそれをテストしてみることにします。

マスター(左側)は前回のプログラムに戻しました。
RC6からSS信号を送ります。
30行でRC6(SS)=1、70行でRC6=0、170行でRC6=1です。
スレーブ(右側)は60行のみ書き換えました。
SSPCON1に$24を設定しました(<bit3−0>=0100。SSを使うスレーブモードです)。
そのようにして両方のプログラムを実行しました。
先ほどと同じようにここでスレーブはマスターからの送信を待っているようです。

マスター側でGOTO 40を実行しました。

マスター側もスレーブ側も正しく送受信が行なわれました。

が。
よく考えてみるとこれだけではSSを使うスレーブモードのテストとしては不十分です。
本当にSSによる制御が利いているのか?
そこのところはこれだけでは確認したことにはなりません。

SSを使うスレーブモードでマスター側がSS信号を送らなかったらどうなるか?
それを確認してみました。

マスター側は70行と170行をコメント文にしましたからSS信号は30行で’1’を出力したままの状態になります。
スレーブ側はさきほどのSSを使うモードのプログラムのままです。
プログラムを実行したところマスター側には’FF’が受信されましたがスレーブ側は何も変化しませんでした。
スレーブ側はSS信号がアクティブにならないのでSPIモジュールが全く応答しない状態になっていると考えられます。
そのためマスター側は空のデータ(FF)を受信したと考えられます。
やはりSS信号は利いているようです。

この状態でマスター側のプログラムを変更して元通りSS信号を送るように直しました。

70行と170行のコメント文を元通りの実行文に直してRUNコマンドを実行しました。
続いてGOTO 40を実行する直前の状態にしました。

GOTO文を実行しました。

今度はスレーブ側が応答して正しく送受信できました。
これでSSを使うスレーブモードではSS信号による制御が行なわれることが確認できました。

が。
ちょっと待ってください。

CKE=1のときにはSS信号による制御が必須(Not Optional)ということでした([第126回]FIGURE15−6)。
しかし今回のテストはCKE=0のモードです。
CKE=0ではSSは使っても使わなくてもよいということで、確かにそれは確認できました。
ではそもそものCKE=1のときはどうなのかのテストは?

ところがそれができないのですよねえ。
今回のはじめのところに書きましたようにスレーブモードではSSPSTATレジスタのbit7はスレーブモードでは’0’にしなければならない決まりです。
SSPSTATレジスタは前回説明しましたが下に再掲します。

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

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

受信データがデータビットの中央でサンプリングされるということはクロックパルスが正極性のときにはクロックの立ち上がりでSDOからデータが出力されることを意味しています。
それはCKP=0、CKE=0です(MODE1)。
[第122回]参照)
またクロックパルスが負極性のときにはクロックの立ち下がりでSDOからデータが出力されることを意味しています。
それはCKP=1、CKE=0です(MODE3)。
どちらもCKE=0です。
CKE=1のときはSSPSTAT<bit7>=0の条件を満足できません。

どうなっているのでしょうか?
MICROCHIP様。

ちょいと消化不良でありますけれど。
とにかくSPIスレーブモードでの通信もできたことですので、SPIモードについてはここまでということにいたしましょう。
あ。
もうひとつ書いておかなければならないことが残っておりました。
それは次回にて。

PIC−USBIO using BASIC[第128回]
2022.12.13upload

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