;------------------------- I2C_EnviaStart -------------------------------------------------
I2C_EnviaStart
BSF SSPCON2,SEN,0 ;Pone a uno el bit de START
S2
BTFSC SSPCON2,SEN,0 ;Espera a que se ponga a cero el bit de START
BRA S2
S3
BTFSS PIR1,SSPIF,0 ;Espera a que la condicion de START haya sido completada
BRA S3 ;cuando se ponga a 1 la bandera de interrupción
BCF PIR1,SSPIF,0 ;Borra la bandera de la interrupción
RETURN ;Retorna de la subrutina
;------------------------- I2C_EnviaByte -------------------------------------------------
I2C_EnviaByte
MOVWF SSPBUF,0 ;Lo carga en el Buffer de salida
Write_I2C ;Llama a la subrutina de escritura
BTFSC SSPSTAT,R_W,0 ;Verifica que se ponga a cero el bit R/W
BRA Write_I2C ;Espera a que termine de enviar el dato
W2
BTFSC SSPCON2,ACKSTAT,0 ;Espera a que reciba el bit de ACKNOWLEDGE
BRA W2
BCF PIR1,SSPIF,0 ;borra la bandera de la interrupción
RETURN ;Retorna de la subrutina
;------------------------- I2C_EnviaStop -------------------------------------------------
I2C_EnviaStop
BSF SSPCON2,PEN,0 ;Genera la condición de STOP poniendo a 1 el bit PEN
P2
BTFSC SSPCON2,PEN,0 ;Espera a que se ponga a cero el bit PEN
BRA P2
BTFSS PIR1,SSPIF,0 ;Espera a que la condicion de Stop haya sido completada
BRA Rea4 ;cuando se ponga a 1 la bandera de interrupción
BCF PIR1,SSPIF,0 ;Borra la bandera de la interrupción
RETURN ;Retorna de la subrutina
;---------------------------------------------------------------------------------------
Restart_I2C
BSF SSPCON2,RSEN,0 ;Pone a uno el bit de RESTART
R2
BTFSC SSPCON2,RSEN,0 ;Espera a que se ponga a cero el bit de RESTART
BRA R2
R3
BTFSS PIR1,SSPIF,0 ;Espera a que la condicion de RESTART haya sido completada
BRA R3 ;cuando se ponga a 1 la bandera de interrupción
BCF PIR1,SSPIF,0 ;Borra la bandera de la interrupción
RETURN ;Retorna de la subrutina
;-------------------------------------------------------------------------------------------------------------------
Send_I2C_Ack
BCF SSPCON2,ACKDT,0 ;Pone a cero el bit de ACKNOWLEDGE DATA
BSF SSPCON2,ACKEN,0 ;Genera la condición de ACKNOWLEDGE Poniendo a 1 el bit ACKEN
BTFSS PIR1,SSPIF,0 ;Espera a que la condicion de ACK haya sido completada
BRA Rea4 ;cuando se ponga a 1 la bandera de interrupción
BCF PIR1,SSPIF,0 ;Borra la bandera de la interrupción
RETURN ;Retorna de la subrutina
;-------------------------------------------------------------------------------------------------------------------
Send_I2C_NoAck
BSF SSPCON2,ACKDT,0 ;Pone a 1 el bit de ACKNOWLEDGE DATA
BSF SSPCON2,ACKEN,0 ;Genera la condición de NO ACKNOWLEDGE Poniendo a 1 el bit ACKEN
BTFSS PIR1,SSPIF,0 ;Espera a que la condicion de No ACK haya sido completada
BRA Rea4 ;cuando se ponga a 1 la bandera de interrupción
BCF PIR1,SSPIF,0 ;Borra la bandera de la interrupción
RETURN ;Retorna de la subrutina
;-------------------------------------------------------------------------------------------------------------------
I2C_LeeByte
BSF SSPCON2,RCEN,0 ;Habilita la recepción de datos mediante el bit RCEN
Rea2
BTFSC SSPCON2,RCEN,0 ;Espera a que se ponga a cero el bit RCEN
BRA Rea2
Rea3
BTFSS SSPSTAT,BF,0 ;Dato disponible en SSPBUF para ser leidos?
BRA Rea3 ;No, esperar
Rea4
BTFSS PIR1,SSPIF,0 ;Espera a que la condicion de Lectura haya sido completada
BRA Rea4 ;cuando se ponga a 1 la bandera de interrupción
BCF PIR1,SSPIF,0 ;Borra la bandera de la interrupción
RETURN ;Retorna de la subrutina