IIC软件模拟-读写EEPROM

这里写目录标题

    • 1.IIC简介
    • 2. I2C 基本读写过程
        • 2.1.主机写数据到从机
        • 2.2.主机由从机中读数据
        • 2.3.读和写数据
        • 2.4.地址及数据方向
        • 2.5.响应信号
    • 3.软件模拟I2C
    • 4.软件模拟IIC实现过程
        • 4.1.IIC开启信号
        • 4.2.IIC结束信号
        • 4.3.主机向I2C总线设备发送8bit数据
        • 4.4.主机读取8bit数据
        • 4.5.CPU产生一个时钟,并读取器件的ACK应答信号
        • 4.6.应答信号
        • 4.7.非应答信号
        • 4.8.发送设备地址(SLAVE_ADDRESS)
        • 4.9.信号逻辑配置完成**
    • 5.EEPROM芯片
    • 6.通过I2C协议向EEPROM写入数据。
    • 编程要点
        • 6.1.判断EEPROM是否正常
        • 6.2.读取指定地址处开始的数据
    • 6.3.向串行EEPROM指定地址写入若干数据
        • 6.4.EEPROM数据擦除
    • 6.工程文件

1.IIC简介

IIC和EEPROM详解
IIC总线是一种由 PHILIPS 公司开发的两线式串行总线,用于连接微控制器及其外围设备。它是由数据线 SDA时钟 SCL 构成的串行总线,可发送和接收数据。
I2C 总线在传送数据过程中共有三种类型信号, 它们分别是:开始信号、结束信号和应答信号
开始信号:SCL 为高电平时,SDA 由高电平向低电平跳变,开始传送数据。
结束信号:SCL 为高电平时,SDA 由低电平向高电平跳变,结束传送数据。
应答信号:接收数据的 IIC 在接收到 8bit 数据后,向发送数据的IIC 发出特定的低电平脉冲,表示已收到数据

时序图

IIC软件模拟-读写EEPROM

2. I2C 基本读写过程

注:

IIC软件模拟-读写EEPROM数据由从机发送数据到主机

1、S 表示由主机的 I2C 接口产生的传输起始信号 (S),这时连接到 I2C 总线上的所有从机都会 接收到这个信号
起始信号产生后,所有从机就开始等待主机紧接下来广播的从机地址信号 (SLAVE_ADDRESS)。 在 I2C总线上,每个设备的地址都是唯一的,当主机广播的地址与某个设备地址相同时,这个设 备就被选中了,没被选中的设备将会忽略之后的数据信号
2、在地址位之后,是传输方向的选择位,该位为 0 时,表示后面的数据传输方向是由主机传输至从机,即主机向从机写数据。该位为 1 时,则相反,即主机由从机读数据
3.从机接收到匹配的地址后,主机或从机会返回一个应答 或非应答 信号,只有接收到应答信号后,主机才能继续发送或接收数据
4、主机开始正式向从机传输数据,数据包的大小为 8 位,主机每发送完一个字节数据,都要等待从机应答信号,重复这个过程,可以向从机传输 N 个数据,这个 N 没有大小限制。当数据传输结束时,主机向从机发送一个**停止传输信号 **,表示不再传输数据。

2.1.主机写数据到从机

IIC软件模拟-读写EEPROM
S(开始信号) ->SLAVE ADDRESS(主机发送从机的地址)->R(选择主机读数据到从机)->A(从机发送应答信号到主机) ->DATA(主机收到从机的数据)->A(主机应答信号) ->… -> !A(非应答信号) ->P(结束信号)

2.3.读和写数据

IIC软件模拟-读写EEPROM
读数据方向时,主机会释放对 SDA 信号线的控制,由从机控制 SDA 信号线,主机接收信号,写数据方向时SDA 由主机控制,从机接收信号。

2.5.响应信号

I2C 的数据和地址传输都带响应。响应包括“应答 (ACK)”和“非应答 (NACK)”两种信号。作为数据接收端时,当设备 (无论主从机) 接收到 I2C 传输的一个字节数据或地址后,若希望对方继续发送数据,则需要向对方发送“应答 (ACK)”信号,发送方会继续发送下一个数据;若接收端希望结束数据传输,则向对方发送“非应答 (NACK)”信号,发送方接收到该信号后会产生一个停止信号,结束信号传输。

IIC软件模拟-读写EEPROM

4.4.主机读取8bit数据

4.5.CPU产生一个时钟,并读取器件的ACK应答信号

4.6.应答信号

4.7.非应答信号

4.8.发送设备地址(SLAVE_ADDRESS)

4.9.信号逻辑配置完成**

.C文件

#include "software.h"#include "stm32f10x.h"static void I2C_GPIO_Config(void){	GPIO_InitTypeDef GPIO_InitStructure;	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);	/* 打开GPIO时钟 */	GPIO_InitStructure.GPIO_Pin = SCL_PIN | SDA_PIN;	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_OD;  	/* 开漏输出 */	GPIO_Init(GPIO_x, &GPIO_InitStructure);	/* 给一个停止信号, 复位I2C总线上的所有设备到待机模式 */	I2C_Stop();}void I2C_Start(void){	/* 当SCL高电平时,SDA出现一个下跳沿表示I2C总线启动信号 */	SDA_H;	SCL_H来源:梨花落-
                                                        

声明:本站部分文章及图片转载于互联网,内容版权归原作者所有,如本站任何资料有侵权请您尽早请联系jinwei@zod.com.cn进行处理,非常感谢!

上一篇 2021年6月18日
下一篇 2021年6月18日

相关推荐