;***********************************************************
; I2C routine
;***********************************************************
;In W=IIC device address +R/W
;data Write to slave device
;
I2STAT
BANKSEL SSP1CON2
BSF SSP1CON2, 0 ;SEN=1 start condition
STATW_C
BTFSC SSP1CON2, 0 ;SEN=0 ? Start ready check
BRA STATW_C
RETURN
;---------------------------------------
I2ADW ;I2C Slave address W
BANKSEL SSP1BUF
MOVWF SSP1BUF
BANKSEL PIR1
BCF PIR1, 3 ;SSP1F Flag clear
BANKSEL SSP1STAT
DATW1:
BTFSC SSP1STAT, 0 ;Data sent check
BRA DATW1
BANKSEL PIR1
ACKW1:
BTFSS PIR1, 3
BRA ACKW1
BANKSEL SSP1CON2
BTFSC SSP1CON2, 6 ;ACK flag check
GOTO IICERR ;error
BANKSEL PIR1
BCF PIR1, 3
RETURN
;---------------------------------------
I2REG
BANKSEL SSP1BUF
MOVWF SSP1BUF
BANKSEL PIR1
BCF PIR1, 3
BANKSEL SSP1STAT
DATW2:
BTFSC SSP1STAT, 0 ;Data sent check
BRA DATW2
BANKSEL PIR1
ACKW2:
BTFSS PIR1, 3
BRA ACKW2
BANKSEL SSP1CON2
BTFSC SSP1CON2, 6 ;ACK flag check
GOTO IICERR ;error
BANKSEL PIR1
BCF PIR1, 3
RETURN
;---------------------------------------
I2WT
BANKSEL SSP1BUF
MOVWF SSP1BUF
BANKSEL PIR1
BCF PIR1, 3
BANKSEL SSP1STAT
DATW3:
BTFSC SSP1STAT, 0 ;BF sent check
BRA DATW3
BANKSEL PIR1
ACKW3:
BTFSS PIR1, 3
BRA ACKW3
BANKSEL SSP1CON2
BTFSC SSP1CON2, 6 ;ACK flag check
GOTO IICERR ;error
BANKSEL PIR1
BCF PIR1, 3
RETURN
;---------------------------------------
I2STOP
BANKSEL SSP1CON2
BSF SSP1CON2, 2 ;PEN=1 stop condition
STP_C:
BTFSC SSP1CON2, 2 ;PEN=0 Stop condition End ?
BRA STP_C
BANKSEL PIR1
BCF PIR1, 3
RETURN
;
;data Read from slave device
;
;---------------------------------------
I2RSTAT
BANKSEL SSP1CON2
BSF SSP1CON2, 1 ;RSEN=1 repeat start
DATR22:
BTFSC SSP1CON2, 1 ;RSEN=0 Restart sent check
BRA DATR22
BANKSEL PIR1
BCF PIR1, 3
RETURN
;---------------------------------------
I2RD0
BANKSEL SSP1CON2
BSF SSP1CON2, 3 ;RCEN=1 Receive Enable
DATR30:
BTFSC SSP1CON2, 3 ;RCEN=0 ? Data Receive check
BRA DATR30
BANKSEL PIR1
BCF PIR1, 3
BANKSEL SSP1BUF
MOVF SSP1BUF,W ;Received data
; MOVWF xxxx
BANKSEL SSP1CON2
BCF SSP1CON2, 5 ;ACKDT=0
BSF SSP1CON2, 4 ;ACKEN=1
ACKR3:
BTFSC SSP1CON2, 4 ;ACKEN=0 ACK finish?
BRA ACKR3 ;
BANKSEL PIR1
BCF PIR1, 3
RETURN
;---------------------------------------
I2RDN
BANKSEL SSP1CON2
BSF SSP1CON2, 3 ;RCEN=1
DATR31:
BTFSC SSP1CON2, 3 ;RSEN=0 ? Data Receive check
BRA DATR31
BANKSEL PIR1
BCF PIR1, 3
BANKSEL SSP1BUF
MOVF SSP1BUF,W ;Received data
; MOVWF xxxx
BANKSEL SSP1CON2
BSF SSP1CON2, 5 ;ACKDT=1 NO-ACK
BSF SSP1CON2, 4 ;ACKEN=1
ACKR33
BTFSC SSP1CON2, 4 ;ACK finish?
BRA ACKR33 ;
BANKSEL PIR1
BCF PIR1, 3
RETURN
;---------------------------------------
IICERR
BANKSEL SSP1CON2
BSF SSP1CON2,2 ;PEN=1 stop condition
STPW_Loop
BTFSC SSP1CON2,2 ;PEN=0 ? stop condition end ?
BRA STPW_Loop
BANKSEL PIR1
BCF PIR1, 3
Return