PIC16F877 + 24LC64通过i2c

时间:2013-05-19 12:32:48

标签: pic i2c eeprom

我的任务是通过i2c总线将前255个字节从外部EEPROM(24LC64)复制到内部(PIC16F877)。我已经阅读了AN1488,所有数据表,MikroC gide(哦,是的,我正在使用MikroC),但绝望..意思是我的代码试图读取smtng然后,在程序员(无法读取)读取我的PIC的eeprom 24LC64,所以我甚至不知道它上面有什么,但是它有防静电,它与我得到的有所不同,而且我将所有的EEPROM填充为“A2”或“A3”。我的猜测是它是第一个addr,我正在通过它解决24LC64问题。你可以检查一下我的代码(它很小=))并指出我的错误。

char i;
unsigned short Data;

void main(){
   PORTB = 0;
   TRISB = 0;
   I2C1_Init(100000);
   PORTB = 0b00000010;

   for (i = 0x00; i<0xFF; i++) {
      I2C1_Start();
      I2C1_Wr(0xA2); //being 1010 001 0
      //I'm getting full internal EE filled with what's in brackets from above
      I2C1_Wr(0b00000000);
      I2C1_Wr(i);
      I2C1_Repeated_Start();
      I2C1_Wr(0xA3); //being 1010 001 1
      Data = I2C1_Rd(0);
      I2C1_Stop();

      EEPROM_write(i, Data);  //How could that 1010 001 0 get into here???

      Delay_100ms();
   }

   PORTB = 0b00000000;

   while (1) {

   }
} 

P.S。我已经尝试了sequantial读取,但它“读取”(再次说“A2”..)只有第一个字节..所以我发布了这个..

P.S.S。我在“硬件”工作,没有Proteus参与..

P.S.S.S。我无法测试写作,因为我只有一个24LC64,上面有重要的信息,所以它的WP引脚甚至可以达到Vcc ......

1 个答案:

答案 0 :(得分:1)

这不是一个特定的答案,而是更多的I2C通信清单,因为如果不查看范围并且没有深入研究您提供的API调用,很难帮助解决您的问题。

  1. 检查EEPROM的地址。 I2C使用一个7位地址,并在末尾附加一个R / W位,所以在这里很容易出错。
  2. 检查EEPROM期望接收的“数据读取”命令序列
  3. 检查您使用的I2C_ API如何处理来自EEPROM的确认。它们需要在某个地方处理(通常在ISR中),并且从你的例子中处理它们的位置并不明显。
  4. 根据您的设计要求检查SDA和SCL上是否有正确的上拉电阻 - I2C需要它们工作。