两个16F873 I2C通信寻址

时间:2016-03-22 12:38:52

标签: pic i2c

我正在尝试使用I2C在2 16F873之间进行通信。我有线;

  • SDA> SDA(使用3.3k电阻上拉)
  • SCL> SCL(用3.3k电阻上拉)
  • GND> GND(通用)
  • 在x2 22pF电容上使用4Mhz晶体到OSC1和OSC1引脚。
  • 5V,10k电阻连接到MCLR *引脚。

以下是主代码和从代码,它们发送“0xFF”数据以将所有B引脚设置为高电平。我将带有220欧姆电阻的LED连接到这些b引脚中的任何一个,但是看不到LED灯。

因此假设我遇到了从站的寻址问题。当我从数据表中读取时,从机的地址是7位,最后一位(位0)表示数据从主机到从机(对于lsb 0)。这就是主人说0x20和从地址是0x10的原因。 (0被添加为LSB)。

我是否必须添加其他寄存器位来设置其他内容?这里有什么问题。

我用PIC C编译器(5.007)编译了所有代码 主码

#include <main.h>

void main()
{

i2c_start();
i2c_write(0x20);//slave address
i2c_write(0xFF);//data
i2c_stop();

 while(TRUE)
   {
      //TODO: User Code
   }

}

Main.h(主人)

#include <16F873.h>
#device ADC=16

#FUSES NOWDT                    //No Watch Dog Timer
#FUSES NOBROWNOUT               //No brownout reset
#FUSES NOLVP                    //No low voltage prgming, B3(PIC16) or B5(PIC18) used for I/O

#use delay(crystal=4MHz)
#use i2c(Master,Slow,sda=PIN_C4,scl=PIN_C3)

从属代码

#include <main.h>

#use i2c(Slave,Slow,sda=PIN_C4,scl=PIN_C3,address=0x1d)
#INT_SSP                      //Interrupt for I2C activity

 int8 data;
  void sspinterupt()
  { 

  int8 state;

      state = i2c_isr_state();

      if(state < 0x80)           //Master is sending data
     {
        data = i2c_read();      //An array will be needed to store data if more than one byte is transferred
     }
      if(state == 0x80)          //Master is requesting data
     {
        i2c_write(data);
     } 

  }

void main()
{
  set_tris_b(0x00);
  enable_interrupts(INT_SSP);
  enable_interrupts(GLOBAL);

   while(TRUE)
   {  

   output_b(data); //Output data to port B to visualize

   }
}

Main.h(奴隶)

#include <16F873.h>
#device ADC=16

#FUSES NOWDT                    //No Watch Dog Timer
#FUSES NOBROWNOUT               //No brownout reset
#FUSES NOLVP                    //No low voltage prgming, B3(PIC16) or B5(PIC18) used for I/O

#use delay(crystal=4MHz)

Proteus Design

Proteus Design

0 个答案:

没有答案