基本信息
文件名称:STMicroelectronics 系列:STM32F1 系列_(12).STM32F1系列的I2C通信.docx
文件大小:27.07 KB
总页数:24 页
更新时间:2025-06-18
总字数:约1.41万字
文档摘要

PAGE1

PAGE1

STM32F1系列的I2C通信

I2C通信概述

I2C(Inter-IntegratedCircuit)是一种串行通信协议,用于在微控制器和外设之间进行简单的双向通信。I2C总线由两根信号线组成:SCL(串行时钟线)和SDA(串行数据线)。这种通信方式支持多主多从设备,且具有较高的灵活性和较低的硬件复杂度。在STM32F1系列单片机中,I2C接口被广泛应用于传感器、EEPROM、ADC等外设的通信。

I2C总线的工作原理

I2C总线通过SCL和SDA两根线进行数据传输。SCL线用于时钟同步,SDA线用于数据交换。I2C通信是半双工的,即在同一时间内只能进行单向通信。数据传输的基本单位是字节,每个字节包含8位数据,且在传输过程中需要加入起始条件、停止条件、地址位和应答位。

起始条件:当SCL线保持高电平时,SDA线从高电平变为低电平。

停止条件:当SCL线保持高电平时,SDA线从低电平变为高电平。

地址位:每个从设备都有一个7位或10位的地址,主设备通过发送地址来选择与哪个从设备进行通信。

应答位:从设备在接收到地址或数据后发送一个低电平的应答位,表示接收到的数据正确。

I2C总线的时序

I2C总线的时序非常关键,它决定了数据的正确传输。以下是一些基本的时序要求:

起始条件:SCL为高电平时,SDA从高变低。

停止条件:SCL为高电平时,SDA从低变高。

数据位有效:在SCL为高电平期间,SDA上的数据必须保持稳定。

上升沿和下降沿:SCL和SDA的上升沿和下降沿必须满足特定的时间要求,以确保数据的正确传输。

I2C总线的地址和应答

I2C总线上的每个从设备都有一个唯一的地址。主设备通过发送从设备的地址来选择与哪个设备进行通信。地址位由7位或10位组成,具体取决于设备的类型。在每个字节传输后,接收方需要发送一个应答位,表示数据已正确接收。应答位的发送方式如下:

应答位:接收方在接收到一个字节后,将SDA线拉低,表示应答。

非应答位:接收方在接收到一个字节后,不拉低SDA线,表示非应答。

STM32F1系列的I2C硬件配置

STM32F1系列单片机内置了I2C接口,支持标准模式和快速模式的通信。标准模式的通信速率为100kbps,快速模式的通信速率为400kbps。在硬件配置方面,需要关注以下几个主要参数:

I2C时钟分频:通过配置I2C时钟分频器来设置通信速率。

GPIO配置:将SCL和SDA引脚配置为I2C功能。

中断配置:配置I2C中断,以便在通信过程中处理事件。

I2C时钟分频配置

I2C时钟分频器的配置决定了通信速率。通过设置I2C_CCR寄存器中的分频值,可以调整I2C的通信速率。以下是一个配置I2C时钟分频的示例代码:

#includestm32f1xx_hal.h

voidI2C_Config(void){

I2C_HandleTypeDefhi2c1;

//初始化I2C

hi2c1.Instance=I2C1;

hi2c1.Init.ClockSpeed=100000;//100kbps

hi2c1.Init.DutyCycle=I2C_DUTYCYCLE_2;//50%占空比

hi2c1.Init.OwnAddress1=0x00;//主设备不需要设置地址

hi2c1.Init.AddressingMode=I2C_ADDRESSINGMODE_7BIT;//7位地址模式

hi2c1.Init.DualAddressMode=I2C_DUALADDRESS_DISABLE;//禁用双地址模式

hi2c1.Init.OwnAddress2=0x00;//无效

hi2c1.Init.GeneralCallMode=I2C_GENERALCALL_DISABLE;//禁用通用呼叫模式

hi2c1.Init.NoStretchMode=I2C_NOSTRETCH_DISABLE;//禁用时钟拉伸

if(HAL_I2C_Init(hi2c1)!=HAL_OK){

//初始化失败处理

Error_Handler();

}

//配置时钟分频

if(HAL_I2CEx_ConfigAnalogFilter(hi2c1,I2C_ANALOGFILTER_ENABLE)!=HAL_OK){

Error_Handler();

}

if(HAL_I