您现在的位置是:首页 > 智能机电

「STC8A8K64S4A12开发板」—片外存储器E2PROM讲解

智慧创新站 2025-05-27【智能机电】3人已围观

简介文章目录前言一、硬件设计1.E2PROM存储器介绍2.开发板DAC硬件电路介绍2.1.主要特征2.2.I2C地址2.3.I2C数据传输2.4.ACK和NACK2.5.从机地址和R/W位3.STC8A8K64S4A12系列单片机I2C介绍二、软件设计1.I2C相关寄存器汇集2.寄存器解析2.1.I2C...

文章目录

前言

一、硬件设计

1.E2PROM存储器介绍

2.开发板DAC硬件电路介绍

2.1.主要特征

2.2.I2C地址

2.3.I2C数据传输

2.4.ACK和NACK

2.5.从机地址和R/W位

3.STC8A8K64S4A12系列单片机I2C介绍

二、软件设计

1.I2C相关寄存器汇集

2.寄存器解析

2.1.I2C配置寄存器I2CCFG

2.2.I2C主机控制寄存器I2CMSCR

2.3.I2C主机辅助控制寄存器I2CMSAUX

2.4.I2C主机状态寄存器I2CMSST

2.5.I2C从机控制寄存器I2CSLCR

2.6.I2C从机状态寄存器I2CSLST

2.7.I2C从机地址寄存器I2CSLADR

3.I2C配置步骤

4.外部EEPROM存储器读写单字节实验(模拟I2C)

4.1.工程需要用到的c文件

4.2.头文件引用和路径设置

4.3.编写代码

4.4.硬件连接

5.外部EEPROM存储器读写多字节实验(模拟I2C)

5.1.编写代码

5.2.硬件连接

6.外部EEPROM存储器读写单字节实验(硬件I2C)

6.1.工程需要用到的c文件

6.2.头文件引用和路径设置

6.3.编写代码

6.4.硬件连接

7.外部EEPROM存储器读写多字节实验(硬件I2C)

7.1.编写代码

7.2.硬件连接

总结

前言

今天介绍下STC8A8K64S4A12系列单片机外部E2PROM存储器原理和I2C总线的原理及工作模式,掌握STC8A8K64S4A12系列单片机I2C外设相关的寄存器配置及程序设计。

一、硬件设计1.E2PROM存储器介绍

EEPROM(全称是ElectricallyErasableProgrammableRead-OnlyMemory)带电可擦除可编程只读存储器,该类存储器是用户可更改的只读存储器(ROM),其可通过高于普通电压的作用来擦除和重编程(重写)。EEPROM(常写成E2PROM)是一种特殊形式的闪存,其应用通常是个人电脑中的电压来擦写和重编程。

E2PROM存储器可分为片内E2PROM和片外E2PROM,片外E2PROM和单片机之间通过各种通信接口连接,而最为常见的通信接口即是I2C接口。一般情况下,E2PROM可写入或擦除的次数是30~100万次,而读取次数是没有限制的。

24C02芯片是一种常用的基于I2C通信协议的E2PROM元件,例如ATMEL公司的AT24C02、CATALYST公司的CAT24C02和ST公司的ST24C02等芯片。24C02芯片的存储空间是256字节(2048位),当然如果需要更大存储空间的存储器可以选择其他型号的,比如24C04芯片(512字节)、24C08芯片(1024字节)和24C16芯片(2048字节)。

24Cxx系列引脚定义是一致的,这方便用户在项目设计时,如遇到选择的芯片的存储空间不够时,可在该系列中选择存储空间更大的芯片直接替换,而无需改动硬件部分。


图1:24C02芯片引脚

STC8A8K64S4A12开发板上设计了可供用户使用的AT24C02存储器芯片,其中原理图部分及硬件实物部分如下。


图2:开发板外扩E2PROM存储器

2.开发板DAC硬件电路介绍

