PIC−USBIO using BASIC
〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜
USBインターフェースを内蔵したPICを使ってWindowsパソコンで外部回路を制御するための各種I/O基板の製作記事です。
〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜
[第130回]
●PICUSBIO−03(79)I2Cモード
前回までSPI通信について書いてきました。
今回からはI2C通信です。
I2CはSPIとよく似た仕組みのシリアル通信です。
8ビットのシフトレジスタを送信と受信で共用するところなどはSPIと変わりません。
レジスタなどもSPIで使うレジスタをそのまま使います。
SPIでは送信と受信は同時に行なわれますがI2Cでは送信と受信は同時には行なわれません。
送信モードで通信するか受信モードで通信するかはマスターが最初に送るコマンドで指定します。
通信はマスターがSTART信号を送ることで開始されSTOP信号を送ることで終了します。
I2Cについては5年ほど前に書いています。
新マイコン独立化セットに使うRTC(リアルタイムクロック)としてDS1307を使うことを決めたときの記事です。
DS1307は通信にI2Cを使っています。
同記事はDS1307のData SheetをもとにしてI2Cについて仕様や使い方をまとめたものです。
私としてはわかりやすくまとめたつもりです。
PICのData Sheetは今ひとつわかりにくいように思えます。
前回までのSPIについてもそうなのですがこれから書いていくことになりますI2Cについてもいきなり読むとちょいと理解しにくいところがあるかもしれません。
まずはDS1307のI2C通信についての記事(下記リンク)をお読みいただいてからこちらをお読みいただくことをお勧めいたします。
ROM/RAM/RTCボードの製作[第5回]〜
[第8回]ぐらいまでお読みいただくとI2C通信についてざっとご理解いただけるのではないかと思います。
それで、当連載のほうは今までと同じような調子でPIC18F13K50のData Sheetをもとに読み解いていくことにいたします。
まずはI2Cモードについての概要です。
下はPIC13K50 Data SheetのI2Cモードについての説明の最初の部分です。
[出典]Microchip Technology Inc. PIC18F13K50/14K50 Data Sheet
MSSPモジュールのI2Cモードはマルチマスターファンクションもサポートしているとありますがマルチスレーブはともかくマルチマスターはいささか特殊かと思いますので当記事ではそこまでは触れないつもりです。
また普通の7bitアドレスだけではなくて10bitアドレスについてもできるとありますがまあ普通の7bitアドレスだけでよろしいでしょう。
I2Cモードでは通信に下記の2つの端子を使います。
シリアルクロック SCL
シリアルデータ SDA
Note:これらの端子に対応するTRISレジスタのビットは入力に設定する必要があります。
ちなみにSCLはRB6とpin11を共有しています。
またSDAはRB4とpin13を共有しています。
I2Cモードでは下記の7つのレジスタを使います。
コントロールレジスタ SSPCON1
コントロールレジスタ SSPCON2
ステータスレジスタ SSPSTAT
シリアル送受信バッファレジスタ SSPBUF
シフトレジスタ SSPSR(直接アクセスできません)
アドレスレジスタ SSPADD
アドレスマスク SSPMSK
SSPCON1とSSPCON2はリード/ライトできます。
SSPSTATの下位6ビットはリードオンリーです。
上位2ビットはリード/ライトできます。
SSPSRは入出力データをシフトするためのシフトレジスタです。
SSPBUFは受信データをリード、送信データをライトするためのバッファレジスタです
SSPADDレジスタはマスターモードではボーレートジェネレータの設定値を保持するためのレジスタとして使われます。
SSPADDレジスタはスレーブモードではスレーブデバイスのアドレスを保持します。
SSPMASKレジスタを使ってSSPADDレジスタの値をマスクすることである範囲のなかからスレーブアドレスを選択することができます。
受信動作ではSSPSRとSSPBUFはダブルバッファを構成します。
SSPSRが8bitのデータの受信を完了するとそのデータはSSPBUFに送られSSPIF割り込みフラグがセットされます。
送信動作ではSSPBUFはダブルバッファにはなりません。
送信データをSSPBUFに書き込むとそのデータはSSPBUFとSSPSRの両方に書き込まれます。
下はSSPSTATレジスタです。
[出典]Microchip Technology Inc. PIC18F13K50/14K50 Data Sheet
SSPSTATはSPIモードでも使われていますがSPIモードとI2Cモードではビットの意味が異なります。
bit7 SMP:スルーレートコントロール
スルーレートとはなんでしょう?
当記事では動作テストは通常の100KHzクロックを使います。
ここは’1’にしておきましょう。
bit6 CKE:SMBusセレクト
SMBusについてData Sheetを検索したのですが説明はみつかりませんでした。
ここは’0’にしておきます。
以下のビットはリードオンリーです。
bit0以外は多分使わないと思います(bit2はひょっとするとスレーブモードでは使うかも)。
bit0 BF:バッファフル
送信と受信で使い方が異なります。
送信モード:
1=SSPBUFフル(まだ送信は完了していない)
0=SSPBUFは空(送信は完了している)
受信モード:
1=SSPBUFフル(受信データを読取可能。ACK、STOPビットは含まない)
0=SSPBUFは空(受信データはまだ読み取りできない)
下はSSPCON1レジスタです。
[出典]Microchip Technology Inc. PIC18F13K50/14K50 Data Sheet
SSPCON1もSPIモードで使われていますがSPIモードとI2Cモードではビットの意味は異なります。
bit7 WCOL:不正書込み検出ビット
送信モード(マスター)
1=I2Cラインの状態がまだ不十分のときにSSPBUFに書込みが行なわれた(このビットはソフトウェアでクリアする必要がある)
0=不正書込みは発生していない
送信モード(スレーブ)
1=SSPBUFのデータの送信中にSSPBUFに書込みが行なわれた(このビットはソフトウェアでクリアする必要がある)
0=不正書込みは発生していない
受信モード(マスター/スレーブ)ではこのビットは使われない
bit6 SSPOV:受信オーバーフロー検出ビット
受信モード
1=前の受信データがSSPBUFに残っているときに次のデータが受信された(このビットはソフトウェアでクリアする必要がある)
0=オーバーフローは起きていない
送信モードではこのビットは使われない
bit5 SSPEN:SSPイネーブルビット
1=シリアルポートがイネーブルになりSDA(RB4)とSCL(RB6)端子がシリアルポート端子になる
0=シリアルポートがディスイネーブルになり上記端子はI/Oポート端子になる
bit4 CKP:SCKリリースコントロールビット
スレーブモード
1=クロック端子を開放する
0=クロック端子をLに固定(データセットアップタイムであることを示すため)
マスターモードではこのビットは使われない
bit3−0 SSPM<3:0>:SSPモードセレクトビット
1111=I2Cスレーブモード、10ビットアドレス、スタートおよびストップビット割り込みイネーブル
1110=I2Cスレーブモード、7ビットアドレス、スタートおよびストップビット割り込みイネーブル
1011=I2Cファームウェアコントロールマスターモード(どういうモードなのかよくわかりません)
1000=I2Cマスターモード、クロック=48MHz/(4*(SSPADD+1))
0111=I2Cスレーブモード、10ビットアドレス
0110=I2Cスレーブモード、7ビットアドレス
ここに示されていないビットの組み合わせは予約されているかSPIモード専用
下はSSPCON2レジスタです。
[出典]Microchip Technology Inc. PIC18F13K50/14K50 Data Sheet
bit7 GCEN:ゼネラルコールイネーブルビット(スレーブモードのみ)
1=ゼネラルコールアドレス(00H)を受信したときに割り込みを発生する
0=上記をディスイネーブルにする
bit6 ACKSTAT:アクノリッジステータスビット(マスター送信モードのみ)
1=スレーブからACKを受信した
0=ACKを受信していない
bit5 ACKDT:ACKデータビット(マスター受信モードのみ)
1=ACKではない(NACK)
0=ACK
bit4 ACKEN:ACKシーケンスイネーブルビット(マスター受信モードのみ)
1=ACKシーケンスを実行しACKDTビットのデータを送出する
このビットはハードウェアによって自動的にクリアされる
0=ACKシーケンスは実行されない
bit3 RCEN:受信イネーブルビット(マスターモードのみ)
1=I2C受信イネーブル
0=受信ディスイネーブル
bit2 PEN:STOPコンディションイネーブルビット(マスターモードのみ)
1=SDA、SCLラインをSTOPコンディションにする
このビットはハードウェアによって自動的にクリアされる
0=STOPコンディションにしない
bit1 RSEN:リピーテッドSTARTコンディションイネーブルビット(マスターモードのみ)
1=SDA、SCLラインをリピーテッドSTARTコンディションにする
このビットはハードウェアによって自動的にクリアされる
0=リピーテッドSTARTコンディションにしない
bit0 SEN:STARTコンディションイネーブル/ストレッチイネーブルビット
マスターモード
1=SDA、SCLラインをSTARTコンディションにする
このビットはハードウェアによって自動的にクリアされる
0=STARTコンディションにしない
スレーブモード
1=スレーブ送信、スレーブ受信でクロックストレッチをイネーブルにする(ストレッチイネーブル)
2=クロックストレッチディスイネーブル
Note 1:I2CモジュールがアイドルモードではないときにはACKEN,RCEN,PEN,RSEN,SENの各ビットはセットされないことがあります。
またSSPBUFは書き込みされないかもしれません。
Note 2:ACKDTビットの値はユーザーがACKENビットをセットしたときに受信データの終わりに送出される。
説明が長くなりましたので途中ですが今回はここまでにします。
レジスタの説明などは読んだだけではとても理解できません。
実際にテストプログラムを書くなかで補足的に説明していくことになると思います。
PIC−USBIO using BASIC[第130回]
2022.12.17upload
前へ
次へ
ホームページトップへ戻る