Buenas a todos,
Estoy empezando con el bus I2C entre micros, y después de haber visto mil ejemplos, y haber conseguido unas cuantas cosas se me plantean un par de dudas. He conseguido comunicar dos 18F458 entre sí mediante I2C maestro esclavo utilizando un ejemplo que hay por la web portado a mi PIC, y en principio parece una comunicación sencilla, pero en el momento de añadir un segundo esclavo, no consigo que este esclavo vea el dato que le envío, así que entiendo que hago algo mal...
Esta es la función de envío que utilizo, quiero enviar el mismo dato a todos los pic, solo el primero de los dos recibe el dato, el segundo no lo recibe.
void envio_I2C(){
i2c_start(); //Comienzo de la comunicación I2C ...
i2c_write(0x02); //...con la dirección del PIC esclavo...
i2c_write(tecla); // Envia dato
i2c_stop(); //Finalización de la transmisión
delay_ms(500);
i2c_start(); //Comienzo de la comunicación I2C ...
i2c_write(0x04); //...con la dirección del PIC esclavo...
i2c_write(tecla); // Envia dato
i2c_stop(); //Finalización de la transmisión
delay_ms(500);
}
Y la configuración del bus de los tres pics:
#use i2c(MASTER, SDA=PIN_C4, SLOW, SCL=PIN_C3, NOFORCE_SW)
#use I2C(SLAVE, SDA=PIN_C4 ,SLOW, SCL=PIN_C3, ADDRESS=0x02, NOFORCE_SW)
#use I2C(SLAVE, SDA=PIN_C4 ,SLOW, SCL=PIN_C3, ADDRESS=0x04, NOFORCE_SW)
Junto con la lectura del dato:
while (1) {
// Recepción por comunicación I2C
if(i2c_poll()) {
dato=i2c_read();
lcd_putc(dato); //Muestra dato recibido por pantalla
if (dato=='*') lcd_putc("\f"); //Si es * borra la pantalla lcd
}
Independientemente de que no me funcione, NOFORCE_SW no sale como tal en la ayuda de CCS, no es lo mismo que FORCE_HW? esto me marea un poco... ya que no tengo muy claro el tema de i2c soft vs i2c hard. Por otro lado i2c_poll() entiendo que ya tiene en cuenta que la dirección a la que van los datos es la suya no?? porque si no es esto, o algún tema de tiempos estoy muy perdido...
Muchas gracias de antemano y saludos!!!
Actualizo: He estado haciendo pruebas, si en lugar de enviar el dato a cada uno de los pics lo hago al mismo dos veces lo recive ok, por lo tanto entiendo que el envío se hace bien. Con el i2c debugger, he
podido ver que el segundo pic me devuelve NAK, os pongo una captura:
Uploaded with
ImageShack.us