⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 24cxx.h

📁 24IIC的源代码
💻 H
字号:
/*------------------------------------------------------------------

------------------------------------------------------------------*/
#define Start()     (TWCR=(1<<TWINT)|(1<<TWSTA)|(1<<TWEN))   
#define Stop()      (TWCR=(1<<TWINT)|(1<<TWSTO)|(1<<TWEN)) //总线上起动停止条件
#define Wait()      {while(!(TWCR&(1<<TWINT)));} 
#define TW_STATUS	(TWSR&0xf8)
#define Twi()       (TWCR=(1<<TWINT)|(1<<TWEN)) 

//写入数据,器件型号model,器件地址DevAddr,开始地址addr,数据*P_data,数据长度num
unsigned char AT24CxxWrite(unsigned int model,unsigned char DevAddr,unsigned int addr,unsigned char *P_data,unsigned char num);
//读数据,器件型号model,器件地址DevAddr,地址addr,存放到 *P_data,数据长度num
unsigned char AT24CxxRead(unsigned int model,unsigned char DevAddr,unsigned int addr,unsigned char *P_data,unsigned char num);

//总线上起动开始条件 
unsigned char twi_start(void) 
{
 Start(); 
 Wait();
 delay_us(100);
 return TW_STATUS; 
}

//写一字节 
unsigned char twi_writebyte(unsigned char c) 
{
 TWDR=c; 
 Twi(); 
 Wait(); 
 delay_us(100);
 return TW_STATUS; 
}

//读一字节 ack: true时发ACK,false时发NACK 
unsigned char twi_readbyte(unsigned char *c ,unsigned char ack) 
{
 unsigned char tmp=(1<<TWINT)|(1<<TWEN); 
 if(ack) tmp|=(1<<TWEA); 
 TWCR=tmp;
 Wait(); 
 delay_us(100);
 *c=TWDR; 
 return TW_STATUS; 
}

//写入数据,器件型号model,器件地址DevAddr,开始地址addr,数据*P_data,数据长度num
unsigned char AT24CxxWrite(unsigned int model,unsigned char DevAddr,unsigned int addr,unsigned char *P_data,unsigned char num)
{
 unsigned char i,temp,*p,ICerror=0,page_size;
 unsigned long next_page_start_addr;
 if(model<=2)
  page_size=8;
 else if(model<32)
  page_size=16;
 else if(model<128)
  page_size=32;
 else if(model<512)
  page_size=64;
 else 
  page_size=128;
 next_page_start_addr=model;
 next_page_start_addr<<=7;//总容量
 while(next_page_start_addr)
 {
  next_page_start_addr-=page_size;
  if(next_page_start_addr<=addr)
  {
   next_page_start_addr+=page_size;
   break;
  }
 }

 Wagain:
  p=P_data;
 i=num;//数据个数
 if(ICerror<10)
  ICerror++;
 else 
  goto Wstop;
 twi_start(); //启动
 temp=0xa0+(DevAddr<<1);
 if(model<16) 
  temp+=((addr>>7)&0x0e);//器件24c32以下地址高位
 if(twi_writebyte(temp)!=0x18)// //头字节
 goto Wagain;
 if(model>16) //写器件24c32以上地址高位
 {
  if((twi_writebyte(addr>>8)!=0x28))//
  goto Wagain;
 }
 if((twi_writebyte(addr&0xff)!=0x28)) //写地址低位
 goto Wagain;
 while(i)//写入数据i个
 {
  i--;
  if(twi_writebyte(*(p++))!=0x28)//
  goto Wagain;
  addr++;
  if(addr==next_page_start_addr)break;
 }
 Wstop:
  Stop();
 if(i)//写到了页末,重新开始写新一页
 { 
  delay_ms(50);
  num=i;
  P_data=p;
  next_page_start_addr+=page_size;
  if(addr==model*128)
  {
   addr=0;
   next_page_start_addr=page_size;
  }
  goto Wagain;
 }
 return ICerror;
}

//读数据,器件型号model,器件地址DevAddr,地址addr,存放到 *P_data,数据长度num
unsigned char AT24CxxRead(unsigned int model,unsigned char DevAddr,unsigned int addr,unsigned char *P_data,unsigned char num)
{
 unsigned char temp,*p,ICerror;
 p=P_data;
 ICerror=AT24CxxWrite(model,DevAddr,addr,0,0);
 temp=0xa0+(DevAddr<<1);
 if(model<16) 
  temp+=((addr>>7)&0x0e);//器件24c32以下地址高位
 Ragain2:
  if(ICerror<10)
   ICerror++;
  else 
   goto Rstop;
 twi_start(); //
 if(twi_writebyte(temp|1)==0)
  goto Ragain2;
 while(num--)
 {
  twi_readbyte(p,num); 
  p++;
 }
 Rstop:
  Stop(); 
 return(ICerror);
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -