短文纲发
简介
一.硬件计划
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(全称是Electrically Erasable Programmable Read-Only Memory)带电可擦除可编程只读存储器,该类存储器是用户可变更的只读存储器(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排列引脚界说是相似的,这便利用户在事情事件计划时,如遇到选择的芯片的存储空-间不够时,可在该排列中选择存储空-间更大的芯片直-取代换,而无需修改硬件部-分呢。
图一、24C02芯片引脚
STC8A8K64S4A12开拓板好的计计划了可供用户运用的AT24C02存储器芯片,其中原理图部-分及硬件物品部-分以下呢。
图二、开拓板外扩E2PROM存储器
2.开拓板DAC硬件电路推荐
I2C总线(即IIC总线)是集成电路总线(Inter-Integrated Circuit)的缩写,是一种简易.双向两线制同步串行总线呢。该I2C总线是1982年由荷兰的Philips公司为理处置电视机内的CPU和外头芯片之中联接而开拓的,能够说电视机是最早的嵌入式体制之一呢。
I2C总线是一位着实的多主机总线,如果两个或者多个主机同时初始化数据传输,能够通过矛盾检测和仲裁预防数据破坏,每逐一位联接到总线上的器件都有惟一的位置,任何器件既能够做为主机也能够或者者做为从机,但统一时刻刻只允许有一位主机呢。
2.1.主要特色
典型的I2C运用理由以下图所示,I2C总线通讯仅需两根信-号线,能够联接多个装备,从装备都有惟一的位置,主装备通过从装备的位置和区别的从装备通讯呢。
图三、典型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时的位置呢。
图四、I2C位置
☆注PCF8563时钟芯片手册上给出其I2C从机位置是8位,读位置为0xA3,写位置为0xA2呢。
图五、PCF8563芯片手册描写
由此可见,所谓的7位位置和8位位置现实上全是7位位置加之最低位的读写位,实质上是一样的,不过各个I2C接口装备的描写办法不一样呢。
I2C保留了以下表所示的两组I2C位置,这些位置用于希奇用途呢。
表一、保留位置
序号
从机位置
R/W位
描写
1
0000 000
0
广播召唤位置呢。
2
0000 000
1
最先字节呢。
3
0000 001
X
CBUS 位置呢。
4
0000 010
X
保留给区别的总线样式呢。
5
0000 011
X
保留到未来运用呢。
6
0000 1XX
X
Hs 形式主机码呢。
7
1111 1XX
X
保留到未来运用呢。
8
1111 0XX
X
10 位从机寻址呢。
2.3.I2C数据传输
■ 最先和截至条件(START and STOP conditions)
所有一些I2C事情全是以START最先.STOP结尾,最先和截至条件总是由主机发生,以下图所示,当SCL为高电平时,SDA从高电平向低电平转换表现最先条件,当SCL是高电平时,SDA由低电平向高电平转换表现截至条件呢。如果总线中存在多个主机,先将SDA拉低的主机获取总线掌控权呢。
图六、最先和截至条件
■ 字节样式(Byte format)
I2C总线发送达SDA上的数据必须为8位,即一次传输一位字节,每一次传输能够发送的字节数目不受制约呢。每逐一位字节后必须跟一位照应位,一最先的时刻传输的是数据的最高位MSB,如果从机要完结一些其余功效后,比如一位内里中止处事程-序才气吸收或者发送下一位完整的数据字节,那么从性能够将时钟线SCL维持为低电平强迫主机进去期待状态,当从机准备好吸收下一位字节数据并张开时钟线SCL后数据传输连续呢。
图七、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和寻址另一位从机而不-是一最先的时刻发生一位截至条件,在这类传输中应该有区别的读写样式结合呢。
图八、I2C总线传输时序
应该的数据传输样式有
主机发送器发送达从机吸收器,传输的方向不会更改,吸收器应对每逐一位字节,以下图所示呢。
图九、主机发送器7位位置寻址从机吸收器(传输方向不更改)
在第一位字节后,主机立刻读从机,在首次应对后,主机发送器变成主机吸收器,从机吸收器变成从机发送器呢。首次应对仍由从机变成,主机变成后续应对呢。以前发送了一位非应对(A)的主机发生STOP条件呢。
图10主机发送第一位字节后立刻读取从机
复及样式,以下图所示呢。传输更改方向的时侯,最先条件和从机位置都市被重复,但R/W位取反呢。如果主吸收器发送重复START条件,他会在重复START条件以前发送一位非应对(A)呢。
图1一、复及样式
3.STC8A8K64S4A12排列单片机I2C推荐
STC8A8K64S4A12排列单片机片内集变成了1个I2C串行总线掌控器,与标-准I2C总线一样,STC8A8K64S4A12排列单片机的I2C总线支持两种操做形式主形式和从形式呢。
图1二、I2C总线工做形式
但必-要知道STC8A8K64S4A12排列单片机的I2C协议与标-准I2C协议对比较,有以下2种机制被疏忽呢。
发送最先信-号(START)后不举行仲裁呢。
时钟信-号(SCL)停留在低电平时不举行超时检测呢。
STC8A8K64S4A12排列单片机的每一组I2C都有两个IO引脚供选择运用,以下表所示呢。.
表二、单片机I2C外设引脚分配
☆注自力GPIO表现开拓板有无其余的电路运用这个GPIO,非自力GPIO声明开拓板有其余电路用到了该GPIO呢。须知统一时刻刻只能使能一组IO口做为I2C运用呢。
STC8A8K64S4A12排列单片机I2C运用哪一组IO口由P_SW2外设端口切换寄存器2的B4.B5位决定,以下图所示呢。
图1三、外设端口切换寄存器2
☆注一样平常P_SW2寄存器B4.B5位默许是0,即如果有无对P_SW2寄存器举行操做,则默许选择的I2C是P1.4.P1.5这一组呢。
两.软件计划
1.I2C相关寄存器聚集
STC8A8K64S4A12排列单片机运用I2C外设时会用到10个寄存器,以下表所示
表三、STC8A8K64S4A12排列I2C运用寄存器汇总
2.寄存器剖析
2.1.I2C设置寄存器I2CCFG
I2C设置寄存器掌控I2C外设使能选择.工做形式.总线速率等,详见下图呢。
图1四、I2C设置寄存器I2CCFG
2.2.I2C主机掌控寄存器I2CMSCR
I2CMSCR主机掌控寄存器的设置是针对I2C已设置为主机形式才有意义的,该寄存器的B7位用来掌控主机形式的中止是否掀开,B0~B3位为主机形式下的下令,此部-分是重点,详见下图呢。
图1五、I2C主机掌控寄存器I2CMSCR
2.3.I2C主机辅佐掌控寄存器I2CMSAUX
当设置I2C总线为主机形式时,只管能够根据I2C标-准协议,掌控I2CMSCR寄存器发送主机下令,但许多场所仍然希望能够简化这个掌控流程呢。I2CMSAUX寄存器的B0位能够帮-助用户完成I2C努力发送数据并吸收ACK信-号呢。
图1六、I2C主机辅佐掌控寄存器I2CMSAUX
2.4.I2C主机状态寄存器I2CMSST
I2C主机状态寄存器B7位是可读位,用来读取I2C掌控器是否处于忙状态(BUSY),I2CMSST寄存器B6位是I2C掌控器推行I2C主机下令后的中止记号位,需软件清零呢。
图1七、I2C主机状态寄存器I2CMSST
2.5.I2C从机掌控寄存器I2CSLCR
I2CSLCR从机掌控寄存器可掌控处于从机形式下的I2C装备是否使能吸收START信-号.吸收STOP信-号.吸收1字节数据.发送1字节数据等的中止功效,详见下图呢。
图1八、I2C从机掌控寄存器I2CSLCR
2.6.I2C从机状态寄存器I2CSLST
I2C从机掌控寄存器使能了吸收START信-号.吸收STOP信-号.吸收1字节数据.发送1字节数据等的中止功效后,I2C从机状态寄存器I2CSLST不仅可读取I2C掌控器是否处于忙状态(BUSY),还能够对吸收START信-号.吸收STOP信-号.吸收1字节数据.发送1字节数据等的中止记号位举行读取,但这些位需软件清零呢。
图1九、I2C从机状态寄存器I2CSLST
2.7.I2C从机位置寄存器I2CSLADR
I2C从机位置寄存器B1~B7位是从机装备位置位,STC8A8K64S4A12排列单片机的I2C外设又设置有B0位(MA位),用来设置是否疏忽对从机装备位置的结婚呢。
图20I2C从机位置寄存器I2CSLADR
☆注前面有推荐I2C装备的位置是7位,此处I2C从机装备位置即是7位呢。
3.I2C设置措施
针对STC8A8K64S4A12排列单片机I2C,软件的设置历程以下
图2一、I2C中止办法和非中止办法软件设置措施
4.外面EEPROM存储器读写单字节试验(模拟I2C)
☆注本节的试验源码是在“试验2-8-一、串口1收发试验(P3.0和P3.1)啦”的普遍修正呢。本节对应的试验源码是“试验2-14-一、外面EEPROM存储器读写单字节试验(模拟I2C)啦”呢。
4.1.工程必-要用到的c文件
本例必-要用到的c文件以下表所示,工程必-要增添下表中的c文件呢。
表四、试验必-要用到的c文件
序号
文件名
后缀
功效描写
1
uart
.c
包罗与用户uart有关的用户自界说函数呢。
2
i2c
.c
包罗与用户i2c通讯有关的用户自界说函数呢。
3
at24cxx
.c
操做AT24C排列存储器相关的用户自界说函数呢。
4
delay
.c
包罗用户自界说延时函数呢。
4.2.头文件援用和途径设置
■ 必-要援用的头文件
include "delay.h" include "at24cxx.h" include "uart.h"
■ 必-要包罗的头文件途径
本例必-要包罗的头文件途径以下表
表五、头文件包罗途径
序号
途径
描写
1
…\ Source
uart.h.i2c.h.at24cxx.h和delay.h头文件在该途径,因此要包罗呢。
2
…\Use
STC8.h头文件在该途径,因此要包罗呢。
MDK中点击邪术棒,掀开工程设置窗口,根据下图所示增添头文件包罗途径呢。
图2二、增添头文件包罗途径
4.3.编辑代码
一最先的时刻,在i2c.c文件中编辑模拟i2c总线通讯的基本函数,以下表所示呢。
表六、模拟i2c总线通讯的相关函数聚集
关于每逐一位模拟i2c总线通讯的相关函数,下面给出一五一十代码呢。
程-序清单模拟I2C总线发生启动信-号
/*************************************************************************** * 描 述 : 模拟I2C总线发生启动信-号 * 入 参 : 无 * 返回值 : FALSE 报错 TRUE 启动成-功 **************************************************************************/ bit I2C_Start(void)
程-序清单模拟I2C总线发生截至信-号
/*************************************************************************** * 描 述 : 模拟I2C总线发生截至信-号 * 入 参 : 无 * 返回值 : 无 **************************************************************************/ void I2C_Stop(void)
程-序清单模拟I2C总线发送ACK下令
/*************************************************************************** * 描 述 : 模拟I2C总线发送ACK下令 * 入 参 : 无 * 返回值 : 无 **************************************************************************/ void I2C_Ack(void)
程-序清单模拟I2C总线发送NACK应对下令
/*************************************************************************** * 描 述 : 模拟I2C总线发送NACK应对下令 * 入 参 : 无 * 返回值 : 无 **************************************************************************/ void I2C_NoAck(void)
程-序清单模拟I2C总线吸收ACK下令
/*************************************************************************** * 描 述 : 模拟I2C总线吸收ACK下令 * 入 参 : 无 * 返回值 : FALSE 无ACK 拉; TRUE 有ACK **************************************************************************/ bit I2C_Check_ACK(void) SCL = 0; //I2C时钟线置低电平,完结了在SCL线上发生一位时钟,这个时候SDA为低电平 return TRUE; }
程-序清单模拟I2C总线发送数据
/*************************************************************************** * 描 述 : 模拟I2C总线发送数据(数据从高位到低位) * 入 参 : 无 * 返回值 : FALSE 无ACK 拉; TRUE 有ACK **************************************************************************/ void I2C_SendByte(uint8 SendByte) SCL = 0; }
程-序清单模拟I2C总线吸收数据
/*************************************************************************** * 描 述 : 模拟I2C总线吸收数据 * 入 参 : 无 * 返回值 : I2C总线返回的数据 **************************************************************************/ uint8 I2C_ReceiveByte(void) } SCL = 0; return ReceiveByte; }
然后,在at24cxx.c文件中编辑对E2PROM存储器的基本操做函数,以下表所示呢。
序号
函数名
功效描写
1
AT24CXX_RcvOneByte
从E2PROM指定位置读取单字节数据呢。
2
AT24CXX_SendOneByte
向E2PROM指定位置存入单字节数据呢。
3
AT24CXX_SendLenByte
向E2PROM指定位置存入多字节数据呢。
4
AT24CXX_RcvLenByte
从E2PROM指定位置读取多字节数据呢。
5
AT24CXX_EraseOneByte
擦除E2PROM指定位置单字节数据呢。
6
AT24CXX_EraseAll
擦除所有E2PROM芯片呢。
关于每逐一位操做外面E2PROM相关用户函数,下面给出一五一十代码呢。
程-序清单从指定位置读取单字节数据函数
/*********************************************************************************** * 描 述 : 从芯片AT24CXX指定位置读取单字节数据 * 入 参 : 最先读数据的位置 * 返回值 : 读到的数据 ***********************************************************************************/ uint8 AT24CXX_RcvOneByte(uint16 Addr) else I2C_SendByte(SLAW+((Addr/256)<<1)); //发送器件位置,写数据 I2C_Check_ACK(); //期待应对 I2C_SendByte(Addr%256); //发送低位置 I2C_Check_ACK(); //期待应对 I2C_Start(); //启动总线 I2C_SendByte(SLAR); //设置为读形式 I2C_Check_ACK(); //期待应对 temp=I2C_ReceiveByte(); //读字节 I2C_Stop(); //结尾总线 return temp; }
程-序清单向指定位置存入单字节数据函数
/*********************************************************************************** * 描 述 : 向芯片AT24CXX指定位置写入单字节数据 * 入 参 : Addr写入的目的最先位置 Data要写入的数据 * 返回值 : 无 ***********************************************************************************/ void AT24CXX_SendOneByte(uint16 Addr,uint8 Data) else I2C_SendByte(SLAW+((Addr/256)<<1)); //发送器件位置,写数据 I2C_Check_ACK(); //期待应对 I2C_SendByte(Addr%256); //发送低位置 I2C_Check_ACK(); //期待应对 I2C_SendByte(Data); //发送字节数据 I2C_Check_ACK(); //期待应对 I2C_Stop(); //结尾总线 delay_ms(10); //该延时确维连续发送字节的稳固性 }
程-序清单向指定位置存入多字节数据函数
/*********************************************************************************** * 描 述 : 向芯片AT24CXX内里的指定位置最先写入长度为Len的数据 * 入 参 : Addr写入的目的最先位置 Data要写入的数据 Len要写入数据的长度 * 返回值 : 无 ***********************************************************************************/ void AT24CXX_SendLenByte(uint16 Addr,uint8 *Data,uint16 Len) }
程-序清单从指定位置读取多字节数据函数
/*********************************************************************************** * 描 述 : 从芯片AT24CXX内里的指定位置最先读出长度为Len的数据 * 入 参 : Addr读出的目的最先位置 Data读出的数据 Len要读出数据的长度 * 返回值 : 无 ***********************************************************************************/ void AT24CXX_RcvLenByte(uint16 Addr,uint8 *Data,uint16 Len) }
程-序清单从指定位置擦除单字节数据函数
/*********************************************************************************** * 描 述 : 擦除芯片AT24CXX指定位置数据 * 入 参 : Addr要擦除的目的位置 * 返回值 : 无 ***********************************************************************************/ void AT24CXX_EraseOneByte(uint16 Addr)
程-序清单擦除整片数据函数
/************************************************************************************ 功效描写擦除所有芯片AT24CXX(即芯片存储单元数据全是0xFF) 入口参数无 返回值无 备注: 区别的存储芯片,存储空-间区别,AT24CXX_SIZE数值区别呢。 *************************************************************************************/ void AT24CXX_EraseAll(void) }
最终,在主函数中对串口1举行初始化,并通过串口1发送区别的下令完成对单片机片外E2PROM的单字节读.写及擦除等操做呢。
代码清单主函数
int main(void) uint8 Temp; P3M1 &= 0xFE; P3M0 &= 0xFE; //设置P3.0为准双向口 P3M1 &= 0xFD; P3M0 |= 0x02; //设置P3.1为推挽输入 Uart1_Init(); //串口1初始化 EA = 1; //使能总中止 delay_ms(10); //初始化后延时 while(1) if(ReadFLAG) //读形式 if(ClearFLAG) //消除形式 }
4.4.硬件联接
图2三、开拓板联接图
5.外面EEPROM存储器读写多字节试验(模拟I2C)
5.1.编辑代码
一最先的时刻,在at24cxx.c文件中编辑模拟I2C办法的读写字节函数和对E2PROM存储器的基本操做函数呢。请遵照“试验2-14-一、外面EEPROM存储器读写单字节试验(模拟I2C)啦”部-分呢。
然后,在主函数中对串口1举行初始化,并通过串口1发送区别的下令完成对单片机片外E2PROM的多字节读.写及擦除等操做呢。
代码清单主函数
int main(void) if(ReadFLAG) //读形式 if(ClearFLAG) //消除形式 } }
5.2.硬件联接
图2四、开拓板联接图
6.外面EEPROM存储器读写单字节试验(硬件I2C)
6.1.工程必-要用到的c文件
本例必-要用到的c文件以下表所示,工程必-要增添下表中的c文件呢。
表八、试验必-要用到的c文件
序号
文件名
后缀
功效描写
1
uart
.c
包罗与用户uart有关的用户自界说函数
2
i2c
.c
包罗与用户i2c通讯有关的用户自界说函数
3
at24cxx
.c
操做AT24C排列存储器相关的用户自界说函数
4
delay
.c
包罗用户自界说延时函数
6.2.头文件援用和途径设置
■ 必-要援用的头文件
include "delay.h" include "at24cxx.h" include "uart.h"
■ 必-要包罗的头文件途径
本例必-要包罗的头文件途径以下表
表九、头文件包罗途径
序号
途径
描写
1
…\ Source
uart.h.i2c.h.at24cxx.h和delay.h头文件在该途径,因此要包罗
2
…\User
STC8.h头文件在该途径,因此要包罗
MDK中点击邪术棒,掀开工程设置窗口,根据下图所示增添头文件包罗途径呢。
图2五、增添头文件包罗途径
6.3.编辑代码
一最先的时刻,在i2c.c文件中对硬件I2C举行初始化,并编辑硬件I2C总线通讯的基本函数,以下表所示呢。
表八、试验必-要用到的c文件
关于每逐一位硬件i2c总线通讯的相关函数,下面给出一五一十代码呢。
程-序清单硬件I2C初始化函数
/*************************************************************************** * 描 述 : I2C初始化函数 * 入 参 : 无 * 返回值 : 无 **************************************************************************/ void I2C_init(void)
程-序清单硬件I2C总线期待中止记号位函数
/*************************************************************************** * 描 述 : I2C总线期待中止记号位 * 入 参 : 无 * 返回值 : 无 **************************************************************************/ void I2C_Wait(void)
程-序清单硬件I2C总线发生启动信-号函数
/*************************************************************************** * 描 述 : I2C总线发生启动信-号 * 入 参 : 无 * 返回值 : 无 **************************************************************************/ void I2C_Start(void)
程-序清单硬件I2C总线发生截至信-号函数
/*************************************************************************** * 描 述 : I2C总线发生截至信-号 * 入 参 : 无 * 返回值 : 无 **************************************************************************/ void I2C_Stop(void)
程-序清单硬件I2C总线发送ACK下令函数
/*************************************************************************** * 描 述 : I2C总线发送ACK下令 * 入 参 : 无 * 返回值 : 无 **************************************************************************/ void I2C_SendACK(void)
程-序清单硬件I2C总线发送NACK应对下令函数
/*************************************************************************** * 描 述 : I2C总线发送NACK应对下令 * 入 参 : 无 * 返回值 : 无 **************************************************************************/ void I2C_SendNAK(void)
程-序清单硬件I2C总线吸收ACK下令函数
/*************************************************************************** * 描 述 : I2C总线吸收ACK下令 * 入 参 : 无 * 返回值 : 无 **************************************************************************/ void I2C_RecvACK(void)
程-序清单硬件I2C总线发送数据函数
/*************************************************************************** * 描 述 : I2C总线发送数据 * 入 参 : 无 * 返回值 : 无 **************************************************************************/ void I2C_SendData(uint8 dat)
程-序清单硬件I2C总线吸收数据函数
/*************************************************************************** * 描 述 : I2C总线吸收数据 * 入 参 : 无 * 返回值 : I2C总线返回的数据 **************************************************************************/ uint8 I2C_RecvData(void)
然后,在at24cxx.c文件中编辑对E2PROM存储器的基本操做函数,以下表所示呢。
表1一、E2PROM相关用户函数聚集
关于每逐一位操做外面E2PROM相关用户函数,下面给出一五一十代码呢。
程-序清单从指定位置读取单字节数据函数
/*********************************************************************************** * 描 述 : 在芯片AT24CXX指定位置读出一位数据 * 入 参 : 最先读数据的位置 * 返回值 : 读到的数据 ***********************************************************************************/ uint8 AT24CXX_RcvOneByte(uint16 Addr) else I2C_SendData(SLAW+((Addr/256)<<1)); //发送器件位置,写数据 I2C_RecvACK(); //期待应对 I2C_SendData(Addr%256); //发送低位置 I2C_RecvACK(); //期待应对 I2C_Start(); //启动总线 I2C_SendData(SLAR); //设置为读形式 I2C_RecvACK(); //期待应对 temp=I2C_RecvData(); //读字节 I2C_Stop(); //结尾总线 return temp; }
程-序清单向指定位置存入单字节数据函数
/*********************************************************************************** * 描 述 : 在芯片AT24CXX指定位置写入一位数据 * 入 参 : Addr写入的目的最先位置 Data要写入的数据 * 返回值 : 无 ***********************************************************************************/ void AT24CXX_SendOneByte(uint16 Addr,uint8 Data) else I2C_SendData(SLAW+((Addr/256)<<1)); //发送器件位置,写数据 I2C_RecvACK(); //期待应对 I2C_SendData(Addr%256); //发送低位置 I2C_RecvACK(); //期待应对 I2C_SendData(Data); //发送字节数据 I2C_RecvACK(); //期待应对 I2C_Stop(); //结尾总线 delay_ms(10); //该延时确维连续发送字节的稳固性 }
程-序清单向指定位置存入多字节数据函数
/*********************************************************************************** * 描 述 : 向芯片AT24CXX内里的指定位置最先写入长度为Len的数据 * 入 参 : Addr写入的目的最先位置 Data要写入的数据 Len要写入数据的长度 * 返回值 : 无 ***********************************************************************************/ void AT24CXX_SendLenByte(uint16 Addr,uint8 *Data,uint16 Len) }
程-序清单从指定位置读取多字节数据函数
/*********************************************************************************** * 描 述 : 从芯片AT24CXX内里的指定位置最先读出长度为Len的数据 * 入 参 : Addr读出的目的最先位置 Data读出的数据 Len要读出数据的长度 * 返回值 : 无 ***********************************************************************************/ void AT24CXX_RcvLenByte(uint16 Addr,uint8 *Data,uint16 Len) }
程-序清单从指定位置擦除单字节数据函数
/*********************************************************************************** * 描 述 : 擦除芯片AT24CXX指定位置数据 * 入 参 : Addr要擦除的目的位置 * 返回值 : 无 ***********************************************************************************/ void AT24CXX_EraseOneByte(uint16 Addr)
程-序清单擦除整片数据函数
/*********************************************************************************** 功效描写擦除所有芯片AT24CXX(即芯片存储单元数据全是0xFF) 入口参数无 返回值无 备注: 区别的存储芯片,存储空-间区别,AT24CXX_SIZE数值区别呢。 ************************************************************************************/ void AT24CXX_EraseAll(void) }
最终,在主函数中对串口1和I2C举行初始化,并通过串口1发送区别的下令完成对单片机片外E2PROM的单字节读.写及擦除等操做呢。
代码清单主函数
int main(void) if(ReadFLAG) //读形式 if(ClearFLAG) //消除形式 } }
6.4.硬件联接
图2六、开拓板联接图
7.外面EEPROM存储器读写多字节试验(硬件I2C)
7.1.编辑代码
一最先的时刻,在at24cxx.c文件中编辑硬件I2C办法的读写字节函数和对E2PROM存储器的基本操做函数呢。请遵照“试验2-14-三、外面EEPROM存储器读写单字节试验(硬件I2C)啦”部-分呢。
然后,在主函数中对串口1和I2C举行初始化,并通过串口1发送区别的下令完成对单片机片外EEPROM的多字节读.写及擦除等操做呢。
代码清单主函数
int main(void) P3M1 &= 0xFE; P3M0 &= 0xFE; //设置P3.0为准双向口 P3M1 &= 0xFD; P3M0 |= 0x02; //设置P3.1为推挽输入 I2C_init(); //IIC初始化 Uart1_Init(); //串口1初始化 EA = 1; //使能总中止 delay_ms(10); //初始化后延时 while(1) if(ReadFLAG) //读形式 if(ClearFLAG) //消除形式 }
7.2.硬件联接
图2七、开拓板联接图
总结
以上是今天要讲的内容,希望对我们有帮-助,如果有啥不清晰的,迎接讨论哦!
发表评论