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);

与上文相同用法  

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值