AT24C02操作方法及程序(含时序图)

合集下载

I2C总线协议AT24c02程序

I2C总线协议AT24c02程序

I2C总线协议(AT24c02)程序主:STC89C54从:AT24C02电路图时序图下面是代码#include ;#define uchar unsigned char#define addr_x 0xae//写#define addr_d 0xaf//读sbit sda = P2^1;//数据管脚sbit scl = P2^0;//时钟管脚bit ack;void DelayUs2x(unsigned char t)//延时1{while(--t);}void DelayMs(unsigned char t)//延时2{ while(t--){ //大致延时1mS DelayUs2x(245); DelayUs2x(245);}}void delay() //延时大于4μs{;;}void i2_qs()//起始信号{sda = 1;//拉高数据scl = 1;//拉高时钟delay();//延时大于 4μssda =0;//拉低数据产生起始信号(下降沿)delay();//延时大于 4μsscl = 0;//拉低时钟delay();//延时大于4μs}void i2_tz()//停止信号{sda = 0;//拉低数据scl = 1;//拉高时钟delay();//延时大于 4μssda = 1;//拉高时钟产生结束信号(上升沿)delay();//延时大于4μs}void i2_ack(bit _ack)//入口产生 0 ack 1nak{sda = _ack;//ack或者nakscl = 1;//拉高时钟delay();//延时大于 4μsscl = 0;//拉低时钟delay();//延时大于 4μs}void i2_fs(uchar Data) //发送8位数据{uchar i;for(i=0;i<8;i++)//8位计数{Data <<= 1;//把最高位移送到进制标志位中(CY)sda = CY;//把进制位中的数据赋值给数据线scl = 1;//拉高时钟delay();//延时大于 4μsscl = 0;//拉低时钟//这里}//下面代码是接收ACK的代码delay();//延时大于4μssda = 1;//拉高数据准备接收ACKscl = 1;//拉高时钟产生稳定的有效的数据(相对的)if(sda==1)//确认接收的是ACK还是NAKack = 0;//ackelseack = 1;//nakscl = 0;//拉低时钟delay();//延时大于 4us}uchari2_js()//接收8位数据{uchar i,Data = 0;sda = 1;//使能内部上拉,准备读取数据for(i=0;i<8;i++)//8位计数器{Data <<= 1;//移出数据的最高位scl = 1;//拉高时钟delay();//延时大于 4usData |= sda;//接收数据scl = 0;//拉低时钟delay();//延时大于 4us}return Data;}void i2_sj_x(uchar addr,uchar Data)//往设备内写入数据(参数 1、寄存器地址 2、写入的数据){i2_qs();//起始信号i2_fs(addr_x);//设备地址+写信号i2_fs(addr);//寄存器内部地址i2_fs(Data);//写入设备的数据i2_tz();//停止信号}uchar i2_sj_d(uchar addr)//读取数据(参数寄存器地址){ucharData;i2_qs();//起始信号i2_fs(addr_x);//设备地址+写信号i2_fs(addr);//寄存器内部地址i2_qs();//起始信号i2_fs(addr_d);//设备地址+读信号Data =i2_js();//读取数据i2_ack(0);//ACK应答i2_tz();//停止信号return Data;//返回读取的数据}voidmain(void){uchar dat;i2_sj_x(3,0x0f); //数据写入24c02DelayMs(50);dat = i2_sj_d(3); //从24c02中读取数据P1 = dat;//使用8个LED显示读出的数据while(1){;}}以上代码只是简单的实现I2C总线的读写。

AT24C02EEPROM读写程序

AT24C02EEPROM读写程序

;--------------------------------------------------------------------------------------------------------------------- ;本程序是针对AT89S52单片机编制的EEPROM读写程序(2013.8.4测试通过);本程序在4MHZ、12MHZ和24MHZ分别测试通过;AT24C02的A0、A1、A2均接GND,设备地址高7位为(1010)000;WP接GND,充许对EEPROM正常读写;本程序仅作学习交流之用。

;--------------------------------------------------------------------------------------------------------------------- SCl equ P2.0 ;SCL接A T89S52的P2.0端口,作为EEPROM的串行输入时钟SDA equ P2.1 ;SDA接AT89S52的P2.1端口,作为主机与EEPROM之间信息串行传输总线WRITEDATA equ 08H;拟写入EEPROM的数据在主机中的存贮单元地址READDATA equ 09H ;从EEPROM读取的数据存放到主机存贮单元地址EPROMADDRESS equ 0AH;拟随机读写EEPROM的存贮单元地址;------------------------------------------------ORG 00HLJMP MAIN;------------------------------------------------ORG 50HMAIN: MOV SP,#20H;防止堆栈影响已用内存数据;以下为写EEPROM过程mov EPROMADDRESS,#09H;该地址可以随意输入(00H~FFH),但读和写的地址须相同MOV WRITEDA TA,#01010010B;该数字可以随意输入,并将读和写的数据进行比较;如读数正确则按将读出数据在P1口输出,可在P1口各位分别接LED灯直观显示出来。

24c02读写程序

24c02读写程序

E2PROM芯片24C02的读写程序一、实验目的:给24C02的内部RAM写入一组数据,数据从24C02内部RAM的01h开始存放。

然后再把这组数据读出来,检验写入和读出是否正确。

在这里我们给24C02中写入0、1、2的段码,然后把它读出来,送到数码管显示。

二、理论知识准备:上面两个实验主要学习的是利用单片机的串口进行通讯,本实验要介绍的是基于I2C总线的串行通讯方法,下面我们先介绍一下I2C总线的相关理论知识。

