AT24CO4中文资料

编辑本段 AT24C04 特点
AT24C04,采用DIP封装方式。 步步惊心 话剧
存储器配置:512 x 8bit
封装类型:DIP
针脚数:8
工作温度范围:-40°C to +85°C
封装类型:DIP
器件标号:24
器件标记:24C04
数值孔径存储器容量:4Kbit
存储器电压 Vcc:2.5V
存储器类型:EEPROM
工作温度最低:-40°C
工作温度最高:+85°C
接口类型:Serial, I2C
电压, Vcc:5.5V
电源电压 最大:5.5V
电源电压 最小:1.8V
芯片标号:24C04
表面安装器件:通孔安装
逻辑功能号:24C04
频率:1MHz
1、AT24C04介绍
关于I2C的介绍,这里就不用说了,直接介绍24C04了。24C044K位串行CMOS E2PROM
引脚的认识:SCL 串行时钟引脚
            SDA 串行数据/地址
            A0 A1 A2 器件地址输入端
            WP 写保护
WP 管脚连接到Vcc 所有的内容都被写保护(只能读)。当WP 管脚连接到Vss 或悬空,允许器件进行正常的读/写操作。)
2、AT24C04之准备工作
首先,我们先查看一下实验板上面的接线图。如图1所示。
1 24c04连接图
我们要注意的第一点是器件地址全部是0,即接地处理。第二点是读写保护WP接地,意味着我们可以随意存取。第三点是我们要用到的引脚连接到了P3^6P3^7上。在这里还要提醒一下,就是引脚上一定要有上拉电阻!阻值在470~1k都可以的,具体的数值可以参考相关的手册。
在程序里我们需要先做以下定义:
sbit AT24C04_SCL=P3^7;
wuxiaworldsbit AT24C04_SDA=P3^6;
在写这个程序的时候,要使用到键盘,不用太多按键,我们暂时只用四个。把实验板上面的跳线JP8接到“-”端上,使第一行的按键变为独立键盘就可以了。线路图如图2所示。
2 键盘部分电路图
键盘这部分我就不说了吧,直接附上我用到的这部分程序,在我的程序中,并没有判断按键是否松开,而是使用的延时,这样的好处是一直按着按键,数据会一直在变化,要不然,频繁的按真的很累人。
转到按键程序
对于里面用到的延时函数,一个是US螺线管级延时函数,一个是ms级延时函数,分别调用一下是延时2us1ms
对于显示部分吧,使用的就是LCD1602显示了。这部分程序参见这里。
显示程序
说完了这些,准备的就差不多了,我们可以对着PDFAT24C04程序了。
3、AT24C04之小试牛刀
我们打破PDF中的介绍顺序,按照实际写程序时的顺序分开分析。
第一项是我们要用她,那就要知道她是怎么开始吧?这就是I2C总线时序中的开始和停止。时序图如下。
3 开始停止时序
有一个需要注意的地方,就是当SCL为高电平时,所有的SDA的变化都会被认为是开始或停止信号。所以,我们必须注意,在对SDA进行操作之前,一定要注意SCL的值。
例如在我们写开始信号之前,我们没法判断两个信号的具体电位,那么我们就要做最坏的打算。首先SDA=1,然后SDA=0,此间要让SCL保持在高电平。为保证SCL为高电平,我们要用SCL=1指令使SCL保持在高电平。SCL放在什么位置就成了重点。如果我们SDA变为高电平之前,这样却成了SCL=1SDA=1,形成了停止信号!!这个是我们要避免的,那么我们就要让SDA变化的时候,全部避开SCL震惊世界的中国秘方为高电平段。程序如下。
void I2C_START()
{
    //AT24C04_SCL=0;delayus(1);
//这样做有些繁琐,我们可以直接不用,因为我们跳出
//所有的子函数时,都会让SCL=0!!!
    AT24C04_SDA=1;delayus(1);//注意先后顺序
    AT24C04_SCL=1;delayus(1);
    AT24C04_SDA=0;delayus(1);//下降沿开始
    AT24C04_SCL=0;delayus(1);
}
我们以同样的思维,可以得到停止子函数,如下。
void I2C_STOP()
{
    AT24C04_SCL=0;delayus(1);
    AT24C04_SDA=0;delayus(1);
    AT24C04_SCL=1;delayus(1);
    AT24C04_SDA=1;delayus(1);//上升沿停止
}
下面我们来看一下写的时序。
高中英语选修课4 写时序
时序的第一部分给我们展现了一个第八位数据写完后的情况,也就是说要有一个ACK应答信号。具体关于ACK应答信号的内容,可以参考器件手册。
第二部分是从开始到停止。至于时序图中给出的时间我们可以不用考虑。只需要记住,当SDA变化时SCL0SDA变化完后,SCL在变为1来告知24C04接收数据线上的信号。具体的实现函数如下所示。
void I2C_Wdata(unsigned char data4)
{
    unsigned char i;
    unsigned char temp;
    temp=data4;
    for(i=0;i<8;i++)
    {
        AT24C04_SCL=0;
        temp=temp<<1;//先发送高位
        AT24C04_SDA=CY;delayus(1);
        AT24C04_SCL=1;delayus(1);
    }
    AT24C04_SCL=0;delayus(1);
}
这里还需要注意的一点是我们每当SDA或者SCL变化一次,就会调用一下delayus1)来延时2us,是用来稳定信号和保证信号保持的时间。
上面是写的时序,我们还要有读的子函数啊……其实,读得时序和写的时序差不多,只不
过是反过来的。既然是读,发送方就是24C04,接收方式单片机。每次都是让SCL1,使得24C04掌握对SDA的控制权。而单片机的任务就是在把SCL拉高后,监视SDA的变化并读出SDA上的数据。下面就是读的子函数。
unsigned char I2C_Rdata()
{
    unsigned char i;
    unsigned char temp;
    unsigned char k;
    AT24C04_SCL=0;delayus(1);
    AT24C04_SDA=1;//等待24C02发回来的信号
    for(i=0;i<8;i++)
    {
        AT24C04_SCL=1;delayus(1);
        if(AT24C04_SDA==1)
            k=1;
        else
            k=0;
        temp=temp<<1;
        temp=temp|k;//读数据时高位在前
        AT24C04_SCL=0;
    }
    delayus(1);
    return temp;
}
此时,我们还需要添加上ACK回应信号。我们先来看看它的时序图。
5 ACK 应答信号
    从时序图我们可以看出,ACK就是24C04还给单片机的一个低电平信号,它发生在第九个时钟脉冲上。如果我们用不到哪个ACK的话,我们只需要给出第九个时钟脉冲就可以了。示例程序如下。
    void I2C_ACK()
{
    unsigned char i;//可以去掉
    AT24C04_SCL=1;delayus(1);
    while((AT24C04_SDA==1)&&(i<511))//这部分可以去掉
        i++;//可以去掉
    AT24C04_SCL=0;delayus(1);
}
以上三个是读写的重要子函数,加上开始和停止,有关于AT24C04的函数部分,都是由这五个组成的。下面我们来分析一下可操作的和写。先来分析写字节函数吧。下面是它的时序图。
6 字节写时序
从时序图中我们可以看到,第一部分是开始(START,这部分调用开始函数就可以了。第二部分器件地址,这个是由单片机发送给24C04的,选用写子函数就可以了。别忘了还有一个ACK应答。第三部分是字节地址,就是你想把要存储的数据存储到哪个单元里。第四部分是发送要存储的数据。第五部分就是停止部分(STOP)。
现在我们来分析一下什么是器件地址吧。在I2C总线的协议中,某些器件被指定为特定的地址,这个特定的地址占用了器件地址的前四位。具体的怎么定义的可以参考部分资料。I2C器件的手册里也给出了自己的器件地址。我们以AT24C04的器件地址为例分析吧。
7 AT24C04的器件地址
A2A1是我们自己可以选择的,对应的是可以接地或者接高电平。a8是可以用单片机控制的,但是我们的实验板上直接当做A0给接地处理了。这样做虽然是使器件地址变简单了,但是,24c04有一半的存储区域我们没有用到,也就相当于用了一个AT24C02了。最后一位读写控制位,从非号“¯”我们看出,此位是1表示读,此位是0则表示写!!!那么我们就可以得到对24C04写的器件地址是0XA0,读的器件地址是0XA1(见图1)。
由此我们就可以按顺序写出字节写的子函数了。如下所示。
void I2C_xie(unsigned char data5,unsigned char data6)
{
    I2C_START();
    I2C_Wdata(0xa0);//写入型总线
    I2C_ACK();
    I2C_Wdata(data5);//写入数据的存储地址
    I2C_ACK();
    I2C_Wdata(data6);//待写入的数据
    I2C_ACK();
    I2C_STOP();
}
我们在用同样的方法分析一下选择性读的时序。时序图如下。
8 选择性读时序图
有这个图我们可以分析到如下的选择性读子函数。
unsigned char I2C_du(unsigned char data7)
{
    unsigned char data8;
    I2C_START();
    I2C_Wdata(0xa0);//写入型总线
    I2C_ACK();
    I2C_Wdata(data7);//需要读出数据的地址
    I2C_ACK();
    I2C_START();//再一次重新开始
    I2C_Wdata(0xa1);//读出型总线

本文发布于:2024-09-21 16:31:09,感谢您对本站的认可!

本文链接:https://www.17tex.com/xueshu/398942.html

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。

标签:器件   信号   部分   地址   开始
留言与评论(共有 0 条评论)
   
验证码:
Copyright ©2019-2024 Comsenz Inc.Powered by © 易纺专利技术学习网 豫ICP备2022007602号 豫公网安备41160202000603 站长QQ:729038198 关于我们 投诉建议