I2C iletişim problemi

Başlatan constantine33, 30 Mart 2016, 23:04:15

constantine33

I2C ile iki tane pic16f877a arasında iletişim yapmaya çalışıyorum ama başaramadım. Bir pic master diğeri de slave modunda çalışıyor. Kodda bir hata olabilir mi?

Master PIC
#include <16f877a.h>
#fuses HS,NOWDT,NOPROTECT,NOBROWNOUT,LVP,NOPUT,NOWRT,DEBUG,NOCPD
#use delay(CLOCK=20M, CRYSTAL=20M)
#use fast_io(b)
#use I2C(MASTER,FAST, SCL=PIN_C3, SDA=PIN_C4, FORCE_HW)
int dataout = 250;
void main()
{
   set_tris_b(0x00);
   output_b(0x00);
   i2c_start();
   i2c_write(0xa0);
   i2c_write(1);
   i2c_write(dataout);
   i2c_stop();               
   delay_ms(100);
   
   
}

Slave PIC

#include <16f877a.h>
#fuses HS,NOWDT,NOPROTECT,NOBROWNOUT,LVP,NOPUT,NOWRT,DEBUG,NOCPD
#use delay(CLOCK=20M, CRYSTAL=20M)
#use fast_io(b)
#use i2c(SLAVE, FAST, SCL=PIN_C3, SDA=PIN_C4, address=0xA0, FORCE_HW)
int state;
int address;
int buffer[0x03];

#INT_SSP
void ssp_interupt ()
{
   state = i2c_isr_state();
   if(state < 0x80)                 //master is sending data
   {
   if(state == 0)
   {
   }
   if(state == 1)                   //first received byte is address
   {
      address = i2c_read();
   }
   if(state == 2)                   //second received byte is data
   {
      buffer[address] = i2c_read();
     
   }
   }
   if(state == 0x80)                //master is requesting data
   {
      i2c_write (buffer[address]);  //send requested data
   }
}

void main()
{
   set_tris_b(0x00);
   output_b(0x00);
   enable_interrupts(INT_SSP);     
   enable_interrupts(GLOBAL);
   buffer[0x02] = 240;
   

   while(TRUE)
   {
     if (address ==  1)
      {
         output_high(pin_b0);
      }
   }
}