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; }
|