No andaban nada lejos los ejemplillos
ahi van.
Estas son las rutinas que tienes que usar en el maestro para leer y escrivir en el esclavo.
Codigo:
//It reads a value from a slave I2C device connected to the I2C bus
//Disable all interrupts before use it or when another
// process can interrupt reading
byte readi2c(byte address, byte pos){
byte out;
i2c_start();
i2c_write(address); //slave can read.
i2c_write(pos);
i2c_start();
i2c_write(address+1); //slave can write.
out = i2c_read(0);
i2c_stop();
return out;
}
//It writes a value in a slave I2C device connected to the I2C bus
//Disable all interrupts before use it or when another
// process can interrupt writing
writei2c(byte address, byte pos,byte data){
byte out;
i2c_start();
i2c_write(address); //slave can read.
i2c_write(pos);
i2c_write(data);
i2c_stop();
return out;
}
adress es la direccion del esclavo, pos es la posicion del buffer del slave y data es el dato que quieres mandar.
Y para el slave te pongo un ejemplo que da unos valores al buffer para luego leerlos des del slave.
Codigo:
#include <16f876.h>
#use delay (clock=4000000)
#use i2c(SLAVE, SDA=PIN_C4, SCL=PIN_C3, address=0xa0,force_hw)
static int i;
typedef enum {NOTHING, CONTROL_READ,
ADDRESS_READ, READ_COMMAND_READ} I2C_STATE;
static I2C_STATE fState=NOTHING;
static byte address, buffer[0x10];
static byte incoming=0;
#INT_SSP
void ssp_interupt ()
{
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;
}
}
}
void main ()
{
loader16F876();
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; // aqui es donde se guarda la info que el master
buffer[0x05]=6; // envia al slave
buffer[0x06]=7;
buffer[0x07]=8;
buffer[0x08]=9;
}
}