PIC−USBIO using BASIC
〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜
USBインターフェースを内蔵したPICを使ってWindowsパソコンで外部回路を制御するための各種I/O基板の製作記事です。
〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜
[第143回]
●PICUSBIO−03(92)I2Cモード(14)スレーブモード(2)クロックストレッチング
あけましておめでとうございます。
本年もよろしくお願いいたします。
前回からの続きになります。
スレーブモードの説明の途中からです。
クロックストレッチングは「クロックの引き伸ばし」というような意味になると思います。
下はクロックストレッチングの説明です。
[出典]Microchip Technology Inc. PIC18F13K50/14K50 Data Sheet
スレーブモードのデータ送信では自動的にクロックストレッチング機能が働きます。
SSPCON2レジスタのSENビットによって受信中にクロックストレッチングを有効にすることができます。
受信モードでのクロックストレッチング(SEN=1のとき)
ACK信号の終わり、9番目のクロックの下がりエッジで、もしそのときにBFビットがセットされていれば、SSPCON1レジスタのCKPビットは自動的にクリアされ、SCL端子から’L’が出力されます。
CKPビットが’0’クリアされるとSCLラインは’L’レベルになります。
ユーザーが受信を続けるためには次の受信の前にCKPビットをプログラムでセットしておく必要があります。
SCLラインを’L’にしておくことでユーザーはSSPBUFの値を読んで必要な処理を終えるまでの間、マスターが次のデータを送信するのを待たせておくことができます。
そうすることでバッファオーバーランを防ぐことができます。
Note1: 9番目のクロックが下がるよりも前にユーザーがSSPBUFを読むとBFビットがクリアされ、その場合にはCKPビットはクリアされずクロックストレッチングは行なわれません。
これはスレーブの処理速度が十分速くてマスターを待たせる必要がない場合についての説明だと思います。
Note2:CKPビットはBFビットの状態に関係なくソフトウェアでセットすることができます。
ユーザーはオーバーフローを起こさないために次のデータの受信手続きよりも前にBFビットをクリアするプログラムになるように気をつけるべきです。
送信モードでのクロックストレッチングの説明です。
[出典]Microchip Technology Inc. PIC18F13K50/14K50 Data Sheet
スレーブ送信モードでは9番目のクロックの下がりエッジでCKPビットが(自動的に)クリアされることでクロックストレッチングが行なわれます。
送信モードでのクロックストレッチングはSENビットに関係なく行なわれます。
ユーザーが送信を続けるためには次の送信の前にCKPビットをプログラムでセットしておく必要があります。
SCLラインを’L’にしておくことでユーザーはSSPBUFに送信データをロードし終わるまでの間、マスターが次のデータを受信するのを待たせておくことができます。
Note1: 9番目のクロックが下がるよりも前にユーザーがSSPBUFに次の送信データをロードするとBFビットがセットされ、その場合にはCKPビットはクリアされずクロックストレッチングは行なわれません。
これはスレーブの処理速度が十分速くてマスターを待たせる必要がない場合についての説明だと思います。
Note2:CKPビットはBFビットの状態に関係なくソフトウェアでセットすることができます。
下はクロックの同期とCKPビットの説明です。
[出典]Microchip Technology Inc. PIC18F13K50/14K50 Data Sheet
CKPビットがクリアされるとSCL出力は強制的に’0’になります。
しかしCKPビットをクリアしてもSCLラインが’L’になるまでSCL出力を’L’にはできません。
それはわかるのですがTherefore以下の文はちょっと意味不明のところがあります。
以下の文では’low’が抜けているようですし図では他のスレーブは存在していないのに原文ではいきなり’other devices’が出てきます。
This ensures以下で「SCLのH期間が保たれる」と書いてありますがそれを言うにはまだ不足しているところがあります。
マスターがSCLラインを’L’にするまではスレーブ側で’L’にすることはできないのでSCLの’H’期間は規格値を保つことはできますが、この図を見てもまた説明文を読んでも、マスターがSCLを’H’にしてもスレーブがCKPを’1’にするまではSCLは’H’にはなりません。
するとSCLは半端に’H’になってしまうので’H’が規格値に満たない可能性があります。
その疑問をクリアするためには以下の文を補う必要があります。
[出典]Microchip Technology Inc. PIC18F13K50/14K50 Data Sheet
原文はPIC18F13K50 Data Sheetのマスターモードの説明のところにあります。
この文は当初は意味不明に思えたのでマスターモードのところではとりあえず省略していたのですが、ここまできてやっと意味が通じました。
Arbitrationは調停というように訳されますがClock Arbitrationは「クロックの調整」とでも訳すとよいのではと思います。
「クロックの調整」はマスターが受信、送信、リピーテッドスタート/ストップコンディションでSCLラインを開放する(SCLをフロート’H’にする)ときに発生します。
マスターがSCL端子をフロート’H’にするようにしたとき、SCLラインが本当に’H’になるまでボーレートジェネレータはカウントを停止します。
SCLラインが本当に’H’になったときボーレートジェネレータはSSPADDの値をリロードしてカウントを開始します。
この機能によってクロックが外部デバイスによって’L’にされたときにSCLクロックのH期間は少なくともボーレートジェネレータが1回カウントロールオーバーする時間になります。
PIC−USBIO using BASIC[第143回]
2023.1.1upload
前へ
次へ
ホームページトップへ戻る