(一)、I2C总线概念I2C总线是一种双向二线制总线,它的结构简单,可靠性和抗干扰性能好。

目前很多公司都推出了基于I2C总线的外围器件,例如我们学习板上的24C02芯片,就是一个带有I2C总线接口的E2PROM存储器,具有掉电记忆的功能,方便进行数据的长期保存。

(二)、I2C总线结构I2C总线结构很简单,只有两条线,包括一条数据线(SDA)和一条串行时钟线(SCL)。

具有I2C接口的器件可以通过这两根线接到总线上,进行相互之间的信息传递。

连接到总线的器件具有不同的地址,CPU根据不同的地址进行识别,从而实现对硬件系统简单灵活的控制。

一个典型的I2C总线应用系统的组成结构如下图所示(假设图中的微控制器、LCD驱动、E2PROM、ADC各器件都是具有I2C总线接口的器件):我们知道单片机串行通讯的发送和接收一般都各用一条线TXD和RXD,而I2C总线的数据线既可以发送也可以接受,工作方式可以通过软件设置。

所以,I2C总线结构的硬件结构非常简洁。

当某器件向总线上发送信息时,它就是发送器,而当其从总线上接收信息时,又成为接收器。

(三)、I2C总线上的数据传送下面我们看看I2C总线是如何进行数据传送的。

我们知道,在一根数据线上传送数据时必须一位一位的进行,所以我们首先研究位传送。

1、位传输I2C总线每传送一位数据必须有一个时钟脉冲。

被传送的数据在时钟SCL的高电平期间保持稳定,只有在SCL低电平期间才能够改变,示意图如下图所示,在标准模式下,高低电平宽度必须不小于4.7us。

I2C总线at24c02芯片使用说明

I2C总线at24c02芯片使用说明

3.2.5 密码储存电路密码储存电路采用I2C总线at24c02存储芯片存放密码,可实现断电密码不消失,at24c02存储芯片可长期存储信息,可上百万次以上重新擦写。

图3-5 密码储存电路2.4.3 I2C总线密码存储芯片at24c02介绍图2-3 at24c02引脚图(1)引脚功能介绍及相关知识WP:写保护引脚,将该引脚接VCC,E2PROM就实现写保护(只读)。

引脚接地或悬空,可以对器件进行读写操作。

SCL:串行时钟引脚,串行输入输出时该引脚用于输入时钟。

SDA:串行数据输入输出引脚,用来输入输出数据,该引脚为射极开路输出,需接上拉电阻。

(2)I2C总线协议只有总线非忙时才被允许进行数据传送,在传送时,当时钟线为高电平,数据线必须为固定状态,不允许有跳变。

时钟线为高电平时数据线的任何电平变化将被当作总线的启动或停止条件。

(3)起始条件起始调教必须在所有操作命令之前发送。

时钟线保持高电平期间,数据线电平从高到低跳变作为I2C总线的启动信号。

CAT24Cxxx一直监视SDA和SCL电平信号,直到条件满足时才响应。

(4)停止条件时钟线保持高电平期间,数据线电平从低到高跳变作为I2C总线的停止信号。

(5)器件地址的约定主器件在发送启动命令后开始传送数据,主器件发送相应的从器件地址,8位从器件地址的高四位固定为1010,接下来的3位用来定义存储器的地址,对于CAT24C021/022,这三位无意义,对于CAT24C41/042,接下来的2位无意义,第三位是地址高位,CAT24C081/082中,第一位无意义,后两位表示地址高位。

最后一位为读写控制位,“1”表示对从器件进行读写操作,“0”表示写操作。

在主器件发送启动命令和一字节从器件地址后,如果与从器件地址吻合,CAT24C02将发送一个应答信号,然后再根据读/写控制为进行读或写操作。

(6)应答信号每次数据传送成功后,接收器件将发送一个应答信号。

当第九个时钟信号产生时,产生应答型号的器件将SDA下拉为低,通知已经接受到8位数据,接收到起始条件和从器件地址后,CAT24C02发送一个应答信号,如果为写操作,每接收到一个字节数据,CAT24C02发送一个应答信号。

AT24C02使用手册

AT24C02使用手册

7 1 2 3
AT24 C0 2
A)
图9-1 AT24C02引脚及应用电路
B) A)芯片引脚 B)应用电路
4
(1)引脚功能 图9-1 A) 为AT24C02芯片DIP封装引脚图,其中:
SAD、SCL:IC总接口;A2~A0:地址引脚; TEST:测试端,高电平有 效;VDD、VSS:电源端和接地端。 (2)电路设计 图9-1 B)为AT24C02应用电路,AT24C02的SDA和SCL 端分别接 AT89S52虚拟IC总线接口VSDA和VSCL端, TEST端接地,A2、A1、A0 可作为多片AT24C02寻地位,若只用一片AT24C02,A2、A1、A0接地 。
第13章 24c02应用
特性
CAT24WC01 /02/04/08/1 6 1 K/2K/4K/8K/ 6K 位串行E PROM
特性 与 400KHz I 2 C总线兼容 工作电压范围1.8-- 6.0伏
低功耗 CMOS技术 写保护功能 当 WP为高电平时进入写 保护状态 页写缓冲器 自定时擦写周期 1,000,000 /编程 擦除周期 可保存数据 100年 8脚 DIP或 SOIC TSSOP封装 温度范围 -55 +125 商业级 工业级和汽车级
概述
3
4
IC总线EPROM芯片AT24C02
5V
5 .1 k
5 .1 k
P1.1
VSDA 1 2 3 4 A0 A1 A2 VSS VDD TEST SCL SDA 8 7 6 5 VSCL
SDA
V SS V D D
5
8
P1.0
AT89 A0 A1 A2 AT24 C0 2
B) A)芯片引脚 B)应用电路