I2C总线(即IIC总线)是集成电路总线(Inter-IntegratedCircuit)的缩写,是一种简单、双向二线制同步串行总线。该I2C总线是1982年由荷兰的Philips公司为了解决电视机内的CPU和外围芯片之间连接而开发的,可以说电视机是最早的嵌入式系统之一。

I2C总线是一个真正的多主机总线,如果两个或多个主机同时初始化数据传输,可以通过冲突检测和仲裁防止数据破坏,每个连接到总线上的器件都有唯一的地址,任何器件既可以作为主机也可以作为从机,但同一时刻只允许有一个主机。

2.1.主要特征

典型的I2C应用原理如下图所示,I2C总线通信仅需两根信号线,可以连接多个设备,从设备都有唯一的地址,主设备通过从设备的地址和不同的从设备通信。


图3:典型I2C总线结构

I2C总线硬件结构简单,仅需一根时钟线(SCL)、一根数据线(SDA)和两个上拉电阻即可实现通信。I2C总线的SCL和SDA均为开漏结构,开漏结构的电路只能输出“逻辑0”,无法输出“逻辑1”,因此SCL和SDA需要连接上拉电阻。上拉电阻的阻值影响传输速率,阻值越大,由于RC影响,会带来上升时间的增大,传输的速率慢,阻值小,传输的速率快,但是会增加电流的消耗,一般情况下,我们会选择4.7K左右的阻值,在从机数量少,信号线短的情况下,可以适当增加阻值,如使用10K的阻值。

I2C总线中的从设备必须有自己的地址,并且该地址在其所处的I2C总线中唯一,主设备通过此唯一的地址即可和该从设备进行数据传输。

I2C总线支持多主机,但是同一时刻只允许有一个主机。I2C总线中存在多个主机时,为了避免冲突,I2C总线通过总线仲裁决定由哪一个主机控制总线。

I2C总线只能传输8位的数据,数据速率在标准模式下可达100Kbit/s,快速模式下可达400Kbit/s,高速模式下可达3.4Mbit/s,另外一些变种实现了低速模式(10Kbps)和快速+模式(1Mbps)。

同时连接到同一个I2C总线上的设备数量受总线最大电容(400pF)的限制。

I2C总线电流消耗很低,抗干扰强,适合应用于低功耗的场合。

2.2.I2C地址

I2C总线中的设备必须要有唯一的地址,这意味着如果在总线中接入两个相同的设备,该设备必须有配置地址的功能,这也是我们经常用的I2C接口的设备会有几个引脚用来配置地址的原因。

对于I2C地址,我们经常看到有的I2C接口设备在规格书中描述的是7位地址,而有的I2C接口设备在规格书中描述的是8位地址,他们有什么区别?(I2C也有10位地址,但用的较少,这里不做介绍,本文档中的内容不涉及到10位地址)。

7位地址和8位地址如下图所示,他们结构上是一样的,都是由7个地址位加一个用来表示读写的位组成,只是描述上有所区别。

规格书中描述I2C地址是7位地址的设备:给出的是7个地址位加R/W位,最低位(R/W位)为0时表示为写地址,最低位为1时为读地址。如果把0和1分别带入R/W位,得到的地址就和8位地址一样了。

规格书中描述I2C地址是8位地址的设备:直接给出写地址和读地址,也就是最低位(R/W位)为0时的地址和最低位为1时的地址。


图4:I2C地址

☆注:PCF8563时钟芯片手册上给出其I2C从机地址是8位,读地址为0xA3,写地址为0xA2。

图5:PCF8563芯片手册描述

由此可见,所谓的7位地址和8位地址实际上都是7位地址加上最低位的读写位,本质上是一样的,只是各个I2C接口设备的描述方式不一样。

I2C保留了如下表所示的两组I2C地址,这些地址用于特殊用途。

表1:保留地址

序号

从机地址

R/W位

描述

1

0000000

0

广播呼叫地址。

2

0000000

1

起始字节。

3

0000001

X

CBUS地址。

4

0000010

X

保留给不同的总线格式。

5

0000011

X

保留到将来使用。

