PIC16F883/886で、I2C通信を行うためには、次のようにTRISC , SSPCON , SSPSTAT , SSPADDの各レジスタを設定します。(I2C 初期化)
今回使うPIC16F883は、I2Cマスターモードで使用しますので、SSPCONのbit3-bit0は、1000
標準速度モード(100KHz)で使用しますので、SSPSTATのbit7(SMP)=1
SSPADDのbit7-bit0には、マスターモードの場合は、クロックパラメータを入れます。
クロックパラメータの計算は、上の図にあるように計算すると19になります。
I2Cの初期化を実行した後、I2C通信が可能になります。
I2C通信の手順は、次のように行います。(1バイト送信の場合)
1 スタートコンディションの発行
2 スレーブアドレスの送信
3 スレーブからのアクノレッジ(ACK)確認
4 データ送信
5 ACK確認
6 ストップコンディションの発行
アセンブラ記述では、次のようになります。(サブルーチン)
1 スタートコンディションの発行
I2C_Start
BANKSEL SSPCON2
BSF SSPCON2,SEN ;SSPCON2レジスタのbit0(SEN)を1にします。
BANKSEL PIR1
BTFSS PIR1,SSPIF ;PIR1レジスタのSSPIFが1になるまで待ちます。
GOTO $-1
RETURN
2 スレーブアドレスの送信
I2C_Add
BANKSEL PIR1
BCF PIR1,SSPIF ;SSPIFのクリア
MOVLW LCD_ADRS ;スレーブのアドレスをWレジスタにセット、AQM0802Aのアドレスは、0x7C
MOVWF SSPBUF ;SSPBUFにアドレスを入れる
BTFSS PIR1,SSPIF ;PIR1レジスタのSSPIFが1になるまで待ちます。
GOTO $-1
RETURN
3 スレーブからのアクノレッジ(ACK)確認
I2C_Ack
BCF STATUS,C ;Cクリア
BANKSEL SSPCON2
BTFSS SSPCON2,ACKSTAT ;ACKSTAT=0なら成功 C=0
RETURN
BSF STATUS,C ;ACKSTAT=1なら失敗 C=1
RETURN
4 データ送信(Wレジスタにデータがセットしてある)
I2C_Data
BANKSEL PIR1
BCF PIR1,SSPIF ;SSPIFのクリア
MOVWF SSPBUF ;SSPBUFにデータを入れる
BTFSS PIR1,SSPIF ;PIR1レジスタのSSPIFが1になるまで待ちます。
GOTO $-1
RETURN
5 ACK確認
3と同じ
6 ストップコンディションの発行
I2C_Stop
BANKSEL PIR1
BCF PIR1,SSPIF ;SSPIFクリア
BANKSEL SSPCON2
BSF SSPCON2,PEN ;ストップコンディションにする。
BANKSEL PIR1
BTFSS PIR1,SSPIF ;SSPIFが立つまで待つ。
GOTO $-1
BCF PIR1,SSPIF ;SSPIFクリア
RETURN
各サブルーチンを組み合わせて、LCDのコントロールルーチンとLCD表示ルーチンを組みます。
それは、次回