0

我的任务是通过 i2c 总线将前 255 个字节从外部 EEPROM(24LC64)复制到内部(PIC16F877)。我已经阅读了 AN1488、所有数据表、MikroC gide(哦,是的,我正在使用 MikroC),但没有希望.. 这意味着我的代码试图读取 smtng 但是然后,在程序员处读取我的 PIC 的 eeprom(无法读取24LC64,所以我什至不知道上面有什么,但肯定有 smtng,它与我得到的不同),我得到的所有 EEPROM 都由“A2”或“A3”填充。我的猜测是它是第一个地址,我通过它寻址到 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) {

   }
} 

PS我已经尝试过使用连续读取,但它“读取”(再次是“A2”..)只有第一个字节..所以我发布了这个..

PSS 我在“硬件”工作,不涉及 Proteus。

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

4

1 回答 1

1

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

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