15 玩转STM32之IIC通信(芯片硬件篇)
在14玩转STM32之IIC通信(软件模拟篇)我们讲了软件模拟的方式,本章讲解芯片自带的硬件部分(并非所有的芯片都含有IIC,像51系列的是没有的,但是绝大多数是有的,根据我用过的S32、STM32、HC32、CH32、GD32都是有的,目前我只见过51的没有、STM8也有这个可能分系列吧,我用的有,其他的不清楚)
15.1.1STM32IIC通信主要特性STM32F429微控制器继承了3个IIC(内部集成的)软件模拟和硬件模拟的功能是一样的。
具备多主模式功能,同一接口可以用作主从模式。
7位/10位寻址以及广播呼叫的生成和检测。
支持不同的通信速度:
—标准速度(高达100kHz)
—快速速度(高达400kHz)
状态标志:
—发送/接收模式标志
—字节传输结束标志
—I2C忙碌标志
错误标志:
—主模式下的仲裁丢失情况
—地址/数据传输完成后的应答失败
—检测误放的起始位和停止位
—禁止时钟延长后出现的上溢/下溢
带DMA功能的1字节缓冲(减轻MCU工作)
兼容和PMBus。
具体的功能作用可参看数据手册(648页中文版)
总结:
STM32的I2C外设可用作通讯的主机及从机,支持100Kbit/s和400Kbit/s的速率,支持7位、10位设备地址,支持DMA数据传输,并具有数据校验功能。
IIC通过SCL和SDA两个引脚完成与其他器件进行通信,如下图IIC内部结构图:

