您的位置 首页 新品

单片机学习之二十:E2PROM芯片24C02的读写程序

E2PROM芯片24C02的读写程序一、实验目的:给24C02的内部RAM写入一组数据,数据从24C02内部RAM的01h开始存放。然后再把这组数据读出来,检验…

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总线中的信号都有必要契合上述的有效性呢?只要两个破例,便是开端和中止信号。

开端信号:当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 ;发送缓冲区的首址

wrloop: Mov a,@r0

Mov r7,a

Inc r0

Lcall send

Djnz r5, wrloop ;把3个字节的数据发送出去

lcall stop ;中止

lcall d1s

mov r5,#Numdata ; 要读取的字节数从头赋值

Mainre: lcall start ;发动

Mov r7,#0a0h

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

Mov r7,#2402data

Lcall send ;发承受缓冲区首址

Lcall start ; 再次发动

Mov r7,#0a1h

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

Reloop: Lcall read ;调用读取一个字节数据的子程序

mov p0,r7 ;把读进来的数送到p0口显现

lcall d1s

lcall d1s

Djnz r5,reloop

Lcall stop ;3字节读取完毕宣布中止信号

Ajmp $

init: mov p2,#0ffh ;初始化,30h、31h、32h中存入0、1、2的段码

mov 30h,#48h

mov 31h,#0ebh

mov 32h,#52h

ret

start: setb sda ;发动信号子程序,咱们能够参阅开端信号的时序图

setb scl

lcall d5u

clr sda

lcall d5u

clr scl

ret

stop: clr sda ;中止信号子程序

setb scl

lcall d5u

setb sda

lcall d5u

clr sda

clr scl

ret

;send是发送一个字节子程序

send: mov r6,#08h

mov a,r7 ;要发送的数在r7中

sendlop1 : rlc a ;左环移,把A的最高位移入cy

mov sda,c ;把cy的值经过sda发送出去

setb scl ;在scl上发生一个时钟

lcall d5u

clr scl

djnz r6, sendlop1 ;重复8次,发送一个字节

;cack是查看应对信号的子程序

cack: setb sda ;主机首要拉高sda

setb scl ;宣布一个时钟

lcall d5u

sendlop2:mov c,sda ;读入sda的状况,假如是0表明承受到了应对

jc sendlop2

clr scl ;承受到应对位,完毕时钟

ret

read: mov r6,#08h ;读取一个字节子程序

readlop1: setb sda ;置sda为输入方法

setb scl ;宣布一个时钟

lcall d5u

mov c,sda ;读入sda状况

rlc a ;把该位的状况移入A中

clr scl ;完毕时钟

djnz r6,readlop1 ;重复8次,读入一个字节

mov r7,a ;读进来的数放在r7中

;sack是发送应对位子程序

sack: clr sda ;拉低sda线

setb scl ;宣布时钟信号

lcall d5u

clr scl

setb sda

ret

d5u: nop ;延时5us子程序

nop

nop

nop

nop

ret

d1s: mov r1,#100 ;延时1s子程序

del1: mov r4,#20

del2: mov r3,#0ffh

del3: djnz r3,del3

djnz r4,del2

djnz r1,del1

ret

end

咱们把这个程序下载到测验板上面,发现数码管顺次显现数字0、1、2

声明:本文内容来自网络转载或用户投稿,文章版权归原作者和原出处所有。文中观点,不代表本站立场。若有侵权请联系本站删除(kf@86ic.com)https://www.86ic.net/xinpin/266896.html

为您推荐

联系我们

联系我们

在线咨询: QQ交谈

邮箱: kf@86ic.com

关注微信
微信扫一扫关注我们

微信扫一扫关注我们

返回顶部