PIC单片接I2C通信问题请教

[复制链接]
3334|10
 楼主| 46621295 发表于 2009-2-12 22:24 | 显示全部楼层 |阅读模式
PIC18F6720通过I2C总线对一片外部数据存储芯片进行数据写入和读出,但现在程序在一种情况下就出错,即如果连续写入的字节数目大于64时,从第65个字节开始数据根本没有被写入。比如,我要从地址0x100开始写入共67个字节的数据,1~64都是正确的(即0x100~0x139),第65、66、67字节是没有写入的(即0x140、0x141、0x142)。

另外,发现如果我在第64个字节时关闭I2C,然后马上再次开启I2C,将起始定义地址赋值为0x140,执行剩余的三次写入,则0x140、0x141、0x142的数据可被正确写入。

存储地址是没有超出边界,并且我如果不用连续写入,而是单字节对上述出错的地址写入就没任何问题。

原来不能正确写入的程序如下:

void EEPageWrite(unsigned int address,unsigned char number) 


 unsigned int temp;
 unsigned char j;
 temp=address;
 IICEEHADDR=temp>>8;
 IICEELADDR=temp&0xFF;
 IICEEDATA=*data;
 p_LC515WP=0;

 IdleI2C();

 StartI2C();
 
 WakeI2C(0xA0|I2C_CS);
 
 WriteI2C(IICEEHADDR);
 
 WriteI2C(IICEELADDR);
 
 for(j=1;j<=number;j++)
 {
  WriteI2C(0x4a);
  data++;
 } 
 
 StopI2C();
 p_LC515WP=1;

}

能正确写入的程序如下:

void EEPageWrite(unsigned int address,unsigned char number) 


 unsigned int temp;
 unsigned char j;
 temp=address;
 IICEEHADDR=temp>>8;
 IICEELADDR=temp&0xFF;
 IICEEDATA=*data;
 p_LC515WP=0;

 IdleI2C();

 StartI2C();
 
 WakeI2C(0xA0|I2C_CS);
 
 WriteI2C(IICEEHADDR);
 
 WriteI2C(IICEELADDR);
 
 for(j=1;j<=number-3;j++)
 {
  WriteI2C(0x4a);
  data++;
 } 
 
 StopI2C();
 p_LC515WP=1;
 
 //
 temp=address+64;
 IICEEHADDR=temp>>8;
 IICEELADDR=temp&0xFF;
 IICEEDATA=0x4a;
 p_LC515WP=0;

 IdleI2C();

 StartI2C();
 
 WakeI2C(0xA0|I2C_CS);
 
 WriteI2C(IICEEHADDR);
 
 WriteI2C(IICEELADDR);
 
 for(j=1;j<=3;j++)   //如果循环条件改成(j=number-2;j<=number;j++)也能正确写入数据!!
 {
  WriteI2C(0x4a);
  data++;
 } 
 
 StopI2C();
 p_LC515WP=1;
}
sz_kd 发表于 2009-2-12 22:32 | 显示全部楼层

是不是超边界了,看看DateSheet吧

 楼主| 46621295 发表于 2009-2-12 23:23 | 显示全部楼层

实验新发现问题

实验新发现问题:如果起始地址address在0x100~0x10f之间,则从0x140开始就不能正确写入。我为了检查0x140地址是否有问题,将起始地址address设置为0x140,结果是0x140可正确写入,但从0x180开始又出现不能正确写入的情况。这是怎么回事,我用的存储芯片是24lc515.
呆板书生 发表于 2009-2-13 08:27 | 显示全部楼层

跨页问题

建议楼主再看看eeprom的datasheet
yewuyi 发表于 2009-2-13 08:37 | 显示全部楼层

你用什么都一样

ayb_ice 发表于 2009-2-13 09:04 | 显示全部楼层

LZ有没有页操作概念

zhaoyu2005 发表于 2009-2-13 10:39 | 显示全部楼层

有24C515么?

没听说过!看下资料都能解决的问题也来问,有这个时间早就解决了
雁舞白沙 发表于 2009-2-13 11:25 | 显示全部楼层

64字节一页

需要自己判断是否跨页的问题!
 楼主| 46621295 发表于 2009-2-13 11:38 | 显示全部楼层

如果跨页的话,需要关闭I2C后再次开启执行写入操作吗?

谢谢!
zg_z 发表于 2009-2-13 11:56 | 显示全部楼层

不需要

 楼主| 46621295 发表于 2009-2-13 15:14 | 显示全部楼层

除了上面分两次写如的方法,还有其他简单实现的方法吗?

您需要登录后才可以回帖 登录 | 注册

本版积分规则

56

主题

100

帖子

1

粉丝
快速回复 在线客服 返回列表 返回顶部