PIC−USBIO using BASIC
〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜
USBインターフェースを内蔵したPICを使ってWindowsパソコンで外部回路を制御するための各種I/O基板の製作記事です。
〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜
[第142回]
●PICUSBIO−03(91)I2Cモード(13)スレーブモード
とうとう大晦日になってしまいました。
なんとか年内に終らせようと思ったのですが、なかなか予定通りには進まないものです。
前回までI2Cマスターモードについて説明をしてきました。
今回からはスレーブモードについて説明をしていきます。
下はPIC18F13K50 Data Sheetのスレーブモードの説明です。
[出典]Microchip Technology Inc. PIC18F13K50/14K50 Data Sheet
スレーブモードではSCL端子とSDA端子は向きを入力に設定します(これはマスターモードでも同じです)。
MSSPモジュールは入力の状態でも必要があればデータを出力します(スレーブ出力)。
I2Cスレーブモードハードウェアはアドレスが一致すると割込みを発生します。
ユーザーはスタート、ストップによる割込みを選択することもできます。
アドレスが一致したとき、およびアドレス一致後にデータを受け取ったときは、ハードウェアは自動的にアクノリッジ(ACK)を送出しそのときSSPSRレジスタにあるデータをSSPBUFにロードします。
おお。
ここの記述は重要です。
この説明を読むまでは私はスレーブモードではACKを送信するタイミングをどうするのだろうと心配していました。
なるほど。
スレーブモードの場合にはACKは自動的に送出されるのですね。
それなら世話なしです。
安心しました。
以下の場合にはMSSPモジュールはACKを送りません。
・SSPSTATレジスタのBFビット(バッファフルビット)がセットされている状態でデータを受信した(その前に受信したデータがまだ引き取られていないときに次のデータを受信した)。
・SSPCON1レジスタのSSPOVビット(オーバーフロービット)がセットされている状態でデータを受信した。
上記の場合にはSSPSRレジスタの値はSSPBUFにはロードされませんがPIR1レジスタのSSPIFビットはセットされます。
BFビットはSSPBUFを読むことでクリアされますがSSPOVビットはソフトウェアでクリアする必要があります。
下はアドレスについての説明です。
[出典]Microchip Technology Inc. PIC18F13K50/14K50 Data Sheet
MSSPモジュールがイネーブルになるとモジュールはスタートコンディションが来るのを待ちます。
スタートコンディションに続く8ビットのデータはSSPSRレジスタにシフト入力されます。
全ての入力ビットはSCLクロックの立ち上がりエッジでサンプリングされます。
SSPSRのbit7〜bit1はSSPADDレジスタの値と比較されます。
その比較は8番目のSCLクロックの下がりエッジで行なわれます。
アドレスが一致してそのときにBFビットもSSPOVビットもセットされていなければ以下が実行されます。
1. SSPSRレジスタの値がSSPBUFにロードされます。
2. BFビット(バッファフルビット)がセットされます。
3. ACKパルスが出力されます。
4. 9番目のSCLクロックの下がりエッジでMSSP割込みフラグビット(PIR1のSSPIF)がセットされます。
(このとき割込みが許可されていれば割込みが発生します)
下はSSPADDレジスタです。
[出典]Microchip Technology Inc. PIC18F13K50/14K50 Data Sheet
7bitアドレスのスレーブモードのときbit7−1は7bitアドレスになります。
bit0は使われません。
[注記]アドレスを比較するときに実際にはSSPADDレジスタだけではなくてアドレスの一部のビットをマスクするためのレジスタSSPMSKレジスタが使われますが初期設定ではSSPADDの値はマスクされずそのままの値として扱われます。
ここではSSPMSKレジスタについては説明を省略します。
スレーブモードの受信の説明です。
[出典]Microchip Technology Inc. PIC18F13K50/14K50 Data Sheet
アドレスデータのビット0(R/Wビット)が’0’ならば、そしてアドレスが一致していたらSSPSTATレジスタのR/Wビットがクリアされます。
受信したアドレスデータはSSPSRからSSPBUFにロードされSDAラインは’L’になります(ACK)。
アドレスデータの受信がオーバフロー状態になるとNACKが出力されます。
オーバーフローはSSPSTATレジスタのBFビットかSSPCON1レジスタのSSPOVビットがセットされているときに発生します。
データを受信するとMSSP割込みが発生します。
PIR1レジスタの割込みフラグビットSSPIFはソフトウェアでクリアする必要があります。
SSPCON2レジスタのSENビットがセットされているとSCLラインが’L’になります(クロックストレッチング)。
SCLラインはSSPCON1レジスタのCKPビットをセットすることで開放されます。
おお。
ここも気にしていたところでした。
スレーブの処理に時間がかかって受信が間に合わないときにはどうするのだろうとちょっと心配していました。
送信の説明です。
[出典]Microchip Technology Inc. PIC18F13K50/14K50 Data Sheet
アドレスデータのビット0(R/Wビット)が’1’ならば、そしてアドレスが一致していたらSSPSTATレジスタのR/Wビットがセットされます。
受信したアドレスデータはSSPSRからSSPBUFにロードされます。
9番目のクロックでACKパルスが送出され、SENビットの値に関係なくSCLラインが’L’になります(クロックストレッチング)。
クロックストレッチングの状態ではマスターはスレーブが送信データの準備ができるまで次のクロックを出力することができません。
送信データはSSPBUFに書き込む必要があります。
それは同時にSSPSRレジスタにもロードされます。
その後でSSPCON1レジスタのCKPビットをセットすることでSCLラインは開放されます。
8ビットのデータの各ビットはSCLクロックの下がりエッジでシフトアウトされます。
SDAラインに出力する信号はSCLが’H’の間保持されます。
マスターから送出されるACKパルスは9番目のSCLクロックの上がりエッジでラッチされます。
もしSDAラインが’H’なら(つまりNACKなら)データの送信は完了します。
ここです。
ここに書いてありました。
マスターの受信モード(スレーブの送信モード)ではマスターが受信データの終わりにNACKを送るとそれでスレーブの送信は終了する、と書かれています。
ここで”end”ではなくて”complete”と書かれているのがやや奇妙に思えますがおそらく’NACK’が来ても異常終了ではなくて正常に送信を完了するという意味合いなのだろうと思います。
その次の文のwhen the ack...は多分’not’が落ちています。
’not ACK’でなければその後ろの文と辻褄が合いません。
そういうことにして、続けます。
上記の場合、スレーブによってNACKがラッチされると、スレーブのロジックはリセットされ(SSPSTATレジスタがリセットされ)スレーブは次にスタートビットが来るのをモニタします。
もしACKがラッチされたなら次の送信データをSSPBUFレジスタにロードしなければなりません。
そしてCKPビットをセットすることでSCLラインを開放しなければなりません。
データを送信するごとにMSSP割込みが発生します。
SSPIFフラグビットはソフトウェアでクリアしなければなりません。
SSPSTATレジスタを読むことで現在の状態を知ることができます。
SSPIFビットは9番目のSCLクロックの下がりエッジでセットされます。
スレーブモードについてはもう少し続きがあるのですが長くなってしまいますので今回はここまでとします。
今年一年拙文にお付き合いいただき有難うございました。
来年もよろしくお願いいたします。
よいお年をお迎えください。
PIC−USBIO using BASIC[第142回]
2022.12.31upload
前へ
次へ
ホームページトップへ戻る