DOWNLOAD MAIN
;Slave address of I2C device to whom we are talking
#DEFINE SLAVEID 0x90 ; Set this for your device
;*****************************************
; MACRO DEFINITIONS
; Generic PIC Assembly macro definitions
; by Randy Gamage
;
ifpos macro arg1
btfss arg1,7
endm
ifneg macro arg1
btfsc arg1,7
endm
bank0 macro
bcf STATUS,RP1
bcf STATUS,RP0
endm
bank1 macro
bcf STATUS,RP1
bsf STATUS,RP0
endm
bank2 macro
bsf STATUS,RP1
bcf STATUS,RP0
endm
bank3 macro
bsf STATUS,RP1
bsf STATUS,RP0
endm
;
;=================================
; I2C Routines (using H/W I2C Peripheral
;=================================
I2CInit:
movlw 0x28
movwf SSPCON
bank1
clrf SSPCON2^0x80
movlw 49
movwf SSPADD^0x80
bsf SSPSTAT^0x80,SMP
bcf SSPSTAT^0x80,CKE
bank0
bcf PIR1,SSPIF
bcf PIR2,BCLIF
return
I2CWaitForIdle:
bank1
I2C_WFI:
movf SSPCON2^0x80,W
andlw 0x1F
skipz
goto I2C_WFI
ifset SSPSTAT^0x80,R_W
goto $ - 1
bank0
return
I2CStart:
call I2CWaitForIdle
bank1
bsf SSPCON2^0x80,SEN
bank0
return
I2CRepStart:
call I2CWaitForIdle
bank1
bsf SSPCON2^0x80,RSEN
bank0
return
I2CStop:
call I2CWaitForIdle
bank1
bsf SSPCON2^0x80,PEN
bank0
return
I2CRead:
call I2CWaitForIdle
bank1
bsf SSPCON2^0x80,RCEN
bank0
call I2CWaitForIdle
movf SSPBUF,W
movwf I2CData
call I2CWaitForIdle
bank1
bsf SSPCON2^0x80,ACKDT
bsf SSPCON2^0x80,ACKEN
bank0
return
I2CReadwAck:
call I2CWaitForIdle
bank1
bsf SSPCON2^0x80,RCEN
bank0
call I2CWaitForIdle
movf SSPBUF,W
movwf I2CData
call I2CWaitForIdle
bank1
bcf SSPCON2^0x80,ACKDT
bsf SSPCON2^0x80,ACKEN
bank0
return
I2CWrite:
movwf I2CData
call I2CWaitForIdle
movf I2CData,W
movwf SSPBUF
call I2CWaitForIdle
return
|