山本ワールド
PIC18 I2Cモジュール サポートライブラリ
概要
PIC内蔵のI2Cモジュールを使用したI2Cの基本的なプロトコルをサポート スタート・ストップ・リスタート・1byte書き込み・1byte読み込み・ブロック書き込み・ブロック読み込みをサブルーチン化している。
使用する場合はi2c.incをインクルードしi2c.asmをプロジェクトに追加してください
本ライブラリを使用する前にI2Cモジュールの初期化をしてください。
I2Cバスの仕様については、次のページに記述がある。
http://www.nxp.com/documents/user_manual/UM10204_JA.pdf
プログラムの説明
ソースファイル
以下のファイルで構成されているi2c.asm ・・・ I2Cサポートライブラリ Version 1.00 i2c.inc ・・・ I2Cサポートライブラリ Version 1.00
サブルーチン
以下のサブルーチンをサポート
i2c_start
スタートコンディションを発行する
i2c_write
WREGの値をI2Cバスへ出力する。
i2c_read
I2Cから1byte入力しWREGに格納する。デバイスへはACKを返す。
i2c_last_read
I2Cから1byte入力しWREGに格納する。デバイスへはNACKを返す。
i2c_block_write
FSR1で示されるメモリをWREGの値で示されるバイト数、I2Cバスへ出力する
i2c_block_read
WREGの値で示されるバイト数、I2Cバスから読み込む。データーはFSR1で示されるメモリに格納される。最終読み込みはNACKをデバイスに出力する
i2c_stop
ストップコンディションを発行する
ソースコード
i2c.inc
; I2Cサポートライブラリ Version 1.00 ; File: i2c.inc ; Target: PIC18F14K50 48Mhz ; アセンブラ: Microchip MPASM(v5.51) ; 書き込み: PICKit 3 ; リリース: 2013/10/01 21:00 EXTERN i2c_start,i2c_stop,i2c_restart,i2c_read,i2c_last_read,i2c_write EXTERN i2c_block_write,i2c_block_read
i2c.asm
; I2Cサポートライブラリ Version 1.00
; File: i2c.asm
; Target: PIC18F14K50 48Mhz
; アセンブラ: Microchip MPASM(v5.51)
; 書き込み: PICKit 3
; リリース: 2013/10/01 21:00
#INCLUDE <p18f14k50.inc>
EXTERN Temp1
EXTERN ARG1
GLOBAL i2c_start,i2c_stop,i2c_restart,i2c_read,i2c_last_read,i2c_write
GLOBAL i2c_block_write,i2c_block_read
CODE
i2c_start ; i2cにスタートを出力
bcf SSPCON1,WCOL ; 衝突フラグクリア
bsf SSPCON2,SEN ; スタート出力
btfsc SSPCON1,WCOL
bra i2c_start ; 衝突がなくなるまでループ
i2c_start_sen
btfsc SSPCON2,SEN
bra i2c_start_sen ; SENがクリアされるまでループ
return
i2c_restart ; i2cに再スタートを出力
bcf PIR1,SSPIF ; 割り込みフラグクリア
bsf SSPCON2,RSEN ; 再スタート出力
i2c_restart_rsen
btfsc SSPCON2,RSEN
bra i2c_restart_rsen ; RSENがクリアされるまでループ
return
i2c_write ; 1byte出力
bcf PIR1,SSPIF ; 割り込みフラグクリア
movwf SSPBUF ; 書き込みデータをセット
i2c_write_sen
btfss PIR1,SSPIF
bra i2c_write_sen ; データ送信完了しACKを受信可能状態になるまで待機
movlw 0 ; スレーブからの返信がある場合
btfss SSPCON2,ACKSTAT ; スレーブからACKが返っているかチェック
movlw 0ffh
return
i2c_block_write ; FSR1にアドレス ワーキングレジスタに送信バイト数をセット
movwf Temp1 ; 送信バイト数
i2c_block_write_loop
movf POSTINC1,W
rcall i2c_write
decfsz Temp1 ; Temp1から1を引き結果が0になるまで繰り返す
bra i2c_block_write_loop
return
i2c_block_read ; FSR1にアドレス ワーキングレジスタに受信バイト数をセット
movwf Temp1 ; 受信バイト数
decf Temp1
i2c_block_read_loop
rcall i2c_read
movwf POSTINC1,W
decfsz Temp1 ; Temp1から1を引き結果が0になるまで繰り返す
bra i2c_block_read_loop
rcall i2c_last_read
movwf POSTINC1,W
return
i2c_stop ; i2cにSTOPを出力
bcf PIR1,SSPIF ; 割り込みフラグクリア
bsf SSPCON2,PEN ; ストップ出力
i2c_stop_sen
btfsc SSPCON2,PEN
bra i2c_stop_sen ; 出力が完了するまでループ
bcf PIR1,SSPIF ; 割り込みフラグクリア
return
i2c_read ; 1byte入力
bcf PIR1,SSPIF ; 割り込みフラグクリア
bsf SSPCON2,RCEN ; 受信を許可
i2c_read_sen
btfsc SSPCON2,RCEN
bra i2c_read_sen ; SSPBUFに受信データがセットされるまでループ
bcf SSPCON2,ACKDT ; ACKを出力
bsf SSPCON2,ACKEN ; ACKENをセット
i2c_read_sen2
btfsc SSPCON2,ACKEN
bra i2c_read_sen2 ; ACKの送信が終了するループ
movf SSPBUF,W
return
i2c_last_read ; 最終1byte入力
bcf PIR1,SSPIF ; 割り込みフラグクリア
bsf SSPCON2,RCEN ; 受信を許可
i2c_last_read_sen
btfsc SSPCON2,RCEN
bra i2c_last_read_sen ; PICが受信許可状態になるまでループ
bsf SSPCON2,ACKDT ; NACKを出力
bsf SSPCON2,ACKEN ; ACKENをセット
i2c_last_read_sen2
btfsc SSPCON2,ACKEN
bra i2c_last_read_sen2 ; ACKの送信が終了するループ
movf SSPBUF,W
return
END
Copyright (C) 2012 山本ワールド All Rights Reserved.