通信《STM32 CubeMX教程:IIC通信入门实践》

STM32cubemx教程及STM32入门(五)IIC 2022.8.25

前言

本章主要讲解IIC协议以及stm32cubemx配置和HAL库函数

简介

I2C(Inter-Integrated Circuit ,内部集成电路)总线是一种由飞利浦Philip公司开发的串行总线。是两条串行的总线,它由一根数据线(SDA)和一根 时钟线(SDL)组成。I2C总线上可以接多个I2C设备,每个器件都有一个唯一的地址识别。同一时间只能有一个主设备,其他为从设备。通常MCU作为主设备控制,外设作为从设备。

IIC硬件电路

I2C总线为漏极开路结构(OD),因此它们必须接有上拉电阻,阻值常为 4k7 或 10k ;当总线空闲时,两根线均为高电平。OD门与其它任意数量的OD与OC门成"线与"关系,即当总线上的任一器件输出的低电平,都将使总线的信号变低。

I2C协议

I2C有三种状态信号:开始信号、结束信号和应答信号

开始信号:SCL为高电平时,SDA由高电平转变为低电平跳变,表示开始通信。
结束信号:SCL为高电平时,SDA由低电平转变为高电平跳变,结束结束通信。
应答信号:接收数据的IC在接收到一个字节数据后,向发送数据的IC发出特定的低电平脉冲,表示已收到数据
在数据传输过程中,SCL时钟为主设备控制,SCL为高的时候读取数据SDA的数据,SCL为低的时候,主设备改变SDA的数据准备传输下一位。数据从高位开始传输,当传输8位后,主设备会释放SDA总线。如果从设备正确接收到数据,则从设备会拉低SDA总线,则产生一个应答信号。如果从设备出错,不拉低SDA总线,由于上拉电阻的作用,SDA的电平会变为高电平,即为非应答信号。数据传输总是以开始信号开始传输,以结束信号终止传输,中间可以传输多个字节的数据。

使用STM32Cubemx配置IIC程序的步骤

将外部高速时钟(HSE)配置为Crystal/Ceramic Resonator(晶体/陶瓷谐振器)

配置时钟树
选择IIC

下图就是详细的设置
Master Features 主机模式特性
I2C Speed Mode: IIC模式设置 standard mode标准模式和fast mode快速模式。实际上也就是速率的选择。
I2C Clock Speed:I2C传输速率,默认为100KHz

Slave  features  从机模式特性

Clock No Stretch Mode: 时钟没有扩展模式
Primary Address Length selection: 从设备地址长度 设置从设备的地址是7bit还是10bit 大部分为7bit
Dual Address Acknowledged: 双地址确认
Primary slave address:  从设备初始地址


然后即可生成文件

IIC常用函数

以下是IIC头文件中的所有库函数,包括
初始化函数,回调函数

IIC轮询操作函数IIC中断操作函数

IICDMA操作函数

这么多函数,我们要重点掌握轮询操作函数,即以下函数:

HAL_I2C_Master_Transmit(I2C_HandleTypeDef *hi2c, uint16_t DevAddress, uint8_t *pData, uint16_t Size, uint32_t Timeout);IIC写函数

功能:IIC写数据
参数:

*hi2c 设置使用的是那个IIC 例:&hi2c2
DevAddress 写入的地址 设置写入数据的地址 例 0xA0
*pData 需要写入的数据
Size 要发送的字节数
Timeout 最大传输时间,超过传输时间将自动退出传输函数

HAL_I2C_Master_Receive(I2C_HandleTypeDef *hi2c, uint16_t DevAddress, uint8_t *pData, uint16_t Size, uint32_t Timeout);IIC读函数

功能:IIC读一个字节
参数:

*hi2c: 设置使用的是那个IIC 例:&hi2c2

DevAddress: 写入的地址 设置写入数据的地址 例 0xA0

*pDat:a 存储读取到的数据

Size: 发送的字节数

Timeout: 最大读取时间,超过时间将自动退出读取函数

举例:

HAL_I2C_Master_Transmit(&hi2c1,0xA1,(uint8_t*)TxData,2,1000) ;;发送两个字节数据,IIC写数据函数

HAL_I2C_Mem_Write(I2C_HandleTypeDef *hi2c, uint16_t DevAddress, uint16_t MemAddress, uint16_t MemAddSize, uint8_t *pData, uint16_t Size, uint32_t Timeout);

功能: IIC写多个数据 该函数适用于IIC外设里面还有子地址寄存器的设备,比方说E2PROM,除了设备地址,每个存储字节都有其对应的地址

参数:

*hi2c: I2C设备号指针,设置使用的是那个IIC 例:&hi2c2

DevAddress: 从设备地址 从设备的IIC地址 例E2PROM的设备地址 0xA0

MemAddress: 从机寄存器地址 ,每写入一个字节数据,地址就会自动+1

MemAddSize: 从机寄存器地址字节长度 8位或16位
    写入数据的字节类型 8位还是16位
    I2C_MEMADD_SIZE_8BIT
    I2C_MEMADD_SIZE_16BIT

在stm32f1xx_hal_i2c.h中有定义
在这里插入图片描述

*pData: 需要写入的的数据的起始地址

Size: 传输数据的大小 多少个字节

Timeout: 最大读取时间,超过时间将自动退出函数

使用HAL_I2C_Mem_Write等于先使用HAL_I2C_Master_Transmit传输第一个寄存器地址,再用HAL_I2C_Master_Transmit传输写入第一个寄存器的数据。可以传输多个数据

在传输过程,寄存器地址和源数据地址是会自加的。

至于读函数也是如此,因此用HAL_I2C_Mem_Write和HAL_I2C_Mem_Read,来写读指定设备的指定寄存器数据是十分方便的,让设计过程省了好多步骤。

举例:

8位:

HAL_I2C_Mem_Write(&hi2c2, ADDR, i, I2C_MEMADD_SIZE_8BIT,&(I2C_Buffer_Write[i]),8, 1000);

HAL_I2C_Mem_Read(&hi2c2, ADDR, i, I2C_MEMADD_SIZE_8BIT,&(I2C_Buffer_Write[i]),8, 1000);

16位:

HAL_I2C_Mem_Write(&hi2c2, ADDR, i, I2C_MEMADD_SIZE_16BIT,&(I2C_Buffer_Write[i]),8, 1000);

HAL_I2C_Mem_Read(&hi2c2, ADDR, i, I2C_MEMADD_SIZE_16BIT,&(I2C_Buffer_Write[i]),8, 1000);
如果只往某个外设中写数据,则用Master_Transmit。 如果是外设里面还有子地址,例如我们的E2PROM,有设备地址,还有每个数据的寄存器存储地址。则用Mem_Write。
Mem_Write是2个地址,Master_Transmit只有从机地址

物联沃分享整理
物联沃-IOTWORD物联网 » 通信《STM32 CubeMX教程:IIC通信入门实践》

发表评论