51/AVR单片机技术驿站!  <在线翻译>     便利工具    特色网址   无弹窗、无插件的绿色站点...  英才招聘   学历查询  喜欢>>收藏我站 

当前位置:首页 > 单片机技术文章 > 51单片机 > 详细内容
E2PROM芯片24C02的读写程序
发布时间:2009/6/29  阅读次数:3148  字体大小: 【】 【】【

一、实验目的:

      
给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总线中的信号都必须符合上述的有效性呢?只有两个例外,就是开始和停止信号。

开始信号:当SCL为高电平时,SDA发生从高到低的跳变,就定义为开始信号。

停止信号:当SCL为高电平时,SDA发生从低到高的跳变,就定义为结束信号。

  开始和结束信号的时序图如下图所示:

2、数据传输的字节格式

SDA传送数据是以字节为单位进行的。每个字节必须是8位,但是传输的字节数量不受限制,首先传送的是数据的最高位。每次传送一个字节完毕,必须接收到从机发出的一个应答位,才能开始下一个字节的传输。如果没有接受到应答位,主机则产生一个停止条件结束本次的传送。那么从机应该发出什么信号算是产生了应答呢?这个过程是这样的。当主器件传送一个字节后,在第9个SCL时钟内置高SDA线,而从器件的响应信号将SDA拉低,从而给出一个应答位。

好啦,了解了I2C传输数据的格式,现在来研究双方传送的协议问题。

  3、 I2C数据传输协议

I2C总线的数据传输协议如下:

(1)、主器件发出开始信号

(2)、主器件发出第一个字节,用来选通相应的从器件。其中前7位为地址码,第8位为方向位(R/W)。方向位为“0”表示发送,方向位为“1”表示接受。

(3)、从机产生应答信号,进入下一个传送周期,如果从器件没有给出应答信号,此时主器件产生一个结束信号使得传送结束,传送数据无效。

(4)、接下来主、从器件正式进行数据的传送,这时在I2C总线上每次传送的数据字节数不限,但每一个字节必须为8位(传送的时候先送高位,再送低位)。当一个字节传送完毕时,再发送一个应答位(第9位),如上一条所述,这样每次传送一个字节都需要9个时钟脉冲。数据的传送过程如下图所示:

(四)、24C02芯片相关介绍

AT24C02是带有I2C总线接口的E2PROM存储器,具有掉电记忆的功能,并且可以象普通RAM一样用程序改写。它的容量是256个字节(00h~0ffh),有A2、A1、A0三位地址,可见I2C总线上可以连接8片AT24C02,它的寻址字节是1010 A2A1A0 R/W。板上面24C02的电路连接如图所示:

我们对引脚的功能作一个简单的解释:

                VCC,GND:电源、地引脚

                 A2A1A0:地址引脚

                 SCLK、SDA:通信引脚

                 WP:写保护引脚

从上面的电路连接知:A2A1A0=000,可见如果要对24C02进行写操作,寻址字节是1010 000 0;如果对24C02进行读操作,寻址字节是1010 000 1。用单片机的P1.6脚作为串行时钟线,用P1.7脚作串行数据线。

(五)、程序分析

                 写过程:

(1)、主机首先发出开始信号

(2)、发出写24C02的寻址字节1010 000 0,即0A0H

(3)、发数据写入24C02的地址,本例中为01H

(4)、往24C02中写入数据,这里是3个字节,分别为48h,0ebh,52h。

(5)、写完毕发出停止信号

                   读过程:

(1)、主机发出start信号

(2)、发写24C02的寻址字节1010 000 0

(大家可能要问:我们是读数据,为什么要发写信号呢?这是因为你首先要送出一个信号,说明从24C02中的哪个地址读取数据。)

(3)、发要读取的数据在24C02中的地址,即01h

(4)、主机发start信号

(5)、发读24C02的寻址字节1010 000 1

(5)、从24     C02中读取数据

(6)、读取完毕发出停止信号

在这个程序中,我们把开始信号,结束信号、写一个字节数据、读一个字节数据都编制成为通用的子程序,便于在程序中随时调用。发送和接受应答位的过程放到子程序中,这样可以使得程序结构简化。具体的程序如下所示,希望大家认真理解。

  三、实验程序

Org 0000h

I2cdata     equ 30h                         ;发送数据缓冲区的首址

2402data   equ 01h                         ;接受缓冲区首址

numdata   equ 03h                       ;传送的字节数,传送3个字节

Sda   bit p1.7

Scl    bit p1.6

Ajmp main                                            

Main:     Lcall init                       ;初始化给30h,31h,32h中存入0,1,2的段码

Mainwr:Lcall start                       ;启动

               Mov r7,#0a0h

               Lcall send                         ;发送写24C02的寻址字节

               Mov r7,#2402data

               Lcall send                     ;发送数据存入24C02的地址        

               Mov r5,#Numdata         ;欲发送的字节数

             Mov r0,#i2cdata           ;发送缓冲区的首址

我要评论
  • 匿名发表
  • [添加到收藏夹]
  • 发表评论:(匿名发表无需登录,已登录用户可直接发表。) 登录状态:未登录
最新评论
所有评论[0]
    暂无已审核评论!

网站导航 管理登陆 ┊ 免责声明 问题反馈  友链说明
本站部分内容来自网络共享资源,如有冒犯您的权利请来信告之删除或纠正!
不得对本站进行复制、盗链或镜像,转载内容须获得同意或授权;欢迎友情链接、站务合作!

    我要报警 Alexa
 mcusy_cn#126.com (请把#改成@) 交流:522422171
本站学习交流群:138..158(高级群1-)、77930286(高级群2)、61804809(群3)
Copyright© MCUSY All Rights Reserved
本站网警备案号: WZ36040002485
  ICP备案证书号:粤ICP备09034963号