I2C总线芯片AT24C02程序设计

I2C总线芯片AT24C02程序设计

I2C总线芯片AT24C02程序设计AT24C02是一种常见的I2C总线芯片,具有2K字节的存储空间。

在程序设计方面,主要需要考虑以下几个方面:初始化、读取数据、写入数据。

首先,需要考虑的是初始化芯片。

在初始化过程中,主要有两个关键的步骤,一个是设置I2C总线的速率,另一个则是设置芯片地址。

以下是AT24C02初始化的伪代码:```void init_AT24C0//设置I2C总线速率i2c_set_speed(I2C_SPEED);//设置AT24C02芯片地址i2c_write_byte(AT24C02_ADDR);if (!i2c_check_ack()//错误处理机制}```在初始化完成后,就可以进行数据的读取和写入。

以下是读取数据的伪代码:```uint8_t read_AT24C02(uint16_t addr)//发送开始信号i2c_start(;//发送芯片地址和写入模式i2c_write_byte(AT24C02_ADDR , I2C_WRITE); if (!i2c_check_ack()//错误处理机制}//发送要读取的地址高位和低位i2c_write_byte(addr >> 8);if (!i2c_check_ack()//错误处理机制}i2c_write_byte(addr & 0xFF);if (!i2c_check_ack()//错误处理机制}//发送重新开始信号i2c_restart(;//发送芯片地址和读取模式i2c_write_byte(AT24C02_ADDR , I2C_READ);if (!i2c_check_ack()//错误处理机制}//读取数据uint8_t data = i2c_read_byte(;//发送停止信号i2c_stop(;//返回读取到的数据return data;```以上是读取数据的伪代码,对应地,写入数据的伪代码如下:```void write_AT24C02(uint16_t addr, uint8_t data)//发送开始信号i2c_start(;//发送芯片地址和写入模式i2c_write_byte(AT24C02_ADDR , I2C_WRITE);if (!i2c_check_ack()//错误处理机制}//发送要写入的地址高位和低位i2c_write_byte(addr >> 8);if (!i2c_check_ack()//错误处理机制}i2c_write_byte(addr & 0xFF); if (!i2c_check_ack()//错误处理机制}//写入数据i2c_write_byte(data);if (!i2c_check_ack()//错误处理机制}//发送停止信号i2c_stop(;```需要注意的是,在读取或写入数据之前,必须实现I2C总线的相关函数,如设置速率、发送信号、写入数据等。

AT24c02最全的中文资料

AT24c02最全的中文资料

CA T24C 161/162(16K),CAT24C081 /082(8K) CAT24C041/042(4K),CAT24C021/022(2K)I2C串行CMOS E2PROM,精确的复位控制器和看门狗定时器控制电路特性•数据线上的看门狗定时器(仅对CA T24Cxxl)籲可编程复位门槛电平籲高数据传送速率为400KHz和I2C总线兼容• 2.7V至6V的工作电压•低功耗CMOS工艺籲16字节页写缓冲区籲片内防误擦除写保护籲高低电平复位信号输出——精确的电源电压监视器——可选择5V、3.3V和3V的复位门槛电平•100万次擦写周期•数据保存可长达100年•8脚DIP或SOIC封装•商业级、工业级和汽车温度范围概述CA T24Cxxx是集E2PROM存储器,复位微控制器和看门狗定时器三种流行功能与一体的芯片。

CAT24C161/162 (16K),CAT24C081/082 (8K),CA T24C041/042 (4K)和CAT24C021/022 (2K)以I2C是串行CMOS E2PROM器件。

釆用CMOS工艺大降低了器件的功耗。

CA T24Cxxx 另一特点是16字节的页写缓冲区,提供8脚DIP和SOIC 封装。

CA T24Cxxx的复位功能和看门狗定时器功能保证系统出现故障的时候能给CPU —个复位信号。

CA T24Cxxx 的2脚输出低电平复位信号,7脚输出高电平复位信号。

CAT24Cxxl看狗溢出信号从SDA脚输出。

CAT24Cxx2不具备看门狗功能。

绝对最大参数工作温度:-55°C〜125°C贮存温度:-65°C〜15°C各管脚承受对地电压:-2.0V〜Vcc+2.0V VCC对地电压范围:-2.0V〜7.0V 最大功耗: 1.0W管脚焊接温度(10S): 300 °C输出短路电流:100mA管脚配置]V C C ]RESET方框图表一直流操作特性表二上电时序管脚介绍WP:写保护将该管脚接Vcc,E2PRON就实现写保护(只读)。

EEPROM_AT24C02_笔记

EEPROM_AT24C02_笔记

