首页 | 新闻 | 新品 | 文库 | 方案 | 视频 | 下载 | 商城 | 开发板 | 数据中心 | 座谈新版 | 培训 | 工具 | 博客 | 论坛 | 百科 | GEC | 活动 | 主题月 | 电子展
返回列表 回复 发帖

AVR(ATMEGA_I2C,WTI功能)外部EEPROM_AT24C64读写

AVR(ATMEGA_I2C,WTI功能)外部EEPROM_AT24C64读写

评论 (0)分享到微博QQ微信LinkedIn/***************************AT24C头文件*************************/ #ifndef __i2c_24c64_H__
#define __i2c_24c64_H__
/****************************
I2C 状态定义
MT 主方式传输 MR 主方式接受
***************************/
#define START   0x08
#define RE_START  0x10
#define MT_SLA_ACK  0x18
#define MT_SLA_NOACK  0x20
#define MT_DATA_ACK  0x28
#define MT_DATA_NOACK 0x30
#define MR_SLA_ACK  0x40
#define MR_SLA_NOACK 0x48
#define MR_DATA_ACK  0x50
#define MR_DATA_NOACK 0x58
#define RD_DEVICE_ADDR 0xA1   //前4位器件固定,后三位看连线,最后1位是读写指令位
#define WD_DEVICE_ADDR 0xA0
/*常用TWI操作(主模式写和读)*/
#define Start()   (TWCR=(1<<TWINT)|(1<<TWSTA)|(1<<TWEN))   启动i2c
#define Stop()   (TWCR=(1<<TWINT)|(1<<TWSTO)|(1<<TWEN))   停止i2c
#define Wait()   {while(!(TWCR&(1<<TWINT)));}     等待中断发生
#define TestAck()  (TWSR&0xf8)        //观察返回状态
#define SetAck   (TWCR|=(1<<TWEA))        做出ack应答
#define SetNoAck  (TWCR&=~(1<<TWEA))        做出not="" ack应答
#define Twi()   (TWCR=(1<<TWINT)|(1<<TWEN))     启动i2c
#define Write8Bit(x) {TWDR=(x);TWCR=(1<<TWINT)|(1<<TWEN);}   p="" 写数据到twdr </TWINT)|(1<</TWINT)|(1<</TWINT)|(1<<TWSTO)|(1<</TWINT)|(1<<TWSTA)|(1<void twi_init(void);   //TWI初始化
uchar I2C_Write(uchar Wdata,uint RegAddress);//写一个字节
uchar I2C_Read(uint RegAddress);   //读一个字节
uchar I2C_Write_num(uchar *Wdata,uint RegAddress,uchar num);//写NUM个字节
#endif
/***************************AT24C64C文件*************************/
#include "config.h"
void twi_init(void)
{
    TWBR=0X20;
TWSR=0;
TWCR=0X44;
}
/*********************************************
I2C总线写一个字节
返回0:写成功
返回1:写失败
**********************************************/
uchar I2C_Write(uchar Wdata,uint RegAddress)
{
   Start();      //I2C启动
   Wait();
   if(TestAck()!=START)
   return 1;     //ACK
   
   Write8Bit(WD_DEVICE_ADDR); //写I2C从器件地址和写方式
   Wait();
   if(TestAck()!=MT_SLA_ACK)
   return 1;              //ACK
      
   Write8Bit(RegAddress/256);  //写器件相应寄存器地址  注意:与
  Write8Bit(RegAddress/256);                                                  24c02
   Wait();                                                                                   区
   if(TestAck()!=MT_DATA_ACK)                                              别
  return 1;                                                                                 在
         //ACK                                                                               这
      Write8Bit(RegAddress%256);
     Write8Bit(RegAddress%256);
     Wait();
     if (TestAck()!=MT_DATA_ACK)
return 1;
  
   Write8Bit(Wdata);     //写数据到器件相应寄存器
   Wait();
   if(TestAck()!=MT_DATA_ACK)
   return 1;        //ACK
   
   Stop();        //I2C停止
   delayms(100);    //延时
   return 0;
}
/*********************************************
I2C总线读一个字节
返回0:读成功
返回1:读失败
**********************************************/
uchar I2C_Read(uint RegAddress)
{
   uchar temp;
   Start();//I2C启动
   Wait();
   if (TestAck()!=START)
    return 1;      //ACK   
   
   Write8Bit(WD_DEVICE_ADDR); //写I2C从器件地址和写方式
   Wait();
   if (TestAck()!=MT_SLA_ACK)
    return 1;        //ACK
   
   Write8Bit(RegAddress/256);  //写器件相应寄存器地址
    Write8Bit(RegAddress/256);
  Wait();
   if (TestAck()!=MT_DATA_ACK)
  return 1;
  
    Write8Bit(RegAddress%256);
    Write8Bit(RegAddress%256);
     Wait();
     if (TestAck()!=MT_DATA_ACK)
return 1;
   
   Start();            //I2C重新启动
   Wait();
   if (TestAck()!=RE_START)  
    return 1;
   
   Write8Bit(RD_DEVICE_ADDR); //写I2C从器件地址和读方式
   Wait();
   if(TestAck()!=MR_SLA_ACK)  
    return 1;       //ACK
   
   Twi();         //启动主I2C读方式
   Wait();
   if(TestAck()!=MR_DATA_NOACK)
    return 1;     //ACK
   
   temp=TWDR;        //读取I2C接收数据
   Stop();          //I2C停止
   return temp;
}
/*********************************************
I2C总线写多个字节
返回0:写成功
返回1:写失败
**********************************************/
uchar I2C_Write_num(uchar *Wdata,uint RegAddress,uchar num)
{
   uchar j;
   Start();      //I2C启动
   Wait();
   if(TestAck()!=START)
   return 1;     //ACK
   
   Write8Bit(WD_DEVICE_ADDR); //写I2C从器件地址和写方式
   Wait();
   if(TestAck()!=MT_SLA_ACK)
   return 1;              //ACK
      
   Write8Bit(RegAddress/256);  //写器件相应寄存器地址
  Write8Bit(RegAddress/256);
   Wait();
   if(TestAck()!=MT_DATA_ACK)
  return 1;
         //ACK
      Write8Bit(RegAddress%256);
     Write8Bit(RegAddress%256);
     Wait();
     if (TestAck()!=MT_DATA_ACK)
return 1;
  for(j=0;j<NUM;J++)
    {
      Write8Bit(*Wdata);     //写数据到器件相应寄存器
      Wait();
      if(TestAck()!=MT_DATA_ACK)
      return 1;        //ACK
   Wdata++;
   RegAddress++;   //地址加1
   }  
      Stop();        //I2C停止
      delayms(100);    //延时
      return 0;
}</NUM;J++)


关键字:AVR  WTI功能  外部EEPROM  AT24C64读写
返回列表