Buenas
Abro un nuevo hilo porque he pasado a una nueva fase. Con la ayuda del osciloscopio digital de la universidad (un promax de 150mhz chulisimo, lastima que no tuviera cable usb para mostraros las formas de onda del cacharro) he desvelado algunas incognitas.
#include <18f4550.h>
#use delay(clock=20000000)
#fuses HS,NOWDT,PUT
#use i2c(master,sda=PIN_D3,scl=PIN_D2)
int q;
void main()
{
while(1)
{
i2c_start();
i2c_write(0xa0);
i2c_write(0x00);
i2c_write(0xaa);
i2c_stop();
delay_us(100);
i2c_start();
i2c_write(0xa0);
i2c_write(0x00);
i2c_start();
i2c_write(0xa1);
q=i2c_read();
i2c_stop();
}
}
El codigo del ISR del slave... en su expresion mas basica, el soft del slave se basa en esto en un 99%. Yo creo que es necesario que veais este codigo para conocer la respuesta del i2c esclavo.
#INT_SSP
void ssp_interupt ()
{
BYTE incoming, state;
output_a(0xFF);
state = i2c_isr_state();
if(state < 0x80) //Master is sending data
{
incoming = i2c_read();
if(state == 1) //First received byte is address
address = incoming;
if(state == 2) //Second received byte is data
buffer[address] = incoming;
}
if(state == 0x80) //Master is requesting data
{
i2c_write(buffer[address]);
}
}
Bien, visto asi, lo pongo a "hablar" con un 18f2550 a 48mhz, y total, que SDA y SCL estan a nivel bajo todo el rato. Probemos con este codigo:
#include <18f4550.h>
#use delay(clock=20000000)
#fuses HS,NOWDT,PUT
#use i2c(master,sda=PIN_D3,scl=PIN_D2)
int q;
void main()
{
while(1)
{
i2c_start();
i2c_write(0xa0);
i2c_write(0x00);
i2c_write(0xaa);
i2c_stop();
delay_us(100);
i2c_start();
i2c_write(0xa0);
i2c_write(0x00);
i2c_stop(); //AÑADO ESTO Y ELIMINO (TACHO) LO SIGUIENTE
****i2c_start();
****i2c_write(0xa1);
****q=i2c_read();
****i2c_stop();
}
}
Vamos, que elimino el restart y la rutina de lectura. Voilá! El osciloscopio muestra vida. Con las comodidades del osciloscopio digital, logro observar toda la onda que se "trae entre manos" durante todo el programa. En los pines SDA y SCL, claro.
En fin... las ondas son correctas. Clock bien, se ven los start y los stop, los bytes son mandados correctamente, y hay ACK del esclavo. Vamos, que todo va bien. Pero cuando añado ese fragmento de codigo (ver diferencia entre el primer codigo y el segundo), todo se va al garete. No lo entiendo.
Alguien puede arrojar luz? Seguire aportando mas pistas, no pienso dejar de asistir a la universidad a trastear usando el osciloscopio este.
Un saludo!