IIC协议

182 阅读3分钟

开启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的第34天,点击查看活动详情

1、简介

串行、半双工、近距离、多机通信

  1. 通信流程 主机发送起始信号,启用总线 主机发送一字节数据(从机地址+写或读)(7+1) 从机发送应答信号回应主机 发送器发送数据(先发高位) 接收器发送应答回应 通信完成后,主机发送停止信号释放总线

2、硬件

SCL:时钟线 SDA:数据线 从机多了要接上拉电阻 空闲输出高阻态,用高阻态表示高电平

3、协议

3.1、读取数据方式

时钟线高电平的时候,下降沿起始信号,上升沿停止信号 在时钟线高电平的时候,读取数据;低电平SDA切换数据

应答信号 SDA释放,等待低电平应答

3.2、设备地址

7位地址+最后一个读写位(构成8位地址) 1读地址 0写地址

3.3、写

起始信号>发写地址>等待响应>发数据等响应>停止信号 在这里插入图片描述

3.4、读

起始信号>发读地址>等待响应>接收数据>发送响应信号>停止信号 在这里插入图片描述

3.5、写读

起始信号>发写设备地址>发要读的地址>起始信号>发读设备地址> 接收数据

四、EEPROM_IIC

4.1、IIC初始化

1.使能时钟 GPIOB:RCC_APB2PeriphClockCmd(); I2C1:RCC_APB1PeriphClockCmd(); 2.初始化gpio SCL:GB6,复用开漏 SDA:GB7,复用开漏 GPIO_Init(); 3.初始化I2C外设 时钟频率:400KHz(400000) 模式:I2C模式 占空比:I2C_DutyCycle_2 自身地址:0x5f(7位地址) 应答:使能 应答位数:7位 I2C_Init(); 4.使能I2C外设 I2C1:I2C_Cmd(); 在这里插入图片描述

在这里插入图片描述

4.2、收发数据函数

4.2.1发一个字节

1.发送一个起始信号,并检测EV5事件 在这里插入图片描述 2.发送8位写地址,并检测EV6事件(EV8可检测可不检测) 在这里插入图片描述 3.发送存储单元地址,并检测EV8事件 在这里插入图片描述 4.发送数据,并检测EV8_2事件 在这里插入图片描述 5.发送停止信号 在这里插入图片描述

4.2.2发多个字节(最大一次发8个)

void EEPROM_page_write(uint8_t addr,uint8_t *data,uint8_t num) 1.前3步一样 发起始信号,发地址,发存储地址 2.发送多个数据 发送数据后,检测EV8事件,然后个数减数据地址加 个数减到0跳出循环 3.发停止信号 在这里插入图片描述

4.2.3读多个字节

void EEPROM_read(uint8_t addr,uint8_t *data,uint8_t num) 1.前3步一样 发起始信号,发写地址,发存储地址 2.在次发送起始信号,检测EV5事件 3.发送8位读地址,并检测EV6事件 参数2选择接收方向,检测读的 在这里插入图片描述 4.读取多个数据 判断是否读最后一个数据:是关闭应答,否往下执行 接收数据后,先检测EV7事件,然后读取数据到数组地址 个数减,地址加 个数减到0跳出循环 5.发停止信号并且开应答 在这里插入图片描述

4.3、等待EEPROM存储数据结束

1.发起始信号 2.检测起始位标志位SB,也就是EV5事件 3.发地址 4.检测地址发送标志位(主模式)“ADSL”,ADDR,也就是EV6事件 5.未检测到ADDR继续发送起始信号 6.检测到ADDR发送停止信号 在这里插入图片描述

4.4、发送数据到EEPROM,然后读出数据利用串口1发送到电脑

1.定义2个数组 1个输入8个数据(因为EEPROM一次性只能接收8个数据) 1个数据初始化为0 2.初始化外设 初始化串口和IIC 3.发数组到EEPROM 4.等待EEPROM接收完成 5.读EEPROM 只能8位的读(地址是8的倍数),不然会出错(EEPROM) 比如地址是8,16,24,32 6.利用串口发送到电脑 在这里插入图片描述