6

00001XX

X

Hs模式主机码。

7

11111XX

X

保留到将来使用。

8

11110XX

X

10位从机寻址。

2.3.I2C数据传输

■起始和停止条件(STARTandSTOPconditions)

所有的I2C事务都是以START开始、STOP结束,起始和停止条件总是由主机产生,如下图所示,当SCL为高电平时,SDA从高电平向低电平转换表示起始条件,当SCL是高电平时,SDA由低电平向高电平转换表示停止条件。如果总线中存在多个主机,先将SDA拉低的主机获得总线控制权。

图6:起始和停止条件

■字节格式(Byteformat)

I2C总线发送到SDA上的数据必须为8位,即一次传输一个字节,每次传输可以发送的字节数量不受限制。每个字节后必须跟一个响应位,首先传输的是数据的最高位MSB,如果从机要完成一些其他功能后,例如一个内部中断服务程序才能接收或发送下一个完整的数据字节,那么从机可以将时钟线SCL保持为低电平强制主机进入等待状态,当从机准备好接收下一个字节数据并释放时钟线SCL后数据传输继续。

图7:I2C总线数据传输

2.4.ACK和NACK

每个字节后会跟随一个ACK信号。接收者通过ACK位告知发送者已经成功接收一字节数据并准备好接收下一字节数据。所有的时钟脉冲包括ACK信号的时钟脉冲都是由主机产生的。

ACK信号:发送者发送完8位数据后,在ACK时钟脉冲期间释放SDA线,接收者可以将SDA拉低并在时钟信号为高时保持低电平,这样就产生了ACK信号,从而使得主机知道从机已成功接收数据并且准备好了接收下一数据。

NACK信号:当SDA在第9个时钟脉冲的时候保持高电平,定义为NACK信号。这时,主机要么产生STOP条件来放弃这次传输,要么重复START条件来启动一个新的传输。

下面的5种情况会导致产生NACK信号:

发送方寻址的接收方在总线上不存在,因此总线上没有设备应答。

接收方正在处理一些实时的功能,尚未准备好与主机通信,因此接收方不能执行收发。

在传输期间,接收方收到不能识别的数据或者命令。

在传输期间,接收方无法接收更多的数据字节。

主-接收器要通知从-发送器传输的结束。

2.5.从机地址和R/W位

I2C数据传输如下图所示,在起始条件(S)后,发送从机地址,从机地址是7位,从机地址后紧跟着的第8位是读写位(R/W),读写位为0表示写,读写位为1表示读。数据传输一般由主机产生的停止位P终止,但是,如果主机仍希望在总线上通信,他可以产生重复起始条件S和寻址另一个从机而不是首先产生一个停止条件,在这种传输中可能有不同的读写格式结合。

图8:I2C总线传输时序

可能的数据传输格式有:

主机发送器发送到从机接收器,传输的方向不会改变,接收器应答每一个字节,如下图所示。

图9:主机发送器7位地址寻址从机接收器(传输方向不改变)

在第一个字节后,主机立即读从机,在第一次应答后,主机发送器变成主机接收器,从机接收器变成从机发送器。第一次应答仍由从机生成,主机生成后续应答。之前发送了一个非应答(A)的主机产生STOP条件。

图10:主机发送第一个字节后立即读取从机

复合格式,如下图所示。传输改变方向的时侯,起始条件和从机地址都会被重复,但R/W位取反。如果主接收器发送重复START条件,他会在重复START条件之前发送一个非应答(A)。

图11:复合格式

3.STC8A8K64S4A12系列单片机I2C介绍

STC8A8K64S4A12系列单片机片内集成了1个I2C串行总线控制器,与标准I2C总线一样,STC8A8K64S4A12系列单片机的I2C总线支持两种操作模式:主模式和从模式。

图12:I2C总线工作模式

但需要知道STC8A8K64S4A12系列单片机的I2C协议与标准I2C协议相比较,有以下2种机制被忽略。

发送起始信号(START)后不进行仲裁。