AT24C02 使用
一、芯片介绍:
1,2,3 脚(A0 、A1 、A2 ) :可编程地址输入端 4(GND) :电源地 5(SDA)serial date:串行数据输入/输出端 6(SCA)serial clock input :串行时钟输入端 7(WP )write protect:写保护输入端,用于硬件数据保护。当期为低电平时,可对整 个存储器进行正常的读/写操作;当为高电平时,存储器具有写保护功能,但读操作不 受影响。 8(Vcc) :电源正端
}
二、存储结构与寻址
AT24C02 的存储容量为 2KB ,内部分成 32 页,每页 8B,共 256 页。操作时有两种寻芯片地址为 1010, 其地址控制格式为 1010A2A1A0R/W 。
其中 A2 、A1 、A0 为可编程地址选择位。A2 、A1、A0 引脚接高、低电平得到 确定的三位编码,与 1010 形成 7 位编码,即为该器件的地址码。R/W 位芯片 读写控制位,该位为 0,表示对芯片进行写操作;该位为 1,表示对芯片进行读 操作。 (2) 片内子地址寻址:芯片寻址可对内部 256B 中的任一个进行读/写操作,其寻址 范围为 00~FF,共 256 个寻址单位。
(2)指定地址连续读,此种方式的读地址控制与前面指定地址读相同,单片机接 收到每一个字节数据后应做出应答,只要 EEPROM 检测到应答信号,其内部的地址寄 存器就自动加 1,指向下一个单元,并顺序将指向的单元的数据送到 SDA 串行数据线 上。 当需要结束读操作时, 单片机接收到数据后在需要应答的时刻发送一个非应答信号, 接着再发送一个停止信号即可。这种读操作的数据帧格式如图 8.3.8 所示。
芯片操作时序图:对应后面的程序理解
总线时序图

I2C总线at24c02芯片使用说明

I2C总线at24c02芯片使用说明

325密码储存电路密码储存电路采用l2C总线at24c02存储芯片存放密码,可实现断电密码不消失,at24c02存储芯片可长期存储信息,可上百万次以上重新擦写。

2.4.3 I 2C总线密码存储芯片at24c02介绍S-I&ad TSSOP图2-3 at24c02 引脚图(1)引脚功能介绍及相关知识WP写保护引脚,将该引脚接VCC U PROM就实现写保护(只读)。

引脚接地或悬空,可以对器件进行读写操作。

SCL串行时钟引脚,串行输入输出时该引脚用于输入时钟。

SDA串行数据输入输出引脚,用来输入输出数据,该引脚为射极开路输出,需接上拉电阻。

(2) |2C总线协议只有总线非忙时才被允许进行数据传送,在传送时,当时钟线为高电平,数据线必须为固定状态,不允许有跳变。

时钟线为高电平时数据线的任何电平变化将被当作总线的启动或停止条件。

(3)起始条件起始调教必须在所有操作命令之前发送。

时钟线保持高电平期间,数据线电平从高到低跳变作为I2C总线的启动信号。

CAT24Cxx>一直监视SDA和SCL电平信号,直到条件满足时才响应。

(4) 停止条件时钟线保持高电平期间,数据线电平从低到高跳变作为l 2C 总线的停止信号。

(5) 器件地址的约定主器件在发送启动命令后开始传送数据,主器件发送相应的从器件地址, 8位从器件地址的高四位固定为1010,接下来的3位用来定义存储器的地址,对 于CAT24C021/022这三位无意义,对于 CAT24C41/042接下来的2位无意义, 第三位是地址高位,CAT24C081/082中,第一位无意义,后两位表示地址高位。

最后一位为读写控制位,“ 1”表示对从器件进行读写操作,“ 0 ”表示写操 作。

在主器件发送启动命令和一字节从器件地址后,如果与从器件地址吻合, CAT24C02各发送一个应答信号,然后再根据读/写控制为进行读或写操作。

(6) 应答信号每次数据传送成功后,接收器件将发送一个应答信号。

AT24C02页读写程序

