山本ワールド
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.
    
    
  