| 
 
| 首次使用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);
 }
 
 
 
 
 
 | 
 |