IIC引脚对照表:
IIC有四种工作模式:从发送器、从接收器、主发送器、主接收器模式四种。
默认情况下,IIC在从模式下工作。接口在生成起始位后会自动由从模式切换为主模式,并在出现重在丢失或生成停止位的时候,从模式切换为从模式,进而实现多主模式功能。
在主模式下,I2C接口会启动数据传输(发送起始信号和器件地址,地址始终在主模式下发送),并生成时钟信号(SCL),将需要发送的数据写入数据寄存器,并通过数据移位寄存器和数据控制逻辑(输出),将数据一位位发送到SDA数据线。通信的时钟由主机的时钟控制逻理生成,可以在标准速度或快速速度模式下工作。通信的工作模式由控制寄存器(CR1和CR2)的不同配置控制,状态寄存器体现通信过程中产生的一系列状态,根据不同的工作模式和通信状态,控制逻辑负责实现完整的通信过程。串行数据传输始终在出现起始位时开始,在出现停止位时结束。起始位和停止位均在主模式下由软件生成。
12C控制器自动检测从机发送回来的ACK信号,并置位状态寄存器相应的状态位,程序通过检测状态寄存器(SR1和SR2)的状态位,判断数据是否发送成功。
I2C控制器产生开始信号(S),然后通过检测EV5事件,判断是否启动成功。
在满足EV5事件后,主机发送器件地址+W,然后通过检测EV6事件、判断是否发送器件地址成功。
在满足EV6事件后,主机发送数据,然后通过检测EV8事件,判断是否发送数据成功。在发送完最后一个数据后,主机发送结束信号(P)结束通信过程。
如图:主发送器模式下IIC通信示意图:
EV5:总线正在进行通信(BUSY=1),主/从模式(MSL=1)及起始位是否己经发送(SB=1)。
EV6:处于发送器或接收器状态(TRA=1),正在进行通信(BUSY=1),主/从模式(MSL=1).
数据寄存器是否为空(TXE=1),地址是否已发送(ADDR=1,主模式)。
EV8:处于发送器或接收器状态(TRA=1),正在进行通信(BUSY=1),主/从模式(MSL=1).
数据寄存器是否为空(TXE=l),字节是否传输完成(BTF=1,主模式)。
I2C控制器产生开始信号,然后通过检测EV5事件,判断是否启动成功。
在满足EV5事件后,主机发送器件地址,然后通过检测EV6事件,判断是否发送器件地址成功。
在满足EV6事件后,主机准备接收从机发送过来的数据,然后通过检测EV7事件,判断是否接收数据成功。如果接收的不是最后一个数据的话,则主机发送ACK信号给从机。
如果接收的是最后一个数据的话,则主机发送一个NACK信号,并发送结束信号,结束通信。
EV7:正在进行通信(BUSY=1),主/从模式(MSL=1),数据寄存器非空(RXNE=1)。
主接收器模式下I2C通信示意图如图:
在从模式下,根据写入自身地址寄存器的地址(从模式下的器件地址),l2C控制器通过比较器能够识主机发送过来的地址是否和其自身地址(7位或10位)一致。在地址匹配的情况下,根据读写控制状态,通过数据控制逻辑可以接收(写)或发送(读)数据。
1-从发送器模式在检测到开始信号后,I2C控制器通过检测EV1事件,判断主机发送过来的器件地址是否和本机地址一致。
在满足EV1事件后,从机发送一个ACK信号给主机,将数据发送给主机,并通过检测EV3事件,判断是否发送数据成功。在发送完最后一个数据后,从机检测到NACK信号和结束信号,结束通信。
EV1:正在进行通信(BUSY=1),接收到的地址匹配(ADDR=1,从模式)。
EV3:处于发送器或接收器状态(TRA=1),正在进行通信(BUSY=l),数据寄存器是否为
空(TXE=1)。
从发送器模式下I2C通信示意图如图:
I2C控制器有2个中断向量:一个中新由成功的地址/数期字管传输事件发另一个中新由银误状态触发。
I2C控制器支持多种中断事件的请求,便于实时响应一些紧急事务,为了提高CPU利用率。选常在I2C控制器处于从模式时,使用中新方式来响应一系列事务的处理。例如,从模式下数西的接收、发送、停止及错误等,I2C控制器中斯事件如图所示:
以IIC1为例这里,其他的与这是一样的.
(1)使能IIC1时钟和通信线复用引脚端口GPIOB的时钟。使能IIC通信时钟RCC_APB1PeriphClockCmd(RCC_APB1Periph_I2C1,ENABLE);//I2C2时钟使能GPIO时钟使能RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOB,ENABLE);//GPIO时钟使能(2)初始化引脚
/*GPIO引脚复用*/GPIO_PinAFConfig(GPIOB,GPIO_PinSource6,GPIO_AF_I2C1);//将PB6复用给I2C1GPIO_PinAFConfig(GPIOB,GPIO_PinSource7,GPIO_AF_I2C1);//将PB7复用给I2C1/*初始化GPIO*/GPIO__Pin=GPIO_Pin_6;GPIO__Mode=GPIO_Mode_AF;//复用模式GPIO__Speed=GPIO_Speed_50MHz;GPIO__OType=GPIO_OType_OD;//开漏输出模式GPIO__PuPd=GPIO_PuPd_UP;//使能上拉GPIO_Init(GPIOB,GPIO_InitStructure);//初始化PB6:SCLGPIO__Pin=GPIO_Pin_7;GPIO_Init(GPIOB,GPIO_InitStructure);//初始化PB7:SDA(3)初始化IIC工作模式
/*I2C配置*/I2C__Mode=I2C_Mode_I2C;//I2C模式*/I2C__DutyCycle=I2C_DutyCycle_2;//SCL时钟线的占空比I2C__OwnAddress1=I2C_OWN_ADDRESS7;//从机时,自身器件地址I2C__Ack=I2C_Ack_Enable;//使能ACK相应//7bit的寻址模式I2C__AcknowledgedAddress=I2C_AcknowledgedAddress_7bit;I2C__ClockSpeed=400000;//通信速率=400KI2C_Init(I2C1,I2C_InitStructure);//I2C2初始化(4)使能IIC1控制器
I2C_Cmd(I2C1,ENABLE);//使能I2C2(5)使能IICACK应答
I2C_AcknowledgeConfig(I2C1,ENABLE);//使能IICACK功能(6)中断使能
如果需要使用中断,则需要配置NVIC和使能IIC中断。
15.3.2想用库函数与I2C相关的函数和宏都被定义在以下两个文件中。
头文件:stm32f4xx_
源文件:。
void12C_Init(12C_TypeDef*I2Cx,I2C_InitTypeDef*12C_InitStruct);
参数1:I2C_TypeDef*I2Cx,I2C应用对象,一个结构体指针,表示形式是I2C1、I2C2和I2C3,以宏定义形式定义在stm32f4xx_.h文件中。例如:
defineI2C2((12C_TypeDef*)12C2_BASE)defineI2C_Mode_12C((uintl6_t)0x0000)//I2C模式defineI2C_Mode_SMBusHost((uint16_t)0x000A)//SMBus主机模式成员3:12CDutyCycle,定义时钟信号低电平/高电平的占空比,有如下定义:defineI2C_DutyCycle_2((uintl6_t)0xBFFF)//时钟信号低电平/高电平=2成员4:I2C_OwnAddress1,定义从机通信时的自身器件地址。成员5:I2C_Ack,定义ACK应答使能,有如下定义。definel2CAckDisable((uintl6_t1)0x0000)//禁止使能ACK应答使能成员6:I2C_AcknowledgedAddress,定义I2C寻址模式,有如下定义。defineI2C_AcknowledgedAddress_10bit((uint16_1)0xC000)//10位地址寻址模式2-IIC使能函数
void12C_Cmd(I2C_TypeDef*12Cx,FunctionalStateNewState);参数2:FunctionalStateNewState,使能或禁止12CACK应答功能。ENABLE:使能I2CACK应答功能。DISABLE:禁止I2CACK应答功能。例如,使能I2C1ACK应答功能:I2C_Cmd(12C1,ENABLE);参数1:I2C应用对象,同I2C初始化函数参数1。4-I2C检测通信事件函数
ErrorStatusI2C_CheckEvent(12C_TypeDef*12Cx,uint32_tI2CEVENT);参数1:I2C应用对象,同12C初始化参数1。参数2:uint32tI2CEVENT,定义通信事件,有EVI~EV9事件,它D分国定不同的I2C通信状态。例如,EV8为主机接收到字节数据事件。include"bsp_i2c_"ifndef__I2C_EE_Hinclude""/*AT24C01/02每页有8个字节*///defineI2C_PageSize16/*STM32I2C快速模式*/defineI2C_OWN_ADDRESS70X0A/*I2C接口*/defineEEPROM_I2C_CLKRCC_APB1Periph_I2C2defineEEPROM_I2C_SCL_PINGPIO_Pin_4defineEEPROM_I2C_SCL_GPIO_CLKRCC_AHB1Periph_GPIOHdefineEEPROM_I2C_SCL_AFGPIO_AF_I2C2defineEEPROM_I2C_SDA_GPIO_PORTGPIOHdefineEEPROM_I2C_SDA_SOURCEGPIO_PinSource5defineI2CT_FLAG_TIMEOUT((uint32_t)0x1000)defineEEPROM_Block0_ADDRESS0xA0/*块0AT24C02AT24C04AT24C08AT24C16*/defineEEPROM_Block2_ADDRESS0xA4/*块2AT24C08AT24C16*/defineEEPROM_Block4_ADDRESS0xA8/*块4AT24C16*/defineEEPROM_Block6_ADDRESS0xAC/*块6AT24C16*/if/*__I2C_EE_H*/
推荐阅读
-
手机的电量多少最合适?100%?不对
手机电量维持在百分之多少合适?整夜充电可取吗?是否需要每次用到关机“彻底放电”再充电?今天小编给大家科普一点手机知识看看手机充电到底有什么讲究↓↓↓手机充电的正确姿势一有机会就充,即便你只有几分钟时间,效果也是不错的,这些零星时间并不会损害你的手机电池。没有所谓的“彻底放电”。“彻底放电”对锂电池没...
-
耶伦、布林肯相继访华,是美国的战术调整,不是战略转向
美国是不是觉得:“台湾岛”明显不止8500亿美元。耶伦访华了,这是耶伦第二次访华。上一次耶伦在中国待了四天三夜,而这一次,干脆要在中国六天;她第一站先前往广州,然后还要到北京。耶伦是美国的财政部长,在美国内阁中,这是非常重要的职位,仅次于国务卿的官员。对于访问目的,美国官员只是笼统表示:1、耶伦将会...
-
花莲地震后 台湾电子产业受损情况如何?
中新网综合台湾媒体报道,台湾花莲3日发生强震后,灾情打乱了全台半导体业、面板生产,多个晶圆厂、面板厂受地震影响出现停机等情况。台湾晶圆厂主要分布在新竹、台中等地,均受到地震影响,余震多达上百起。台积电等晶圆生产线均出现破片与停机等状况,牵动辉达(NVIDIA)AI晶片制造,三星等存储器厂为此暂停报价...
-
宝能汽车集团与易步科技集团签约仪式
7月1日,易步科技集团与宝能汽车集团旗下悠宝利品牌强强联合,在福建省厦门市举行战略签约仪式。这是悠宝利品牌继上周签约浙江九紫新能源之后,再一次达成的大型战略合作。厦门市海沧区工信局局长朱勇、厦门市新能源汽车行业协会创始秘书长曾国城、厦门市海沧区商贸企业协会会长黄帆、易步科技集团董事长黄国华、易步科技...