Saludos gente del grupo, escribo para solicitar ayuda con la comunicacion I2C entre dos pic 16f877, he leído bastante del tema pero aun no logro hacer que se comuniquen estos dos pic, básicamente busco que el esclavo le envié un byte al maestro y que este lo mueva al puerto B, no se que estoy haciendo mal o que no estoy haciendo por eso pido su ayuda, agradezco de antemano su ayuda, dejo el código que estoy planteando a ver que me dicen.
para el pic master
inicializacion del pic
INIT_MASTER
BANK_0
movlw b'00101000' ; declaro al pic como master y habilito la comunicacion sincrona
movwf SSPCON
BANK_1
movlw b'10000000' ; declaro que se va a utilizar en velocidad standar
movwf SSPSTAT
movlw .4
movwf SSPADD ; indico que el crystal 20 Mhz y la velocidad 1 Mhz
bsf SSPCON2,RCEN ; habilito la recepcion por parte del maestro
bsf SSPCON2,ACKEN ; habilito el envio del ACK por parte del maestro
return
con esta subrutina pretendo leer los datos desde el maestro
leer_master
BANK_1
bsf SSPCON2, SEN ; se genera la condición de inicio
btfss SSPCON2,SEN ; chequeo si se cumplió la condición de inicio
goto $-1
BANK_0
movlw b'10100111' ; envió dirección al esclavo y le indico que quiero recibir datos
movwf SSPBUF
BANK_1
btfsc SSPSTAT,BF ; chequeo que el buf este vació
goto $-1
btfsc SSPCON2,ACKSTAT ; chequeo comunicación por parte del esclavo
goto $-1
btfss SSPSTAT,BF ; chequeo que la recepción del dato esta completa
goto $-1
call envia_noack
BANK_0
movfw SSPBUF ;
movwf PORTB ; muevo lo leido al pueto B para chequear la salida de algun
BANK_1
btfsc SSPSTAT,BF ; chequeo que el buf este vacio
goto $-1
bsf SSPCON2,PEN ; termino la comunicacion
return
para el pic esclavo
Inicializo el pic como esclavo
INIT_SLAVE
BANK_0
movlw b'00100110' ;
movwf SSPCON ; configuro el pic como slave
BANK_1
movlw b'10100110'
movwf SSPADD ; configuro la direccion segun bits del TRISD
return
envio de datos
slave
BANK_1
btfss SSPSTAT,S ; chequeo condicion de inicio
goto $-1
BANK_0
btfsc SSPCON,SSPOV ; chequeo que no haya overun
goto $-1
BANK_1
btfss SSPSTAT,BF ; chequeo que llego un dato o una direccion
goto $-1
BANK_1
btfsc SSPSTAT,D_A ; chequeo si es dato o direccion
goto slave_leer
rw btfss SSPSTAT,R_W ; chequeo si el esclavo va a leer o escribir, si llego una direccion y el pic va a escribir
goto slave_escribir
goto slave_leer
slave_escribir ; subrutina para enviar datos desde el slave
BANK_1
btfss SSPSTAT,BF ; chequeo que llego un dato
goto $-1
btfsc SSPSTAT,R_W ; chequeo si el esclavo va a leer o escribir
goto rw
BANK_0
movlw b'00000011'
movwf SSPBUF ; cargo en sspbuf lo que quiero enviar
BANK_1
btfsc SSPSTAT,BF ; chequeo que se ha completado la transmision sspbuf vacio.
goto $-1
btfsc SSPCON2,ACKDT ; chequeo si el master ha recibido el dato.
goto $-1
goto slave