Board logo

标题: 主从PIC单片机I2C通信 [打印本页]

作者: yumuzi    时间: 2010-9-1 08:55     标题: 主从PIC单片机I2C通信

主从PIC单片机I2C通信


主从PIC单片机I2C通信主的程序为
#i nclude <18F4523.h>                             // PICF4523 header file
#device ADC=12                                   // 12 bits ADC
#use delay(clock=4000000)                       // for 4Mhz crystal
#fuses XT, NOWDT, NOPROTECT, NOLVP               // for debug mode
#use rs232(baud=9600, xmit=PIN_C6, rcv=PIN_C7, Parity=N, Bits=8, ERRORS)
#use i2c(Master, sda=PIN_C4, scl=PIN_C3,FORCE_HW)
void main()
{
        int8 data;
        int8 buffer[10];
        
//        putc( 0x11 );
//        putc( 0x22 );
//        putc( 0x33 );
//        putc( 0x44 );
//        putc( 0x55 );
//        putc( 0x66 );
        // Write the letter 'B' to the slave board.
        while(true)
        {
        i2c_start();
        i2c_write(0xa1);
        //i2c_write(0x00);
        //data=i2c_read(0);
        buffer[0] = i2c_read();
        buffer[1] = i2c_read();
        buffer[2] = i2c_read();
        buffer[3] = i2c_read();
        buffer[4] = i2c_read(0);
//        buffer[5] = i2c_read();
//        buffer[6] = i2c_read();
//        buffer[7] = i2c_read(0);
   
        i2c_stop();
        //lcd_putc(data);
        
        delay_ms(2);
        //printf("read %c \n\r", data);
        // putc( data );
        
        putc( buffer[0] );
        putc( buffer[1] );
        putc( buffer[2] );
        putc( buffer[3] );
        putc( buffer[4] );
//        putc( buffer[5] );
//        putc( buffer[6] );
//        putc( buffer[7] );
        
        delay_ms( 2000 );   
        }
        //while(1);   
}
从的程序为
#i nclude <16F877.h>
#fuses XT,NOWDT,NOPROTECT,NOLVP
#use delay(clock=4000000)
#use rs232(baud=9600, xmit=PIN_C6, rcv=PIN_C7)

#use i2c(SLAVE, SDA=PIN_C4, SCL=PIN_C3, address=0xa0)
//BYTE address;
BYTE buffer[10] = {0x11,0x22,0x33,0x44,0x55,0x66,0x77,0x88,0x99};
#INT_SSP
void ssp_interupt ()
{
   BYTE state,dummy;
   state = i2c_isr_state();
   if(state >= 0x80)                     //Master is requesting data
   {
      i2c_write(buffer[state - 0x80]);
   }
   else
   {
      dummy=i2c_read();    //this line is to avoid locking the bus in case of a write
   }
}
void main ()
{
   enable_interrupts(GLOBAL);
   enable_interrupts(INT_SSP);
   while (TRUE) {}
}




欢迎光临 电子技术论坛_中国专业的电子工程师学习交流社区-中电网技术论坛 (http://bbs.eccn.com/) Powered by Discuz! 7.0.0