STM32(HAL库)之I2C篇
I2C总线引脚及接法:
SCL:串行时钟线(Serial Clock),负责传输时钟信号
SDA:串行数据线(Serial Data),负责传输数据
支持I2C通信协议的模块一般都具有SCL与SDA两引脚接线,且SCL与SDA接线上一般接有上拉电阻,且模块上SCL与SDA的GPIO输出模式为开漏输出,该接法的目的是实现逻辑线与。
逻辑线与的介绍:
在与运算中,一旦有任意一变量的值为0,则结果为0,当全体变量为1时结果才为0。
I2C通信中,采用开漏输出和上拉电阻时,当我们默认输出时呈现高阻态,此时SDA/SCL线被Vdd拉高,此时SCL/SDA均为高电平,该状态称为空闲状态。
当有任意一模块输出0时因为其余输出皆为高阻态,此时总线直接接地,则总线变为0,此时称之为拉低总线,此时开始I2C总线开始进行数据通信。
I2C本质通过逻辑线与的方法实现0/1的切换。
I2C通信协议
一、起始位:在SCL高电压时,向SDA发送下降沿
二、寻址:主机向总线发送从机的地址(7位地址常用,10位地址不常用)
起始位之后,通常主机发送8位数据(7位地址,1位用来规定数据传输方向),R = 0(写)/W = 1(读),主机发送8位数据后释放SDA线,此时从机拉低SDA线进行应答(Ack),若无应答(NAK),则说明寻址失败。
寻址失败主要有三点原因:地址错误,所寻地址不存在;所寻址的从机正忙,无法及时应答;从机故障(模块故障)
三、数据传输:I2C以字节位单位传输数据,每次可以传输多个字节
I2C每发送完成一个字节后需要对应接收方应答,此时发送方需要主动释放SDA线,将其拉高,然后等待接收方主动拉低SDA线应答后再发送下一个字节。(若主机是读从机所发的数据,则每次读完之后需要主动写无应答结束读数据的过程)
四、停止位:再SCL高电压时,向SDA发送上升沿
I2C传输速率模式:
例:用0.96寸的OLED进行实验,点亮整个屏幕(硬件I2C实现)
常用代码:
向从机写数据
HAL_StatusTypeDef HAL_I2C_Master_Transmit(I2C_HandleTypeDef *hi2c,uint16_t DevAddress,uint8_t *pData,uint16_t Size,uint32_t Timeout);
参数hi2c:填写i2c的句柄指针
参数DecAddress:填写从机地址
参数pData:填写要发送的数据
参数Size:填写要发送数据的数量,以字节为单位
参数Timeout:超时时间,单位为ms,与串口相同用法,如果向等待数据发送完成则填写HAL_MAX_DELAY
向从机读数据
HAL_StatusTypeDef HAL_I2C_Master_Receive(I2C_HandleTypeDef *hi2c,uint16_t DevAddress,uint8_t *pData,uint16_t Size,uint32_t Timeout);
与上文相同用法
作者:凌兴觑古