CONFIG_I2C MACRO
;RC4=SDA
;RC3=SCL Y LOS DOS COMO ENTRADA??
movlw B'00011000'
banksel TRISC ;banco 1
iorwf TRISC,F
BANKSEL SSPSTAT
MOVLW B'00000000' ;7----> SMP 0=VELOCIDAD 400KHZ
;6----> CKE 0=EL DATO SE TRANSMITE EN FLANCO DE SUBIDA
;5----> D/A 1=INDICA QUE EL ULTIMO DATO REC/TRANSMITIDO ERA UN DATO
; 0=INDICA QUE ERA UNA DIRECCION
;4----> P 1=INDICA QUE HA SIDO DETECTADA UNA CONDICION DE STOP
; 0=NO SE HA DETECTADO STOP
;3----> S 1=SE HA DETECTADO UNA CONDICION DE START
; 0=NO SE HA DETECTADO UNA CONDICION DE START
;2----> R_W 1=TRANSMISION EN PROGRESO
; 0=TRANSMISION FINALIZADA
;1----> UA SOLO EN I2C DIRECCION 10BITS
;0----> BF 1=LA TRANSMISION ESTA EN PROGRESO SSPBUF LLENO
; 0=LA TRANSMISION HA FINALIZADO SSPBUF VACIO
MOVWF SSPSTAT
;-------------------------------
BANKSEL SSPCON
MOVLW B'00101000' ;7----> WCOL 0=NO HAY COLISION
; 1=SE HA ESCRITO SSPBUF MIENTRAS SE HACIA UNA TRANSMISION
;6----> SSPOV 0=NO HAY OVERFLOW
; 1=UN BYTE SE HA RECIBIDO SIN LEER EL ANTERIOR dEBE SER BORRADO POR SOFT
;5----> SSPEN 1=HABILITA EL I2C Y LOS PINES SDA SCL
;4----> CKP 0=MANTIENE EL RELOJ EN ESTADO BAJO
; 1=HABILITA EL RELOJ
;3-0--> SSPM3-0 1000=MAESTRO reloj=f_osc/4*(sspadd+1)
MOVWF SSPCON
;-------------------------------
BANKSEL SSPCON2
MOVLW B'00010000'
;7----> GCEN SOLO EN ESCLAVO
;6----> ACKSTAT EN MODO MASTER TRANSMISION, EL ESCLAVO ENVIA EL ACK CUANDO HA RECIBIDO EL DATO
; 1=NO RECIBIDO ACK DEL ESCLAVO
; 0=ACK RECIBIDO DEL ESCLAVO
;5----> ACKDT EN MODO MASTER RECEPCION, EL MASTER ENVIA UN ACK CUANDO HA TERMINADO DE RECIBIR
; 1=NO ACK
; 0=SI ACK
;4----> ACKEN EN MODO MASTER RECEPCION
; 1= INICIA LA SECUENCIADE SDA SCL, Y TRANMITE EL ACKDT BORRADO POR HARDWARE
; 0=DESHABILITADO
;3----> RCEN EN MASTER I2C
; 1= RECEPCION HABILITADA
; 0= RECEPCION DESHABILITADA
;2----> PEN SOLO EN I2C MASTER
; 1=INICIA UNA SECUENCIA DE STOP BORRADO POR HARD
; 0=DESHABILITADA
;1----> RSEN SOLO EN I2C MASTER START REPETIDO
; 1=INICIA CONDICION DE SR BORRADO POR HARD
; 0=DESHABILITADO
;0----> SEN SOLO EN I2C MASTER
; 1=INICIA LA CONDICION START EN SCL SDA BORRADO POR HARD
; 0=DESHABILITADO
MOVWF SSPCON2
banksel SSPADD
movlw b'00001011' ;.11 para 400khz @ 20 mhz
movwf SSPADD ;400 khz @ 20 mhz
ENDM
I2C_BUS MACRO
CALL RESET_DIRECCION ;APUNTA AL PAD 00, HABRA QUE BUSCAR LA FORMA DE SELECIONAR ENTRE VARIOS CADA 255 BYTES
I2C_MEMO_READ
BANKSEL SSPCON
BSF SSPCON, CKP ;PRIMERO INICIA EL RELOJ
CALL IIC_START ;ENVIA LA CONDICION DE START
MOVLW B'10100001' ;CONTROL BYTE--> |STARTBIT|1|0|1|0|A2|A1|A0|RW|ACK
CALL IIC_ENVIA ;Y SE LO ENVIA A LA EEPROM
CALL IIC_ADRESS ;MANDA DIRH,ESPERA ACK,MANDA DIRL, ESPERA ACK, RETURN
SIGUE_READ
BANKSEL SSPCON2
BSF SSPCON2,RCEN ;activar modo lectura
BTFSC SSPCON2,RCEN ;termino la recepcion?
GOTO $-1
BTFSS SSPSTAT,BF ;dato disponible en SSPBUF para ser leido?
GOTO $-1 ;no, esperar
BANKSEL DIRL
INCFSZ DIRL,F ;UNA VEZ LLEGA A 255 SALE DE LA RUTINA
GOTO GUARDA_PADS
IIC_STOP
BANKSEL SSPCON2
BSF SSPCON2,PEN
BTFSC SSPCON2,PEN
GOTO $-1
BANKSEL SSPCON
BCF SSPCON, CKP ;APAGA EL RELOJ
RETURN
GUARDA_PADS
BANKSEL SSPBUF
MOVF SSPBUF,W
BANKSEL REG_MUESTRA
MOVWF REG_MUESTRA
CALL ESCRITURA_EEPROM_IIC ;Y GUARDA EL DATO EN LA EEPROM
GOTO SIGUE_READ
IIC_IDLE
BANKSEL SSPSTAT
BTFSC SSPSTAT,R_W
GOTO $-1
; movf SSPCON2,w ; POR QUE SE HACE ESTO
; andlw 0x1F
; btfss STATUS,Z
; goto $-3
RETURN
ESCRITURA_EEPROM_IIC
BANKSEL DIRL
MOVF DIRL,W ;Data Memory
BANKSEL EEADR
MOVWF EEADR ;Address to write
CLRW
ADDWF EEADR,F ;DE ESTA FORMA SE COMIENZA A CONTAR DESDE EL REGISTRO DE POTES
GOTO CONTINUA_ESCRITURA
IIC_ADRESS
BANKSEL DIRH
MOVF DIRH,W
CALL IIC_ENVIA
BANKSEL DIRL
MOVF DIRL,W
CALL IIC_ENVIA
RETURN
IIC_ENVIA
CALL IIC_IDLE ;ESERA A QUE TERMINE LA ULTIMA TRANSMISION
BANKSEL SSPBUF
MOVWF SSPBUF
BANKSEL SSPCON2
RETURN
RESET_DIRECCION
BANKSEL DIRH ;CARGAMOS EN LOS REGISTROS DE DIRECCION A LA QUE QUEREMOS ACCEDER
CLRF DIRH ;DE MOMENTO DIRECCION 00
CLRF DIRL
RETURN
IIC_START
CALL IIC_IDLE
BANKSEL SSPCON2
BSF SSPCON2, SEN ;INICIA START
BTFSC SSPCON2,SEN
GOTO $-1
BANKSEL PIR1
BTFSS PIR1,SSPIF
GOTO $-1
BCF PIR1,SSPIF
RETURN
ENDM
;------------------------------------------