基于i2c协议的eeprom读写功能实现(编辑修改稿)内容摘要:

的命令。 2. 确认 查询 在写周期期间器件不会对命令作出确认,这可用来确定写周期何时完成(这个特点可以优化总线的吞吐量,使其最大化)。 如果主器件已经发出写命令的停止条件,器件将启动内部定时写周期。 可以随时进行确认查询。 这包括在主器件发出起始条件后,再发送用于写命令( R/W = 0)的控制字节。 如果器件仍处在写周期内,则不返回确认信号。 一旦没有返回确认信号,起始位和控制字节必须重新发送。 如果写周期结束,器件返回确认信号,主器件就可以执行下一个读或写命令。 参见流程图( 图 9)。 3. 读操作 读数据过程: 1) 主控在检测到总线空 闲的状况下,首先发送一个 START 信号掌管总线; 2) 发送一个控制字节(包括 7 位器件地址码和一位 R/W);(某些器件的地址字节可能带有其他功能) 3) 当被控器件检测到主控发送的地址与自己的地址相同时发送一个应答信号( ACK); 4) 主控收到 ACK 后释放数据总线,开始接收第一个数据字节; 5) 主控收到数据后发送 ACK 表示继续传送数据,发送 NACK 表示传送数据结束; 6) 主控发送完全部数据后,发送一个停止位 STOP,结束整个通讯并且释放总线; 图 4 页写入 操作 基于 I2C 协议 EEPROM 读写功能的实现 8 除了控制寄存器的 R/W 位设置为‘ 1’外,读操作与写操作基本相同。 有 三种基本的读操作:当前地址的读操作、随机读操作和连续读操作。 ( 1) 当前地址的读操作 当前地址的读操作, 被控器件内部储存器地址计数器保留最后一次访问的地址。 24XX 内置一个自动加‘ 1’地址计数器,该计数器保留最后一次访问的地址。 因此,如果先前对地址‘ n’( n 为任意合法地址)进行读或写操作,则下一条读操作命令将可能从地址n+1 访问数据。 接收到 R/W 位设置为‘ 1’的控制字节后, 24XX 发出确认信号,并发送 8 位数据字节。 主器件不会对数据传输作出确认,但会产生停止条件, 24XX 即停止数据发送( 图 5) ( 2) 随机读操作 随机读操作允许主器件以随机方式访问任意存储器 , 主控器件先发写命令,然后发要读的地址,然后发读命令。 执行该指令前必须先设置地址字节。 作为写操作的一部分,通过发送字节地址给 24XX 来完成地址字节的设置( R/W 设置为‘ 0’)。 字节地址发送完后 ,主器件一接收到确认信号即产生起始条件。 内部地址计数器设置完之后写操作即被终止。 主器件再次发送控制字节,而该字节中 R/W 位设置为‘ 1’。 之后 24XX 会发出确认信号, 并发送 8 位数据字节。 主器件不会对数据传输作出确认,但会产生停止条件, 24XX 即停止数据发送(图 6)。 在随机读取命令之后,内部地址计数器加 1 指向下一条地址。 图 5 当前地址读操作 基于 I2C 协议 EEPROM 读写功能的实现 9 ( 3) 连续读操作 连续读操作的起动过程和随机读操作相同,只是在 24XX发送完第一个数据字节后,主器件发出确认信号,而在随机读操作中发送的是停止条件 ,在连续读操作时 被控器件完成一个读字节操作后内部地址计数器自动加一。 确认信号指示 24XX 器件发送下一个连续地址的数据字节(图 7)。 在 24器件向主器件发送完最后一个字节后,主器件不会产生确认信号,而是产生停止条件。 为了可以进行连续读操作, 24XX 器件内置了一个地址指针,在每次操作完成后该指针加 1。 地址指针允许一次操作连续读取整个存储器的内容。 在达到最后一个地址字节后,地址指针将翻转到地址 0x00。 图 6 随机 读操作 图 7 连续 读操作 基于 I2C 协议 EEPROM 读写功能的实现 10 六. 具体设计过 程 1. 程序流程图 启动 I2C 总线 发送控制字节 检测应答信号 ACK 发送第一个数据字节 检测应 答信号 ACK 继续传送数据 发送停止位,释放 I2C 总线 完成数据的写操作 传送数据结束 N Y N Y 图 8 写数据的流程图 基于 I2C 协议 EEPROM 读写功能的实现 11 发送写命令 发送停止条件 以启动写周期 发送起始位 发送控制字节 (其中 R/W = 0) 下一步操作 器件确认否。 ( ACK = 0)。 N Y 图 9 确认查询流程图 基于 I2C 协议 EEPROM 读写功能的实现 12 2.系统组成模块结构及功能 ( 1)函数定义 函数定义是对各个基础函数的定义 ,并且设置需要运用的信息,便于调用 include include include define DELAY_TIME 60 /*延时时间 */ define TRUE 1/*设置 ACK*/ define FALSE 0/*定义 0为错误 */ 启动 I2C 总线 发送控制字节 检测应答信号 ACK 释放总线,接收第一个数据字节 检测应答信号 ACK 继续接收数据 发送停止位,释放 I2C 总线 完成数据的读操作 传送数据结束 N Y N Y 图 10 读数据流程图 基于 I2C 协议 EEPROM 读写功能的实现 13 sbit SCL=P1^7。 sbit SDA=P1^6。 /*假设由 */ void DELAY(unsigned int t) /*延时函数 */ void I2C_Start(void) /*启动 I2C总线 */ void I2C_Stop(void) /*终止 I2C总线 */ void SEND_0(void) /* 设置时钟, 发送 0,在 SCL为高电平时使 SDA信号为低 */ void SEND_1(void) /* 设置时 钟, 发送 1,在 SCL为高电平时使 SDA信号为高 */ bit Check_Acknowledge(void) /*发送完一个字节后检验设备的应答信号 */ void WriteI2CByte(char b)reentrant/*向 I2C总线写一个字节 */ char ReadI2CByte(void)reentrant/*从 I2C总线读一个字节 */ void Write_One_Byte(char addr,char thedata) /*字节写入函数 */ void Write_A_Page(char *buffer,char addr) /*页写入函数 */ char Read_One_Byte(char addr) /*随机读函数 */ void Read_N_Bytes(char *buffer,char n,char addr) /*顺序读函数 */ ( 2)主函数 mai。
阅读剩余 0%
本站所有文章资讯、展示的图片素材等内容均为注册用户上传(部分报媒/平媒内容转载自网络合作媒体),仅供学习参考。 用户通过本站上传、发布的任何内容的知识产权归属用户或原始著作权人所有。如有侵犯您的版权,请联系我们反馈本站将在三个工作日内改正。