时钟信号(SCL)停留在低电平时不进行超时检测。

STC8A8K64S4A12系列单片机的每一组I2C都有2个IO引脚供选择使用,如下表所示。.

表2:单片机I2C外设引脚分配


☆注:独立GPIO表示开发板没有其他的电路使用这个GPIO,非独立GPIO说明开发板有其他电路用到了该GPIO。须知同一时刻只能使能一组IO口作为I2C使用。

STC8A8K64S4A12系列单片机I2C使用哪一组IO口由P_SW2外设端口切换寄存器2的B4、B5位决定,如下图所示。

图13:外设端口切换寄存器2

☆注:一般P_SW2寄存器B4、B5位默认是0,即如果没有对P_SW2寄存器进行操作,则默认选择的I2C是、这一组。

二、软件设计1.I2C相关寄存器汇集

STC8A8K64S4A12系列单片机使用I2C外设时会用到10个寄存器,如下表所示:

表3:STC8A8K64S4A12系列I2C使用寄存器汇总

2.寄存器解析2.1.I2C配置寄存器I2CCFG

I2C配置寄存器控制I2C外设使能选择、工作模式、总线速度等,详见下图。

图14:I2C配置寄存器I2CCFG

2.2.I2C主机控制寄存器I2CMSCR

I2CMSCR主机控制寄存器的配置是针对I2C已配置为主机模式才有意义的,该寄存器的B7位用来控制主机模式的中断是否打开,B0~B3位为主机模式下的命令,此部分是重点,详见下图。

图15:I2C主机控制寄存器I2CMSCR

2.3.I2C主机辅助控制寄存器I2CMSAUX

当配置I2C总线为主机模式时,虽然可以按照I2C标准协议,控制I2CMSCR寄存器发送主机命令,但很多场合还是希望可以简化这个控制流程。I2CMSAUX寄存器的B0位可以帮助用户实现I2C自动发送数据并接收ACK信号。

图16:I2C主机辅助控制寄存器I2CMSAUX

2.4.I2C主机状态寄存器I2CMSST

I2C主机状态寄存器B7位是可读位,用来读取I2C控制器是否处于忙状态(BUSY),I2CMSST寄存器B6位是I2C控制器执行I2C主机命令后的中断标志位,需软件清零。

图17:I2C主机状态寄存器I2CMSST

2.5.I2C从机控制寄存器I2CSLCR

I2CSLCR从机控制寄存器可控制处于从机模式下的I2C设备是否使能接收START信号、接收STOP信号、接收1字节数据、发送1字节数据等的中断功能,详见下图。

图18:I2C从机控制寄存器I2CSLCR

2.6.I2C从机状态寄存器I2CSLST

I2C从机控制寄存器使能了接收START信号、接收STOP信号、接收1字节数据、发送1字节数据等的中断功能后,I2C从机状态寄存器I2CSLST不仅可读取I2C控制器是否处于忙状态(BUSY),还可以对接收START信号、接收STOP信号、接收1字节数据、发送1字节数据等的中断标志位进行读取,但这些位需软件清零。

图19:I2C从机状态寄存器I2CSLST

2.7.I2C从机地址寄存器I2CSLADR

I2C从机地址寄存器B1~B7位是从机设备地址位,STC8A8K64S4A12系列单片机的I2C外设又配置有B0位(MA位),用来设置是否忽略对从机设备地址的匹配。

图20:I2C从机地址寄存器I2CSLADR

☆注:前面有介绍I2C设备的地址是7位,此处I2C从机设备地址即是7位。

3.I2C配置步骤

针对STC8A8K64S4A12系列单片机I2C,软件的配置过程如下:

图21:I2C中断方式和非中断方式软件配置步骤

4.外部EEPROM存储器读写单字节实验(模拟I2C)

☆注:本节的实验源码是在“实验2-8-1:串口1收发实验(和)”的基础上修改。本节对应的实验源码是:“实验2-14-1:外部EEPROM存储器读写单字节实验(模拟I2C)”。

