开启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的第34天,点击查看活动详情
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.利用串口发送到电脑