Bueno, que os parece si os dejo el codigo que estoy intentando?? Seguro que esta lleno de disparates pero es que no tengo los conceptos claros. COn esto pretendo leer la informacion que hay en el buffer del slave.
Codigo:
#include <16f877.h>
#use delay (clock=4000000)
#include <lcd.c>
#use i2c (master, sda=pin_C4, scl=pin_c3)
#byte port_a=5
#byte port_b=6
#byte port_c=7
#byte port_d=8
#byte port_e=9
#org 0x1F00, 0x1FFF void loader16F877(void) {}
static int a,b,c=25,d=15,e,f;
void main()
{
set_tris_a(0);
set_tris_b(0);
set_tris_c(0);
set_Tris_d(0);
port_a=0;
lcd_init();
while(1)
{
lcd_putc("f"
;
printf(lcd_putc," c=%i a=%i ",c,a);
delay_ms(5000);
i2c_start();
i2c_write(0xa0); //direccion de slave
a=i2c_read(0x00); //leo buffer
delay_ms(10);
b=i2c_read(0x01);
delay_ms(10);
c=i2c_read(0x02);
delay_ms(10);
d=i2c_read(0x03);
delay_ms(10);
e=i2c_read(0x04);
delay_ms(10);
f=i2c_read(0x05);
i2c_stop();
printf(lcd_putc," c=%i a=%i",c,a);
}
}
///////////////////////////////////////////////////////////////////////////////////// slave
#include <16f876.h>
#org 0x1F00, 0x1FFF void loader16F876(void) {}
#use delay (clock=4000000)
#use i2c(SLAVE, SDA=PIN_C4, SCL=PIN_C3, address=0xa0)
typedef enum {NOTHING, CONTROL_READ,
ADDRESS_READ, READ_COMMAND_READ} I2C_STATE;
I2C_STATE fState;
BYTE address, buffer[0x10];
#INT_SSP
void ssp_interupt ()
{
BYTE incoming;
if (i2c_poll() == FALSE) {
if (fState == ADDRESS_READ) { //i2c_poll() returns false on the
i2c_write (buffer[address]);//interupt receiving the second
fState = NOTHING; //command byte for random read operation
}
}
else {
incoming = i2c_read();
if (fState == NOTHING){
fState = CONTROL_READ;
}
else if (fState == CONTROL_READ) {
address = incoming;
fState = ADDRESS_READ;
}
else if (fState == ADDRESS_READ) {
buffer[address] = incoming;
fState = NOTHING;
}
}
}
int i;
void main ()
{
set_tris_a(0);
set_tris_b(0);
set_tris_c(0);
fState = NOTHING;
address = 0x00;
for (i=0;i<0x10;i++)
buffer = 0x00;
enable_interrupts(GLOBAL);
enable_interrupts(INT_SSP);
while (TRUE)
{
buffer[0x00]=1;
buffer[0x01]=2;
buffer[0x02]=3;
buffer[0x03]=4; //doy valores al buffer para luego poder leerlos
buffer[0x04]=5;
buffer[0x05]=6;
buffer[0x06]=7;
buffer[0x07]=8;
buffer[0x08]=9;
}
}