4.1.工程需要用到的c文件

本例需要用到的c文件如下表所示,工程需要添加下表中的c文件。

表4:实验需要用到的c文件

序号

文件名

后缀

功能描述

1

uart

.c

包含与用户uart有关的用户自定义函数。

2

i2c

.c

包含与用户i2c通信有关的用户自定义函数。

3

at24cxx

.c

操作AT24C系列存储器相关的用户自定义函数。

4

delay

.c

包含用户自定义延时函数。

4.2.头文件引用和路径设置

■需要引用的头文件

include""include""include""

■需要包含的头文件路径

本例需要包含的头文件路径如下表:

表9:头文件包含路径

序号

路径

描述

1

…\Source

、、和头文件在该路径,所以要包含

2

…\User

头文件在该路径,所以要包含

图25:添加头文件包含路径

6.3.编写代码

首先,在文件中对硬件I2C进行初始化,并编写硬件I2C总线通信的基本函数,如下表所示。

表8:实验需要用到的c文件

关于每个硬件i2c总线通信的相关函数,下面给出详细代码。

程序清单:硬件I2C初始化函数

/****************************************************************************描述:I2C初始化函数*入参:无*返回值:无**************************************************************************/voidI2C_init(void){P_SW2|=0x80;//将EAXFR位置1,以访问在XDATA区域的扩展SFRP_SW2=0xCF;//将I2C_S[1:0]置10,以选择I2C硬件功能脚为_SW2|=0x20;//将I2C_S[1:0]置10,以选择I2C硬件功能脚为=0xE0;//使能I2C主机模式,I2C总线速度为等待65个时钟数I2CMSST=0x00;//清零I2C主机状态寄存器各标志位//P_SW2=0x7F;//将EAXFR位置0,恢复访问XRAM}

程序清单:硬件I2C总线等待中断标志位函数

/****************************************************************************描述:I2C总线等待中断标志位*入参:无*返回值:无**************************************************************************/voidI2C_Wait(void){while(!(I2CMSST0x40));//等待I2C主机状态寄存器的中断标志位置1I2CMSST=0xBF;//主机模式中断标志位软件清零}

程序清单:硬件I2C总线产生启动信号函数

/****************************************************************************描述:I2C总线产生启动信号*入参:无*返回值:无**************************************************************************/voidI2C_Start(void){I2CMSCR=0x01;//关闭主机模式中断并发送主机命令:0001(起始命令)I2C_Wait();//等待中断标志位置1}

程序清单:硬件I2C总线产生停止信号函数

/****************************************************************************描述:I2C总线产生停止信号*入参:无*返回值:无**************************************************************************/voidI2C_Stop(void){I2CMSCR=0x06;//关闭主机模式中断并发送主机命令:0110(发送STOP命令)I2C_Wait();//等待中断标志位置1}

程序清单:硬件I2C总线发送ACK命令函数

/****************************************************************************描述:I2C总线发送ACK命令*入参:无*返回值:无**************************************************************************/voidI2C_SACK(void){I2CMSST=0x00;//设置ACK信号I2CMSCR=0x05;//关闭主机模式中断并发送主机命令:0101(发送ACK命令)I2C_Wait();//等待中断标志位置1}

程序清单:硬件I2C总线发送NACK应答命令函数

/****************************************************************************描述:I2C总线发送NACK应答命令*入参:无*返回值:无**************************************************************************/voidI2C_SNAK(void){I2CMSST=0x01;//设置NACK信号I2CMSCR=0x05;//关闭主机模式中断并发送主机命令:0101(发送ACK命令)I2C_Wait();//等待中断标志位置1}

程序清单:硬件I2C总线接收ACK命令函数

/****************************************************************************描述:I2C总线接收ACK命令*入参:无*返回值:无**************************************************************************/voidI2C_RecvACK(void){I2CMSCR=0x03;//关闭主机模式中断并发送主机命令:0011(接收ACK命令)I2C_Wait();//等待中断标志位置1}

程序清单:硬件I2C总线发送数据函数

/****************************************************************************描述:I2C总线发送数据*入参:无*返回值:无**************************************************************************/voidI2C_SData(uint8dat){I2CTXD=dat;//写数据到数据缓冲区I2CMSCR=0x02;//关闭主机模式中断并发送主机命令:0010(发送数据命令)I2C_Wait();//等待中断标志位置1}

程序清单:硬件I2C总线接收数据函数

/****************************************************************************描述:I2C总线接收数据*入参:无*返回值:I2C总线返回的数据**************************************************************************/uint8I2C_RecvData(void){I2CMSCR=0x04;//关闭主机模式中断并发送主机命令:0100(接收数据命令)I2C_Wait();//等待中断标志位置1returnI2CRXD;}

然后,在文件中编写对E2PROM存储器的基本操作函数,如下表所示。

表11:E2PROM相关用户函数汇集


关于每个操作外部E2PROM相关用户函数,下面给出详细代码。

程序清单:从指定地址读取单字节数据函数

/************************************************************************************描述:在芯片AT24CXX指定地址读出一个数据*入参:开始读数据的地址*返回值:读到的数据***********************************************************************************/uint8AT24CXX_RcvOneByte(uint16Addr){uint8temp=0;I2C_Start();//启动总线if(E2PROM_TYPEAT24C16){I2C_SData(SLAW);//发送写命令I2C_RecvACK();//等待应答I2C_SData(Addr8);//发送高地址I2C_RecvACK();//等待应答}elseI2C_SData(SLAW+((Addr/256)1));//发送器件地址,写数据I2C_RecvACK();//等待应答I2C_SData(Addr%256);//发送低地址I2C_RecvACK();//等待应答I2C_Start();//启动总线I2C_SData(SLAR);//设置为读模式I2C_RecvACK();//等待应答temp=I2C_RecvData();//读字节I2C_Stop();//结束总线returntemp;}

程序清单:向指定地址存入单字节数据函数

/************************************************************************************描述:在芯片AT24CXX指定地址写入一个数据*入参:Addr:写入的目的起始地址Data:要写入的数据*返回值:无***********************************************************************************/voidAT24CXX_SOneByte(uint16Addr,uint8Data){I2C_Start();//启动总线if(E2PROM_TYPEAT24C16){I2C_SData(SLAW);//发送写命令I2C_RecvACK();//等待应答I2C_SData(Addr8);//发送高地址I2C_RecvACK();//等待应答}elseI2C_SData(SLAW+((Addr/256)1));//发送器件地址,写数据I2C_RecvACK();//等待应答I2C_SData(Addr%256);//发送低地址I2C_RecvACK();//等待应答I2C_SData(Data);//发送字节数据I2C_RecvACK();//等待应答I2C_Stop();//结束总线delay_ms(10);//该延时保证连续发送字节的稳定性}

程序清单:向指定地址存入多字节数据函数

/************************************************************************************描述:向芯片AT24CXX里面的指定地址开始写入长度为Len的数据*入参:Addr:写入的目的起始地址Data:要写入的数据Len:要写入数据的长度*返回值:无***********************************************************************************/voidAT24CXX_SLenByte(uint16Addr,uint8*Data,uint16Len){while(Len--){AT24CXX_SOneByte(Addr,*Data);Addr++;Data++;}}

程序清单:从指定地址读取多字节数据函数

/************************************************************************************描述:从芯片AT24CXX里面的指定地址开始读出长度为Len的数据*入参:Addr:读出的目的起始地址Data:读出的数据Len:要读出数据的长度*返回值:无***********************************************************************************/voidAT24CXX_RcvLenByte(uint16Addr,uint8*Data,uint16Len){while(Len){*Data++=AT24CXX_RcvOneByte(Addr++);Len--;}}

程序清单:从指定地址擦除单字节数据函数

/************************************************************************************描述:擦除芯片AT24CXX指定地址数据*入参:Addr:要擦除的目的地址*返回值:无***********************************************************************************/voidAT24CXX_EraseOneByte(uint16Addr){AT24CXX_SOneByte(Addr,0xFF);}

程序清单:擦除整片数据函数

/***********************************************************************************功能描述:擦除整个芯片AT24CXX(即芯片存储单元数据都是0xFF)入口参数:无返回值:无备注:不同的存储芯片,存储空间不同,AT24CXX_SIZE数值不同。************************************************************************************/voidAT24CXX_EraseAll(void){uint16i;//填充缓冲区for(i=0;iAT24CXX_SIZE;i++){AT24CXX_SOneByte(i,0xFF);}}

最后,在主函数中对串口1和I2C进行初始化,并通过串口1发送不同的命令实现对单片机片外E2PROM的单字节读、写及擦除等操作。

代码清单:主函数

intmain(void){uint8Temp;P3M1=0xFE;P3M0=0xFE;//设置为准双向口P3M1=0xFD;P3M0|=0x02;//设置为推挽输出I2C_init();//IIC初始化Uart1_Init();//串口1初始化EA=1;//使能总中断delay_ms(10);//初始化后延时while(1){if(WriteFLAG)//写模式{WriteFLAG=0;//写标志变量清零,发送一次AT24CXX_SOneByte(0x0010,0x33);//在地址0x0010位置写入1个字节数据0x33SDataByUart1(0x33);//串口1发送数据0x33表示写操作完成}if(ReadFLAG)//读模式{ReadFLAG=0;//读标志变量清零,发送一次Temp=AT24CXX_RcvOneByte(0x0010);//在地址0x0010位置处读取1个字符SDataByUart1(Temp);//串口1发送读取的字符}if(ClearFLAG)//清除模式{ClearFLAG=0;//清除标志变量清零,发送一次AT24CXX_EraseOneByte(0x0010);//擦除地址0x0010位置处数据SDataByUart1(0x00);//串口1发送数据0x00表示擦除完成}}}
6.4.硬件连接

图26:开发板连接图

7.外部EEPROM存储器读写多字节实验(硬件I2C)7.1.编写代码

首先,在文件中编写硬件I2C方式的读写字节函数和对E2PROM存储器的基本操作函数。请参考“实验2-14-3:外部EEPROM存储器读写单字节实验(硬件I2C)”部分。

然后,在主函数中对串口1和I2C进行初始化,并通过串口1发送不同的命令实现对单片机片外EEPROM的多字节读、写及擦除等操作。

代码清单:主函数

intmain(void)P3M1=0xFE;P3M0=0xFE;//设置为准双向口P3M1=0xFD;P3M0|=0x02;//设置为推挽输出I2C_init();//IIC初始化Uart1_Init();//串口1初始化EA=1;//使能总中断delay_ms(10);//初始化后延时while(1){if(WriteFLAG)//写模式{WriteFLAG=0;//写标志变量清零,发送一次AT24CXX_SLenByte(0x0010,scan,E2PROM_Length);//向E2PROM起始地址0x0010中连续写入scan数组中的E2PROM_Length个字节数据SDataByUart1(0x33);//串口1发送数据0x33表示写操作完成}if(ReadFLAG)//读模式{ReadFLAG=0;//读标志变量清零,发送一次AT24CXX_RcvLenByte(0x0010,buffer,E2PROM_Length);//从E2PROM地址0x0010开始连续读取E2PROM_Length字节数据并存入到buffer数组中SStringByUart1_n(buffer,E2PROM_Length);//串口1发送数组buffer中的值(即读取的多字节数据)}if(ClearFLAG)//清除模式{ClearFLAG=0;//清除标志变量清零,发送一次AT24CXX_EraseAll();//擦除整片,需要一定的耗时SDataByUart1(0x00);//串口1发送数据0x00表示擦除完成}}
7.2.硬件连接

图27:开发板连接图

总结

以上是今天要讲的内容,希望对大家有帮助,如果有啥不明白的,欢迎讨论哦!

很赞哦!(133)