首次使用AT24C64的TWI总线读取数据,遇到一个问题,想请大家帮忙解答一下;
mcu:ATmega324pa;
eeprom:at24c64;
举个例子:
向eep24C64连续写入20个数据;然后读取这20个数据;比如写入数据为A1A2A3A4A5B1B2B3B4B5
如果首地址为0x0080的话,读去出来的数据是对的;
如果首地址为0x0090的话,读出来的数据只有16个数据是对的(16-0=16,0x00A0地址后的数据不正确
如果首地址为0x0084的话,读出来的数据也是对的;
如果首地址为0x0094的话,读出来的术只有12个数据是对的(16-4=12;
后发现是数据写入出现了问题
总结就是:
如果低八位地址的高4位为偶数,20个数据写入都正常;
如果低八位地址的高4位为奇数,20个数据部分写入不正常;
另外,我的程序是没有对TWI状态进行检查的,不知道这样做会不会有影响
以下是源程序:
void TWIStartFun(void) //启动
{
TWCR=(1<<TWINT)|(1<<TWEN)|(1<<TWSTA);
while(!(TWCR&(1<<TWINT)))
continue;
}
void TWIWriteByteFun(unsigned char TWIData) //写操作
{
TWDR=TWIData;
TWCR=(1<<TWINT)|(1<<TWEN);
while(!(TWCR&(1<<TWINT)))
continue;
}
unsigned char TWIReadByteFun(unsigned char N_ACK) //读操作
{
TWCR=N_ACK;
while(!(TWCR&(1<<TWINT)))
continue;
return(TWDR);
}
//写入N字节数据
void WriteNByteFun(unsigned char SLA_W,unsigned int Address,unsigned char DataNum,unsigned char *TWIDataPoi)
{
TWIStartFun();
TWIWriteByteFun(SLA_W); //器件写地址
if(SLA_W!=PCFSLA_W)
TWIWriteByteFun(Address>>8); //器件地址高8位(eep24c64)
TWIWriteByteFun(Address); //器件地址
for(;DataNum!=0x00;DataNum--)
TWIWriteByteFun(*TWIDataPoi++);
TWCR=(1<<TWINT)|(1<<TWEN)|(1<<TWSTO); //结束
if(SLA_W!=PCFSLA_W)
}
//读N字节数据
void ReadNByteFun(unsigned char SLA_R,unsigned int Address,unsigned char DataNum,unsigned char *TWIDataPoi)
{
TWIStartFun();
TWIWriteByteFun(SLA_R-1); //器件写地址
if(SLA_R!=PCFSLA_R)
TWIWriteByteFun(Address>>8); //地址高8位
TWIWriteByteFun(Address); //地址低8位
TWIStartFun();
TWIWriteByteFun(SLA_R); //器件读地址
if(DataNum>0x01)
{
do
{
*TWIDataPoi++=TWIReadByteFun((1<<TWINT)|(1<<TWEN)|(1<<TWEA));
}while(--DataNum>0x01);
}
*TWIDataPoi=TWIReadByteFun((1<<TWINT)|(1<<TWEN)); //接收最后一个数据
TWCR=(1<<TWINT)|(1<<TWEN)|(1<<TWSTO);
}
|