tt163 发表于 2015-10-29 12:30

I2C地址设置

现在用28335与EEPROM通过I2C通信。程序在AT24C02上面测试OK,但是在AT24C256上,读写不正常。原因是24C02是8位地址访问,24C256是16为地址访问。但是现在程序怎么改,请大家给点建议。谢谢

tt163 发表于 2015-10-29 12:31

Uint16 WriteData(Uint16        *Wdata, Uint16 RomAddress, Uint16 number)
{
   Uint16 i;
   if (I2caRegs.I2CSTR.bit.BB == 1)
   {
      return I2C_BUS_BUSY_ERROR;
   }
   while(!I2C_xrdy());
   I2caRegs.I2CSAR = 0x50;
   I2caRegs.I2CCNT = number + 1;
   I2caRegs.I2CDXR = RomAddress;
   I2caRegs.I2CMDR.all = 0x6E20;
   for (i=0; i<number; i++)
   {
      while(!I2C_xrdy());
      I2caRegs.I2CDXR = *Wdata;
      Wdata++;
       if (I2caRegs.I2CSTR.bit.NACK == 1)
                     return        I2C_BUS_BUSY_ERROR;
   }       
   return I2C_SUCCESS;   
}

Uint16 ReadData(Uint16*RamAddr, Uint16        RomAddress, Uint16 number)
{
   Uint16i,Temp;

   if (I2caRegs.I2CSTR.bit.BB == 1)
   {
       return I2C_BUS_BUSY_ERROR;
   }
   while(!I2C_xrdy());
   I2caRegs.I2CSAR = 0x50;
   I2caRegs.I2CCNT = 1;
   I2caRegs.I2CDXR = RomAddress;
   I2caRegs.I2CMDR.all = 0x6620;
   if (I2caRegs.I2CSTR.bit.NACK == 1)
                   return        I2C_BUS_BUSY_ERROR;
   DELAY_US(50);               
   while(!I2C_xrdy());
   I2caRegs.I2CSAR = 0x50;
   I2caRegs.I2CCNT = number;       
   I2caRegs.I2CMDR.all = 0x6C20;
   if (I2caRegs.I2CSTR.bit.NACK == 1)
                   return        I2C_BUS_BUSY_ERROR;
   for(i=0;i<number;i++)
   {
      while(!I2C_rrdy());
             Temp = I2caRegs.I2CDRR;
       if (I2caRegs.I2CSTR.bit.NACK == 1)
                     return        I2C_BUS_BUSY_ERROR;
             *RamAddr = Temp;
             RamAddr++;
   }
   return I2C_SUCCESS;
}

Uint16        I2C_xrdy()
{
        Uint16        t;
        t = I2caRegs.I2CSTR.bit.XRDY;
        return t;
}

Uint16        I2C_rrdy()
{
        Uint16        t;
        t = I2caRegs.I2CSTR.bit.RRDY;
        return t;
}

tt163 发表于 2015-10-29 12:34

目前调用函数为
AT24C02中
   WriteData(dat,0x60,8);
    DELAY_US(10000);
    ReadData(dat1,0x60,8);
测试Ok
目前调用函数为
WriteData(dat,0x0060,8);
    DELAY_US(10000);
    ReadData(dat1,0x0060,8);
读写都是错误。
   把I2caRegs.I2CCNT = 1;改为2也是错的
把 I2caRegs.I2CDXR = RomAddress; 改为高低地址,分别送也是错的

tt163 发表于 2015-10-30 09:59

怎么没人回复啊!自己把它顶上去
页: [1]
查看完整版本: I2C地址设置