AT24C02页读写程序
Order &=0xf0;
for(i=0;i<8;i++)
{
if(Order&0x80)
SID_set;
else
SID_clr;
CLK_clr;
CLK_set;
Order<<=1;
}
Order=Data;
Order<<=4;
for(i=0;i<8;i++)
{
if(Order&0x80)
SID_set;
{
uchar Value;
IIC_Start();
AT24C02_Send_Byte(Slave_Addr);
AT24C02_Send_Byte(Addr);
IIC_Start();
AT24C02_Send_Byte(Slave_Addr+1);
Value=AT24C02_Rec_Byte();
IIC_SendAck(1);
{
IIC_Start();
AT24C02_Send_Byte(Slave_Addr);
AT24C02_Send_Byte(Address);
AT24C02_Send_Byte(Dat);
IIC_Stop();
}
/*单字节读AT24C02*/
uchar Single_Read_AT24C02(uchar Slave_Addr,uchar Addr)
/*接收应答信号*/
uchar IIC_RecAck(void)
{
uchar A;
SDA_in;
SCL_set;
Delay(35);
if(PINC & (1<<4))

24C02(IIC)读写操作

24C02(IIC)读写操作

1. AT24C02写操作首先我们来看一下写AT24C02。

一般步骤是:1) 发送起始信号2) 发送写器件地址3) 等待应答4) 发送要写入的24C02 的地址5) 等待应答6) 发送要写入的数据7) 等待应答8) 发送数据结束发送结束信号具体程序如下:/****************************************************************************** ** 函数名: AT24Cxx_WriteOneByte* 函数功能: 24c02写一个字节地址数据* 输入: addr dt* 输出: 无********************************************/void AT24Cxx_WriteOneByte(u16 addr,u8 dt){I2C_Start();if(EE_TYPE>AT24C16){I2C_Send_Byte(0xA0);I2C_Wait_Ack();I2C_Send_Byte(addr>>8); //发送数据地址高位}else{I2C_Send_Byte(0xA0+((addr/256)<<1));//器件地址+数据地址}I2C_Wait_Ack();I2C_Send_Byte(addr%256);//双字节是数据地址低位//单字节是数据地址低位I2C_Wait_Ack();I2C_Send_Byte(dt);I2C_Wait_Ack();I2C_Stop();delay_ms(10);}2. AT24C02读操作那么读取AT24C02 的步骤是:1)发送起始信号2) 发送写器件地址3) 等待应答4) 发送要读取的AT24C02 的地址5) 等待应答6) 再发送其实信号7) 发送读器件地址8) 等待应答9) 接收数据10) 如果没有接收完数据,发送应答11) 接收数据12) 直到接收完数据,发送非应答13) 发送结束信号/****************************************************************************** ** 函数名: AT24Cxx_ReadOneByte* 函数功能: 24c02读一个字节地址数据* 输入: addr* 输出: 返回值temp*****************************************************************************/ u8 AT24Cxx_ReadOneByte(u16 addr){u8 temp=0;I2C_Start();if(EE_TYPE>AT24C16){I2C_Send_Byte(0xA0);I2C_Wait_Ack();I2C_Send_Byte(addr>>8); //发送数据地址高位}else{I2C_Send_Byte(0xA0+((addr/256)<<1));//器件地址+数据地址}I2C_Wait_Ack();I2C_Send_Byte(addr%256);//双字节是数据地址低位//单字节是数据地址低位I2C_Wait_Ack();I2C_Start();I2C_Send_Byte(0xA1);I2C_Wait_Ack();temp=I2C_Read_Byte(0); // 0 代表NAC I2C_NAck();I2C_Stop();return temp;}。

AT24C02的操作方法

AT24C02的操作方法

AT24C02的操作⽅法AT24C02的读写时序完全遵循标准的IIC读写时序,但是我们接下来还要了解AT24C02的器件操作⽅法:寄存器.jpg上图为AT24C系列的地址寄存器,AT24C02具有2K bit,所以看到第⼀⾏。

我们看到写地址寄存器的数据,最⾼位MSB永远是1,⾼四位为固定值,接下来A2,A1,A0就是前⾯说到的器件硬件地址,如果你写(A2,A1,A0)=(0,0,0)就对应到器件此三个引脚都接到地的那个器件。

最低位LSB是读写命令位,如果为1则表⽰“将要对这个器件进⾏‘读’操作”,反之为“写”。

字节写.jpg这个是AT24C02的字节写时序,很清晰,由左到右(我写中⽂):“起始信号——指定器件(写)——从器件应答——再写存储器内部空间地址——从器件应答——写数据到指定器件指定存储地址——从器件应答——结束信号”注意:MSB指最⾼位,LSB指最低位,上图看出数据传输都是从最⾼位开始;R/W表⽰低电平为“写”(Write)⾼电平为读“Read”;AT24C02的存储空间是2K bit,即256个字节。

所以存储器寻址空间为0~255(0x00~0xff),上图的星号所以表⽰不需要第九位数据来寻址(但是更⼤容量器件就需要);随机地址读.jpg上图是AT24C02随机地址读时序,就是任意指定⼀个地址位置读出数据:“起始信号——器件地址(写)——应答——指定存储空间地址——应答——起始信号——器件地址(读)——应答——读出数据——不需要应答——结束信号”8 blocks of 256 pages of 8 bytes256*8(bit)*8(Byte)=16K bit总共有8块,⼀块有256*8(bit)*1(Byte)=2k bit每⼀块的可以有地址选择进⾏选择(如A0, A1,A2)。

(单片机设计)AT24C02的读写程序

(单片机设计)AT24C02的读写程序

AT24C02的读写程序24C02 read / write process 关键字:AT24C02的读写程序AT24C02的读写程序#include#include#include "INTRINS.H"#define uchar unsigned char#define _NOP_() _nop_()/***************************************************************************/#define WriteDeviceAddress 0xa0 /*24c02的写地址*/#define ReadDviceAddress 0xa1 /*24c02的读地址*//***************************************************************************/sbit SCL=P1^6;sbit SDA=P1^7;sbit P1_5=P1^5;sbit P1_4=P1^4;sbit P1_3=P1^3;sbit P1_2=P1^2;unsigned char code table[]={0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01};unsigned char table1[8];/*********************延时程序*******************************************/void DelayMs(unsigned int number) {unsigned char temp;for(;number!=0;number--){for(temp=112;temp!=0;temp--);}}/******************************************************************************************************24c02开始程序***************************************************************************************************************/void Start(){SDA=1;SCL=1;SDA=0;SCL=0;}/******************************************************************************************************24c02停止程序************************************ ***************************************************************************/ void Stop(){SCL=0;SDA=0;SCL=1;SDA=1;}/***************************************************************************/ void Ack(){SDA=0;SCL=1;SCL=0;SDA=1;}/***************************************************************************/ void NoAck(){SDA=1;SCL=1;SCL=0;}/*************************************************************************** *返回错误标志,ErrorBit=SDA,为1错误,0正确********************************* ***************************************************************************/ bit TestAck(){bit ErrorBit;SDA=1;SCL=1;ErrorBit=SDA;SCL=0;return(ErrorBit);}/*************************************************************************** ***************************24c02写一个字节程序****************************** ***************************************************************************/ void Write8Bit(unsigned char input){unsigned char temp;for(temp=8;temp!=0;temp--){SDA=(bit)(input&0x80);/*从高位依次取input的各位*/SCL=1;SCL=0;input=input<<1; /*相等与RLC,取了CY位*/}}/******************************************************************************************************24c02写程序*****************************************************************************************************************/void Write24c02(unsigned char *Wdata,unsigned char RomAddress,unsigned char number) { /*Wdata对准要写的数据的首地址 RomAddress单元地址 number几个Byte*/ Start();/*IIC开始*/Write8Bit(WriteDeviceAddress);/*写入器件地址0xa0*/TestAck();/*测试ACK位*/Write8Bit(RomAddress);/*写入器件控制单元地址*/TestAck();/*测试ACK位*/for(;number!=0;number--){Write8Bit(*Wdata);TestAck();Wdata++;}Stop();/*IIC停止*/DelayMs(10);/*延长10MS,保证数据写入*/}/******************************************************************************************************24c02读一个字节程序*********************************************************************************************************/ unsigned char Read8Bit(){unsigned char temp,rbyte=0;for(temp=8;temp!=0;temp--){SCL=1;rbyte=rbyte<<1;rbyte=rbyte|((unsigned char)(SDA));SCL=0;}/* for(temp=8;temp!=0;temp--){SCL=1;rbyte=rbyte<<1;if(SDA==1)rbyte=rbyte|0x01;SCL=0;} */return(rbyte); /*把数据返回*/}/******************************************************************************************************24c02读程序*****************************************************************************************************************/void Read24c02(unsigned char *RamAddress,unsigned char RomAddress,unsigned char bytes) {/*unsigned char temp,rbyte;*/Start(); /*IIC开始*/Write8Bit(WriteDeviceAddress);/*写入器件地址0xa0*/TestAck();/*测试ACK位*/Write8Bit(RomAddress);/*写入器件控制单元地址*/TestAck();/*测试ACK位*/Start();/*IIC再次发送开始*/Write8Bit(ReadDviceAddress);TestAck();/*测试ACK位*/while(bytes!=1){*RamAddress=Read8Bit();/*存一个读到的数据到RamAddress+I*/Ack();/*发送IIC再读*/RamAddress++;/*存取地址加一*/bytes--;}*RamAddress=Read8Bit();NoAck();/*发送IIC停止读*/Stop();/*IIC停止*/}/***************************************************************************/。

C51编写的AT24C02详细的读写程序

C51编写的AT24C02详细的读写程序

C51_AT24C02读写程序:/*void start() //开始信号void stop() //停止信号void Ack() //发确认信号void NoAck() //发无确认信号void init()//初始化信号,拉高SDA和SCL两条总线bit write_byte(uchar date)//写一字节,将date 写入AT24C02 中uchar read_byte()//读一字节,从AT24C02 中读一字节bit busy() //应答查询,stop()后,启动A T24C02内部写周期,启动查询//初始化EEPROM子程序内容为0XFF,nPage(0~31)void Init_Flash(uchar nPage) //8 bytes/1 page init 0xFFvoid write_add(uchar address,uchar date)//向AT24C02 中写数据//从AT24C02中给定的地址nAddr起,将存放在以指针nContent开头的存储空间中的nLen 个字节数据,连续写入AT24C02void write_flash(uchar *nContent,uchar nAddr, uchar nLen)uchar read_add(uchar address)//从AT24C02 中读出数据//从AT24C02中给定的地址nAddr起,读取nLen个字节数据存放在以指针nContent开头的存储空间。

void read_flash(uchar *nContent,uchar nAddr, uchar nLen)*//*单片机P2口接74HC138(三八译码器)P2.3--74HC138:/EI、P2.2--74HC138:A2、P2.1--74HC138:A1、P2.0--74HC138:A0译码器输出Y0,Y1、Y2、Y3、Y4、Y5、Y6、Y7均低电平有效,分别选通1~8个数码管。

如何对AT24C02编写驱动程序——IIC总线协议

如何对AT24C02编写驱动程序——IIC总线协议

如何对AT24C02编写驱动程序——IIC总线协议AT24C02是一种2Kbit(256字节)的串行EEPROM芯片,采用I2C总线协议进行通信。

编写AT24C02的驱动程序需要了解I2C总线协议的工作原理以及AT24C02的读写操作。

以下是编写AT24C02驱动程序的步骤:1. 硬件配置:首先,需要在单片机上配置I2C总线的硬件连接。

I2C 总线需要两根信号线,即SDA(Serial Data Line)和SCL(Serial Clock Line)。

将SDA和SCL引脚连接到AT24C02的对应引脚,并通过上拉电阻将其拉高。

2.初始化I2C总线:在驱动程序中,需要初始化I2C总线的相关寄存器和配置参数。

这包括设置I2C总线的通信速率、使能I2C模块、使能中断等。

3.开始信号和设备地址:发送开始信号START,然后发送AT24C02的设备地址,设备地址由3位固定的值和一个读/写位组成。

读写位为0代表写操作,为1代表读操作。

4.发送数据:如果是写操作,发送要写入的数据到AT24C02的指定地址。

数据写入时,需要注意AT24C02的内存地址范围,以及页写操作的限制。

如果是读操作,发送读取的目标地址。

5.停止信号:传输完成后,发送停止信号STOP,结束通信。

6.延时和轮询:在I2C总线通信中,需要一定的延时等待数据传输完成。

在写入大量数据或读取数据时,还需要轮询等待操作完成。

7.错误处理:在驱动程序中,需要考虑到可能发生的错误和异常情况。

例如,设备地址未响应、通信超时、数据传输错误等,都需要进行相应的错误处理。

8.封装函数接口:为了方便上层应用调用,可以将上述操作封装成函数接口。

例如,提供读写函数、擦除函数和查询设备ID的函数等。

除了以上的驱动程序,还可以根据实际需求进行功能扩展。

例如,可以实现批量写入数据、随机读取数据、擦除操作等。

总之,编写AT24C02的驱动程序主要包括硬件配置、初始化I2C总线、发送开始信号和设备地址、发送数据、发送停止信号、延时和轮询、错误处理等步骤。

ATMEL24c02使用详解(汇编及C程序都有)

ATMEL24c02使用详解(汇编及C程序都有)

ATMEL 24c02使用详解(汇编及C程序都有)1000字ATMEL 24c02是一种串行EEPROM存储器,具有2KB的存储容量,可通过I2C总线进行读写操作。

使用ATMEL 24c02时,需先设置I2C总线的通信速率和设备地址。

然后,可以使用汇编语言或C语言编写程序进行读写数据操作。

汇编语言程序示例:1. 设置I2C总线通信速率及设备地址```LDAA #$0 ;设置I2C总线通信速率为100kHzSTAA SCLDIVLDAA #$A0 ;设置EEPROM的设备地址为0xA0STAA SLA```2. 写入数据到EEPROM```BYTE_WRITE PROCLDAA #$00 ;设置数据的存储地址为0x00STAA DADDRLDAA #$A5 ;设置需要写入的数据为0xA5STAA DATAJSR I2C_WRITE ;调用I2C总线写入函数RTSBYTE_WRITE ENDP```3. 从EEPROM读取数据```BYTE_READ PROCLDAA #$00 ;设置数据的读取地址为0x00STAA DADDRJSR I2C_START ;发送起始信号LDAA #$A1 ;设置EEPROM的设备地址为0xA1,读操作时需要在地址末位添加1JSR I2C_SEND ;发送EEPROM设备地址LDAA #$00 ;设置要读取的数据长度为1JSR I2C_READ ;调用I2C总线读取函数LDA DATA ;将读取到的数据保存到DATA寄存器中RTSBYTE_READ ENDP```C语言程序示例:1. 在main函数中,调用I2C_Init()函数,设置I2C总线速率和设备地址。

```void main(){I2C_Init(); //设置I2C总线速率和设备地址}```2. 写入数据到EEPROM```void Write_Byte(unsigned char addr, unsigned char dat) {I2C_Start(); //发送起始信号I2C_SendByte(0xa0); //写入EEPROM的设备地址I2C_SendByte(addr); //设置存储地址I2C_SendByte(dat); //写入数据I2C_Stop(); //发送停止信号}```3. 从EEPROM读取数据```unsigned char Read_Byte(unsigned char addr){unsigned char res;I2C_Start(); //发送起始信号I2C_SendByte(0xa0); //写入EEPROM的设备地址I2C_SendByte(addr); //设置读取地址I2C_Start(); //发送起始信号I2C_SendByte(0xa1); //设置EEPROM的设备地址为读取模式 res = I2C_ReadByte(); //读取数据I2C_Stop(); //发送停止信号return res; //返回读取的数据}```即可进行EEPROM的读写操作。

手把手教会你24C02

手把手教会你24C02

简易教程第一课24c02 是一个非挥发eeprom 存储器器件,采用的IIC 总线技术。

24c02 在许多试验中都有出现。

24c02 的应用,主要在存储一些掉电后还要保存数据的场合,在上次运行时,保存的数据,在下一次运行时还能够调出。

24c02 采用的IIC 总线,是一种2 线总线,我们在试验中用IO来模拟这种总线,至于总线的时序和原理,请参考相关资料。

如果您不想研究,也没有关系,我们在程序中已经为你写好了,现在和今后您都可以只调用就是,不必花时间和精力去研究。

一块24c02 中有256 个字节的存储空间。

我们将24c02 的两条总线接在了P26 和P27 上,因此,必须先定义:sbit SCL=P2^7;sbit SDA=P2^6;在这个试验中,我们写入了一个字节数值0x88 到24c02 的0x02 的位置。

写入完成后,P10 灯会亮起,我们再在下一颗来读出这个字节来验证结果。

―――――――――――――#define uchar unsigned char //定义一下方便使用#define uint unsigned int#define ulong unsigned long#include <reg52.h> //包括一个52 标准内核的头文件//本课试验写入一个字节到24c02 中char code dx516[3] _at_ 0x003b;//这是为了仿真设置的#define WriteDeviceAddress 0xa0 //定义器件在IIC 总线中的地址#define ReadDviceAddress 0xa1sbit SCL=P2^7;sbit SDA=P2^6;sbit P10=P1^0;//定时函数void DelayMs(uint number){uchar temp;for(;number!=0;number--){for(temp=112;temp!=0;temp--) ; }}//开始总线void Start(){SDA=1;SCL=1;SDA=0;SCL=0;}//结束总线void Stop(){SCL=0;SDA=0;SCL=1;SDA=1;}//测试ACKbit TestAck(){bit ErrorBit;SDA=1;SCL=1;ErrorBit=SDA;SCL=0;return(ErrorBit);}//写入8 个bit 到24c02Write8Bit(uchar input){uchar temp;for(temp=8;temp!=0;temp--){SDA=(bit)(input&0x80);SCL=1;SCL=0;input=input<<1;}}//写入一个字节到24c02 中void Write24c02(uchar ch,uchar address) {Start();Write8Bit(WriteDeviceAddress); TestAck();Write8Bit(address);TestAck();Write8Bit(ch);TestAck();Stop();DelayMs(10);}//本课试验写入一个字节到24c02 中void main(void) // 主程序{Write24c02(0x88,0x02);// 将0x88 写入到24c02 的第2 个地址空间P10=0; //指示运行完毕while(1); //程序挂起}―――――――――――――――――tiankai (2010-2-04 23:16:19)【手把手教会24C02】第二课本课的程序已经包含了上一颗的内容,增加了读24c02 的函数,请看程序:―――――――――――――――――――――――――――――#define uchar unsigned char //定义一下方便使用#define uint unsigned int#define ulong unsigned long#include <reg52.h> //包括一个52 标准内核的头文件char code dx516[3] _at_ 0x003b;//这是为了仿真设置的#define WriteDeviceAddress 0xa0 //定义器件在IIC 总线中的地址#define ReadDviceAddress 0xa1sbit SCL=P2^7;sbit SDA=P2^6;sbit P10=P1^0;//定时函数void DelayMs(unsigned int number){unsigned char temp;for(;number!=0;number--){for(temp=112;temp!=0;temp--) ; }}//开始总线void Start(){SDA=1;SCL=1;SDA=0;SCL=0;}//结束总线void Stop(){SCL=0;SDA=0;SCL=1;SDA=1;}//发ACK0void NoAck(){SDA=1;SCL=1;SCL=0;}//测试ACKbit TestAck(){bit ErrorBit;SDA=1;SCL=1;ErrorBit=SDA;return(ErrorBit);}//写入8 个bit 到24c02Write8Bit(unsigned char input){unsigned char temp;for(temp=8;temp!=0;temp--){SDA=(bit)(input&0x80);SCL=1;SCL=0;input=input<<1;}}//写入一个字节到24c02 中void Write24c02(uchar ch,uchar address) {Start();Write8Bit(WriteDeviceAddress);TestAck();Write8Bit(address);TestAck();Write8Bit(ch);TestAck();Stop();DelayMs(10);}//从24c02 中读出8 个bituchar Read8Bit(){unsigned char temp,rbyte=0;for(temp=8;temp!=0;temp--){rbyte=rbyte<<1;rbyte=rbyte|((unsigned char)(SDA)) SCL=0;}return(rbyte);}//从24c02 中读出1 个字节uchar Read24c02(uchar address) {uchar ch;Start();Write8Bit(WriteDeviceAddress); TestAck();Write8Bit(address);TestAck();Start();Write8Bit(ReadDviceAddress); TestAck();ch=Read8Bit();NoAck();Stop();return(ch);}//本课试验写入一个字节到24c02 并读出来void main(void) // 主程序{uchar c1,c2;c1=Read24c02(0x02);Write24c02(0x99,0x03);c2=Read24c02(0x03);P10=0;while(1); //程序挂起}――――――――――――――――在主程序中,我们将上一课写入的0x02 位置的数据读出来放在c1 中,新写了一个数据0x99 在0x03 位置中,并立即将它读出来放在c2 中。

首先先看AT24C02的数据手册

首先先看AT24C02的数据手册

首先先看AT24C02的数据手册1、24C02读写规则。

器件地址:此处将A2A1A0接地。

所以地址为0x50;最低位为读写标志位,有DSP自动发送。

2、I2C总线初始化:void InitI2C(void){InitI2CGpio();//将对应的IO口功能设置成I2C总线工作模式。

// Initialize I2CI2caRegs.I2CSAR = 0x50; // Slave address=0x00;- EEPROM control codeI2caRegs.I2CPSC.all = 9; // I2C模块时钟频率=100MHZ/(9+1)=10MHZI2caRegs.I2CCLKL = 10; //I2caRegs.I2CCLKH = 5; // SCL--Master Clock=10M/(CLKL+CLKH+10)=400k;I2caRegs.I2CIER.all = 0x2C; // Enable SCD & ARDY interruptsI2caRegs.I2CMDR.all = 0x0020; // Take I2C out of resetI2caRegs.I2CFFTX.all = 0x6000; // Enable FIFO mode and TXFIFOI2caRegs.I2CFFRX.all = 0x2040; // Enable RXFIFO, clear RXFFINT,}3、I2C页写子程序:对某个页面进行写8个数据。

起始地址:MemoryAddressvoid I2C_PageWrite(Uint16 MemoryAddress,Uint16 write_buffer[8]){Uint16 i;// 设置器件地址I2caRegs.I2CSAR=0x0050;// 需要发送的数据个数:=需要发送的数据个数+1个数据长度的地址I2caRegs.I2CCNT =8+1;// 第一个发送的数据:存储地址I2caRegs.I2CDXR =MemoryAddress;//接着是要发的数据。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

总线工作原理
I2C 总线进行数据传送时,时钟信号为高电平期间,数据线上的数据必须保持稳定,只有在时钟线上的信号为低电平期间,数据线上的高电平或低电平状态才允许变化。

起始和终止信号 :SCL 线为高电平期间,SDA 线由高电平向低电平的变化表示起始信号;SCL 线为高电平期间,SDA 线由低电平向高电平的变化表示终止信号。

数据传送格式(1)字节传送与应答
每一个字节必须保证是8位长度。

数据传送时,先传送最高位(MSB ),每一个被传送的字节后面都必须跟随一位应答位(即一帧共有9位)。

如果一段时间内没有收到从机的应答信号,则自动认为从机已正确接收到数据。

AT24C02的芯片地址如下图,1010为固定,A0,A1,A2正好与芯片的1,2,3引角对应,为当前电路中的地址选择线,三根线可选择8个芯片同时连接在电路中,当要与哪个芯片通信时传送相应的地址即可与该芯片建立连接,TX-1B 实验板上三根地址线都为0。

最后一位R/W 为告诉从机下一字节数据是要读还是写,0为写入,1为读出。

AT24C02的芯片地址(0xa0为写,0xa1为读)
任一地址写入数据格式
任一地址读取数据格式。

相关文档
最新文档