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

发布者:数字梦想最新更新时间:2016-10-19 来源: eefocus关键字:AVR  WTI功能  外部EEPROM  AT24C64读写 手机看文章 扫描二维码
随时随地手机看文章
/***************************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< #define Stop()   (TWCR=(1< #define Wait()   {while(!(TWCR&(1< #define TestAck()  (TWSR&0xf8)        //观察返回状态
#define SetAck   (TWCR|=(1< #define SetNoAck  (TWCR&=~(1< #define Twi()   (TWCR=(1< #define Write8Bit(x) {TWDR=(x);TWCR=(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    {
      Write8Bit(*Wdata);     //写数据到器件相应寄存器
      Wait();
      if(TestAck()!=MT_DATA_ACK) 
      return 1;        //ACK 
   Wdata++;
   RegAddress++;   //地址加1
   }  
      Stop();        //I2C停止
      delayms(100);    //延时
      return 0;
}

关键字:AVR  WTI功能  外部EEPROM  AT24C64读写 引用地址:AVR(ATMEGA_I2C,WTI功能)外部EEPROM_AT24C64读写

上一篇:AVR单片机外部中断INT0示例
下一篇:AVR串口通信程序RS232头文件

推荐阅读最新更新时间:2024-03-16 15:16

基于AVR微控制器的电力机车智能辅保系统的实现
    摘要: 给出了以AVR微控制器为核心的电力机车智能辅保系统的设计方案,并介绍了系统硬件及软件的具体实现方法。     关键词: 智能辅保系统 AVR微控制器 硬件 软件 电气机车辅助系统中有劈相机、空气压缩机、通风机及制动风机等各种类型的电机。运行中为了防止出现短路、过流等异常情况而烧毁电机,通常配置辅助保护系统,起到及时监测电机故障并加以处理的作用。目前电力机车上安装的辅保系统都是模拟电路装置,系统硬件复杂,又不方便司机使用和维修。因此,设计一种实时性高、性能可靠的智能辅保系统替代原有的模拟电路装置势在必行。本文将介绍笔者开发的用于韶山型电力机车的智能辅助保护系统的设计及实现。 1 系统的主要功能
[嵌入式]
AVR单片机—(五)、ATMEGA16的USART与PC机串行通信—01(补充)
//------------------------------------------------------------------------------ //ATMEGA16与PC机的通信实验1 //PC机发送一个字符给单片机,单片机收到后既在发光二极管进行显示,同时将其回传给PC //单片机的发送和接收都采用查询方式 #include ioavr.h #include intrinsics.h #include delayics.h //------------------------------------------------------------------------------ typedef u
[单片机]
<font color='red'>AVR</font>单片机—(五)、ATMEGA16的USART与PC机串行通信—01(补充)
AVR Option -H must not be defined more than once: -H1895 【已解决】
在使用IAR for AVR 5.40 做mega128的开发时,编译出现如下提示 原因分析: -H 在AVR编译器中设置过一次,在option文件中也设置过,造成冲突。 如下options文件中内容 /* Fill unused interrupt vector‘s with RETI */ -H1895 -h(CODE)0-_..X_INTVEC_SIZE 解决办法 在general Options中去掉 Initialize unused interruupt vectors with RETI instruction ,如下
[单片机]
<font color='red'>AVR</font> Option -H must not be defined more than once: -H1895 【已解决】
AVR单片机解密技术分析
一般说来,AVR与传统类型的单片机相比,在IC芯片解密技术中除了必须能实现原来的一些基本的功能,其在结构体系、功能部件、性能和可靠性等多方面有很大的提高和改善。能破解的AVR单片机都是小芯片/小程序(直接说就是模仿其功能而新开发新程序),因此解密难度都是不是很大。因而本文探讨的就是AVR单片机解密技术分析,以及如何防止解密。 AVR单片机解密技术分析 AVR单片机攻击者借助专用设备或者自制设备,利用单片机芯片设计上的漏洞或软件缺陷,通过多种技术手段,就可以从芯片中提取关键信息,获取单片机内程序,这就是AVR芯片解密。 针对AVR系列单片机解密,世纪芯集成电路下的芯片解密实验室均进行了系统化的技术研究和破解,在AVR单片机解密领
[单片机]
<font color='red'>AVR</font>单片机解密技术分析
使用eclipse Arduino IDE开发 AVR程序
小白写程序都是用eclipse的,所以学习Arduino时自然就想用eclipse,因为俺懒,这样省事。网上找了些帖子看看,感觉开发环境都比较麻烦,这样不符合俺这种懒人的风格,所以我弄了个简单点的。 第一步:下载各种东西 1、JDK,这个去oracle官网下就好了(其实百度下载更快)http://download.oracle.com/otn-pub/java/jdk/8u20-b26/jdk-8u20-windows-x64.exe。 2、eclipseArduinoIDE,http://eclipse.baeyens.it/download.php 3、arduino-1.5.6-r2http://www.arduino.cc
[单片机]
使用eclipse Arduino IDE开发 <font color='red'>AVR</font>程序
avr mega8 PWM 超声发射试验程序
// 采用硬件件定时器产生宽度可调PWM信号 //ICC-AVR application builder : 2020/3/23 10:29:05 // Target : M8 // Crystal: 11.059Mhz // #include iom8v.h #include macros.h // #define FG1 0xFEED // 20KHz // #define FG2 0x0113 // #define FG1 0xA99C // 500HZ #define FG2 0x5664 // unsigned char rtu0=0; //////////////////////////////
[单片机]
基于AVR单片机的智能家届监控系统
0 引言 随着科技的发展和人民生活水平的提高,智能家居成为了一个热门的研究领域。智能家居问题中面临的主要问题就是安全防盗、电器控制等问题。智能家居不仅能够完成出现问题对主人进行的报警功能,还应提供智能家居设备执行主人的命令操作,比如通过手机或是平板电脑等终端控制电器进行做饭或是空气清洁等工作。 因此,智能家居中用到的传感器主要有红外传感器、门磁传感器、实时时钟芯片等。 1 家居监控系统工作原理 系统主要由门磁报警、红外传感器报警、煤气传感器报警、正常工作、用户命令执行动作构成。 1.1 门磁报警 门磁系统完成对门出入安全的监测,主要有磁铁和干簧管组成。当主人离开房子的时候可以启动防盗功能,如果两者保持正对,那么在
[单片机]
基于<font color='red'>AVR</font>单片机的智能家届监控系统
五大单片机全解析--51、AVR、PIC、MSP430、ARM
当今单片机厂商琳琅满目,产品性能各异。针对具体情况,我们应选何种型号呢?首先,我们来弄清两个概念:集中指令集(CISC)和精简指令集(RISC)。采用CISC结构的单片机数据线和指令线分时复用,即所谓冯。诺伊曼结构。它的指令丰富,功能较强,但取指令和取数据不能同时进行,速度受限,价格亦高。采用RISC结构的单片机数据线和指令线分离,即所谓哈佛结构。这使得取指令和取数据可同时进行,且由于一般指令线宽于数据线,使其指令较同类CISC单片机指令包含更多的处理信息,执行效率更高,速度亦更快。同时,这种单片机指令多为单字节,程序存储器的空间利用率大大提高,有利于实现超小型化。 8051 AVR和pic都是跟8051结构不同的8位单片机,
[单片机]
五大单片机全解析--51、<font color='red'>AVR</font>、PIC、MSP430、ARM
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved