单片机EEPROM多字节读写操作时序

发布者:开国古泉最新更新时间:2016-12-24 来源: eefocus关键字:单片机  EEPROM  多字节读写  操作时序 手机看文章 扫描二维码
随时随地手机看文章

我们读取 EEPROM 的时候很简单,EEPROM 根据我们所送的时序,直接就把数据送出来了,但是写 EEPROM 却没有这么简单了。给 EEPROM 发送数据后,先保存在了 EEPROM的缓存,EEPROM 必须要把缓存中的数据搬移到“非易失”的区域,才能达到掉电不丢失的效果。而往非易失区域写需要一定的时间,每种器件不完全一样,ATMEL 公司的 24C02 的这个写入时间最高不超过 5ms。在往非易失区域写的过程,EEPROM 是不会再响应我们的访问的,不仅接收不到我们的数据,我们即使用 I2C 标准的寻址模式去寻址,EEPROM 都不会应答,就如同这个总线上没有这个器件一样。数据写入非易失区域完毕后,EEPROM 再次恢复正常,可以正常读写了。


细心的同学,在看上一节程序的时候会发现,我们写数据的那段代码,实际上我们有去读应答位 ACK,但是读到了应答位我们也没有做任何处理。这是因为我们一次只写一个字节的数据进去,等到下次重新上电再写的时候,时间肯定远远超过了 5ms,但是如果我们是连续写入几个字节的时候,就必须得考虑到应答位的问题了。写入一个字节后,再写入下一个字节之前,我们必须要等待 EEPROM 再次响应才可以,大家注意我们程序的写法,可以学习一下。


之前我们知道编写多.c 文件移植的方便性了,本节程序和上一节的 Lcd1602.c 文件和I2C.c 文件完全是一样的,因此这次我们只把 main.c 文件给大家发出来,帮大家分析明白。


而同学们却不能这样,同学们是初学,很多知识和技巧需要多练才能巩固下来,因此每个程序还是建议大家在你的 Keil 软件上一个代码一个代码的敲出来。

/*****************************I2C.c 文件程序源代码*******************************/

(此处省略,可参考之前章节的代码)

/***************************Lcd1602.c 文件程序源代码*****************************/

(此处省略,可参考之前章节的代码)

/*****************************main.c 文件程序源代码******************************/

#include

extern void InitLcd1602();

extern void LcdShowStr(unsigned char x, unsigned char y, unsigned char *str);

extern void I2CStart();

extern void I2CStop();

extern unsigned char I2CReadACK();

extern unsigned char I2CReadNAK();

extern bit I2CWrite(unsigned char dat);

void E2Read(unsigned char *buf, unsigned char addr, unsigned char len);

void E2Write(unsigned char *buf, unsigned char addr, unsigned char len);

void MemToStr(unsigned char *str, unsigned char *src, unsigned char len);

void main(){

    unsigned char i;

    unsigned char buf[5];

    unsigned char str[20];

    InitLcd1602(); //初始化液晶

    E2Read(buf, 0x90, sizeof(buf)); //从 E2 中读取一段数据

    MemToStr(str, buf, sizeof(buf)); //转换为十六进制字符串

    LcdShowStr(0, 0, str); //显示到液晶上

    for (i=0; i

        buf[i] = buf[i] + 1 + i;

    }

    E2Write(buf, 0x90, sizeof(buf)); //再写回到 E2 中

    while(1);

}

/* 将一段内存数据转换为十六进制格式的字符串,

str-字符串指针,src-源数据地址,len-数据长度 */

void MemToStr(unsigned char *str, unsigned char *src, unsigned char len){

    unsigned char tmp;

   

    while (len--){

        tmp = *src >> 4; //先取高 4 位

        if (tmp <= 9){ //转换为 0-9 或 A-F

            *str++ = tmp + '0';

        }else{

            *str++ = tmp - 10 + 'A';

        }

        tmp = *src & 0x0F; //再取低 4 位

        if (tmp <= 9){ //转换为 0-9 或 A-F

            *str++ = tmp + '0';

        }else{

            *str++ = tmp - 10 + 'A';

        }

        *str++ = ' '; //转换完一个字节添加一个空格

        src++;

    }

}

/* E2 读取函数,buf-数据接收指针,addr-E2 中的起始地址,len-读取长度 */

void E2Read(unsigned char *buf, unsigned char addr, unsigned char len){

    do { //用寻址操作查询当前是否可进行读写操作

        I2CStart();

        if (I2CWrite(0x50<<1)){ //应答则跳出循环,非应答则进行下一次查询

            break;

        }

        I2CStop();

    } while(1);

    I2CWrite(addr); //写入起始地址

    I2CStart(); //发送重复启动信号

    I2CWrite((0x50<<1)|0x01); //寻址器件,后续为读操作

    while (len > 1){ //连续读取 len-1 个字节

        *buf++ = I2CReadACK(); //最后字节之前为读取操作+应答

        len--;

    }

    *buf = I2CReadNAK(); //最后一个字节为读取操作+非应答

    I2CStop();

}

/* E2 写入函数,buf-源数据指针,addr-E2 中的起始地址,len-写入长度 */

void E2Write(unsigned char *buf, unsigned char addr, unsigned char len){

    while (len--){

        do { //用寻址操作查询当前是否可进行读写操作

            I2CStart();

            if (I2CWrite(0x50<<1)){ //应答则跳出循环,非应答则进行下一次查询

                break;

            }

            I2CStop();

        } while(1);

        I2CWrite(addr++); //写入起始地址

        I2CWrite(*buf++); //写入一个字节数据

        I2CStop(); //结束写操作,以等待写入完成

    }

}

函数 MemToStr:可以把一段内存数据转换成十六进制字符串的形式。由于我们从EEPROM 读出来的是正常的数据,而 1602 液晶接收的是 ASCII 码字符,因此我们要通过液晶把数据显示出来必须先通过一步转换。算法倒是很简单,就是把每一个字节的数据高 4 位和低 4 位分开,和 9 进行比较,如果小于等于 9,则直接加„0‟转为 0~9 的 ASCII 码;如果大于 9,则先减掉 10 再加„A‟即可转为 A~F 的 ASCII 码。


函数 E2Read:我们在读之前,要查询一下当前是否可以进行读写操作,EEPROM 正常响应才可以进行。进行后,读最后一个字节之前的,全部给出 ACK,而读完了最后一个字节,我们要给出一个 NAK。


函数 E2Write:每次写操作之前,我们都要进行查询判断当前 EEPROM 是否响应,正常响应后才可以写数据。


关键字:单片机  EEPROM  多字节读写  操作时序 引用地址:单片机EEPROM多字节读写操作时序

上一篇:单片机EEPROM单字节读写操作时序
下一篇:单片机I2C和EEPROM的综合编程

推荐阅读最新更新时间:2024-03-16 15:26

51单片机应用之无线通讯模块NRF24L01+
本教程关于NRF24L01+的内容十分详细,对于大家的学习和调试及其有帮助 内含详细教程: 单片机源程序如下: 接下来我们写发送程序: //********************************** // NRF24L01+模块发射程序 // 用8个LED调试 // Txz001 2012.05.16 //********************************** #include reg52.h typedef unsigned char uchar; //将无符号字节类型重定义为uchar typedef unsigned int uint; //将无符号整数类型重定义为Uint
[单片机]
51<font color='red'>单片机</font>应用之无线通讯模块NRF24L01+
单片机印刷电路板(PCB)的电磁兼容性设计
 PCB是 单 片机系统中电路元件和器件的支撑件,它提供电路元件和器件之间的电气连接。随着电子技术的飞速发展,PCB的密度越来越高。PCB设计的好坏对单片机系统的电磁兼容性影响很大,实践证明,即使电路原理图设计正确,印刷电路板设计不当,也会对单片机系统的可靠性产生不利影响。例如,如果印刷板两条细平行线靠得很近,则会形成信号波形的延迟,在传输线的终端形成反射噪声。因此,在设计印刷电路板的时候,应注意采用正确的方法,遵守PCB设计的一般原则,并应符合抗干扰设计的要求。   1. PCB设计的一般原则   要使电子电路获得最佳性能,元器件的布局及导线的布设是很重要的。为了设计质量好、成本低的PCB,应遵循以下一般性原则。   (1)特
[单片机]
PIC18f4520单片机驱动H1632的C语言程序
#include p18f4520.h #include delays.h //#pragma config OSC = HS //配置内部振荡器Fosc/4 RA7,IO口RA7 //#pragma config PWRT =OFF //#pragma config BOREN = OFF //#pragma config WDT = OFF //#pragma config MCLRE = ON //#pragma config PBADEN = OFF //#pragma config LVP = OFF #define CLK PORTCbits.RC3 #define DAT PORTCbits.RC5 #define
[单片机]
PIC18f4520<font color='red'>单片机</font>驱动H1632的C语言程序
MCS-51系列单片机控制寄存器TCON(88H)
特殊功能寄存器TCON的高4位为定时器的运行控制位和溢出标志位,低4位为外部中断的触发方式控制位和锁存外部中断请求源。TCON格式如下: D7 D6 D5 D4 D3 D2 D1 D0 TF1 TR1 TF0 TR0 IE1 IT1 IE0 IT0   1.定时器T0运行控制位TR0      TR0由软件置位和清“0”。门控位GATE为0时,T0的计数仅由TR0控制,TR0为1时允许T0计数,TR0为0时禁止T0计数;门控位GATE为1时,仅当TR0等于1且INT0(P3.2)输入为高 电平 时T0才计数,TR0为0或INT0输入低电平时都禁止T0计数。   2.定时器T0溢出标志位TF0      当T0被允许计数以后,
[单片机]
我对单片机职业规划的几点看法
这几天看了很多关于“类似单片机的出路”的帖子,就觉得大家有点悲观了。首先,单片机不是万能的,但没有单片机那是万万不能的。从NN年前的单片机,到现在的单片机,单片机只是单片机,其性质并没有太多的改变。只是从原来的“神秘”、“暴利”、“有趣”等等,回归了她原来的真是面目罢了--那只是在说明社会在进步,更加的合理和趋于理性。只是现在的这样回归,有点走了极端罢了,从一个极端走了另一个极端罢了。但相反社会在这方面的需求却是越来越大,至少在我们的有生之年,这样的“自动化”过程一直会贯穿下去。所以你有什么好担心的,怕自己没有用武之地吗?! 怕自己的资薪没有或不高吗?! 我自己在单片机和自己熟悉的行业上做了快10年了,不说自己的水平怎么样。说牛
[单片机]
爱特梅尔和Telit革新“机器对机器”设计
微控制器技术厂商爱特梅尔公司 (Atmel® Corporation) 和全球机器对机器 (machine-to-machine, M 2M ) 通信技术领导厂商 Telit Communications PLC 公司联合宣布, Telit 现已选用爱特梅尔的专有技术来开发其高性能 M 2M 模块。 GE863-PRO3 是 Telit 双处理器系列的第一款产品,集成了一个爱特梅尔的 ARM9 处理器 AT91SAM9260 与一个 GPRS 通信专用处理器,两者配合一起运行应用程序。 GE863-PRO3 可提供超高的处理能力和灵活性,满足现今 M 2M
[单片机]
51单片机LED点阵显示文字
51单片机LED点阵显示文字 代码如下。 #include REGX51.H #define u8 unsigned char sbit SER = P3^4; sbit RCLK = P3^5; sbit SCLK = P3^6; //横向 D0- D7 u8 tao ={8,240,8,15,8,136,126,145,8,82,8,2,62,8,8,231,8,129,126,129,72,231,72,129,88,129,40,129,8,255,8,129}; u8 heng = { 0x00,0x01,0x00,0x02,0x00,0x04,0x00,0x08, 0x00,0x10,0x00,0x
[单片机]
51<font color='red'>单片机</font>LED点阵显示文字
MCX A:新的通用MCU和资源丰富的FRDM开发平台
恩智浦正式发布MCX A14x和A15x系列“通用”微控制器。MCX A隶属于MCX产品组合,基于Arm® Cortex®-M33内核平台。 MCX的理念是将主流恩智浦器件的卓越特色与创新功能结合起来,打造下一代智能边缘设备 。 可扩展性是MCX产品组合的一个重要优势。MCX A系列在该产品组合中发挥着重要作用,是各类应用的基础。它面向多个市场的广泛应用,包括: 工业通信 智能计量 自动化与控制 传感器 低功耗/电池供电设备 MCX A14x的工作频率为48MHz,MCX A15x的工作频率为96MHz。器件的封装选项包括32引脚QFN、48引脚QFN和64引脚LQFP。MCX A器件的所有封装类型在IO
[单片机]
MCX A:新的通用<font color='red'>MCU</font>和资源丰富的FRDM开发平台
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved