STM32 IIC协议基础概念

这篇具有很好参考价值的文章主要介绍了STM32 IIC协议基础概念。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。


前言

本篇文章将带大家学习IIC通信协议的一些基础概念和使用。

一、IIC协议介绍

I2C(Inter-Integrated Circuit),通常也称为IIC(Inter-IC),是一种串行通信协议,用于在集成电路之间进行数据传输。它是由飞利浦半导体(现在的恩智浦半导体)开发的,并且在各种芯片和模块中被广泛采用。I2C协议的设计旨在简化芯片之间的通信,使得多个芯片可以通过共享同一条总线来交换信息。

以下是I2C协议的基本特点和工作原理:

总线架构:

I2C使用两条线进行通信:串行数据线(SDA)和串行时钟线(SCL)。
SDA用于传输数据,而SCL则用于同步时钟信号,指示何时可以读取或写入数据。

主从结构:

在I2C通信中,设备分为主设备(Master)和从设备(Slave)。
主设备负责发起通信并控制总线的访问,而从设备则响应主设备的请求。

STM32 IIC协议基础概念,STM32框架式编程,stm32,嵌入式硬件,单片机

起始和停止条件:

通信开始时,主设备发送起始条件(Start),即将SDA从高电平切换到低电平时,同时保持SCL为高电平。
通信结束时,主设备发送停止条件(Stop),即将SDA从低电平切换到高电平时,同时保持SCL为高电平。
在通信过程中,每个数据传输都以起始和停止条件作为边界。

地址传输:

在每次通信开始时,主设备首先发送目标设备的地址。
地址包括7位或10位,取决于I2C设备的寻址模式。
对于每个从设备,必须分配一个唯一的地址,以便主设备可以识别和访问它。

数据传输:

在发送完目标设备的地址后,主设备可以选择读取数据或向设备写入数据。
数据传输是以字节为单位进行的,每个字节的传输都会收到从设备的应答信号(Acknowledge)。

时钟同步:

时钟同步是通过SCL线实现的,主设备控制时钟信号的频率和节奏。
从设备在SCL线上接收时钟信号,并在适当的时候进行数据传输。

多主机操作:

I2C允许多个主设备共享同一条总线,但是在同一时间只能有一个主设备在操作。
多主机操作需要对总线进行仲裁(Arbitration),以确保每个主设备的请求得到正确的响应。

总的来说,I2C是一种简单而灵活的串行通信协议,适用于连接多个设备,如传感器、存储器、显示器等,以实现各种应用,如嵌入式系统、物联网设备等。

二、IIC硬件框图和程序层次

(以下图片来自百问网)

我们先来看一个IIC的硬件框图操作OLED屏幕。
STM32 IIC协议基础概念,STM32框架式编程,stm32,嵌入式硬件,单片机
STM32的内部有IIC控制器,STM32通过IIC控制器和SSD1306 OLED屏幕驱动来给屏幕发送数据,当屏幕接收到数据时就可以将数据显示出来。

STM32 IIC协议基础概念,STM32框架式编程,stm32,嵌入式硬件,单片机
程序结构由四部分组成:

1.应用程序

2.库函数也就是我们封装好的OLED显示屏操作函数

3.OLED驱动程序(根据SSD1306数据手册编写)

4.I2C控制器驱动(STM32 HAL库中IIC的操作函数)

三、IIC协议

1.IIC协议通信流程

这里的话就不多讲解这个IIC的通信流程,大家可以看下面的这篇文章。
IIC协议通信流程

2.IIC的引脚为什么需要加入上拉电阻

我们在IIC的框图中就可以知道IIC的引脚是需要接入一个上拉电阻的。

STM32 IIC协议基础概念,STM32框架式编程,stm32,嵌入式硬件,单片机

  1. 开漏(Open-Drain)/开集(Open-Collector)输出
    I2C总线上的设备通常使用开漏(对于MOS技术)或开集(对于双极性技术)输出来驱动SDA和SCL线。这意味着设备可以将总线拉低(连接到地),但不能直接将总线拉高。要将线拉高,需要通过外部电阻(上拉电阻)来完成,这些电阻连接到高电平电源(通常是VCC)。

  2. 逻辑电平的创建
    通过使用上拉电阻,当总线上没有任何设备试图将线拉低时,总线自然会被拉到高电平状态。这样就可以创建稳定的逻辑高电平和低电平,确保I2C通信的可靠性。

  3. 多主设备支持
    I2C允许多个主设备存在于同一个总线上。上拉电阻确保了在任何给定时间,只要没有设备主动将总线拉低,总线就会保持在高电平状态。这样的设计允许任何设备可以在任何时间检测并开始通信,而不会干扰到总线上其他的设备。

  4. 防止总线冲突
    在I2C通信中,如果两个设备同时尝试通信,可能会导致总线冲突(比如,一个设备试图发送高电平,而另一个设备同时发送低电平)。上拉电阻确保在这种情况下,总线能够安全地默认到高电平状态,同时提供一种机制(通过检测总线电平)来识别和解决冲突。

  5. 确定上拉电阻的值
    上拉电阻的值不是随意选择的,它需要根据总线的电容、所需的通信速率以及总线上连接的设备数量来计算。电阻值太低会导致功耗增加和电源负载过大,而电阻值太高则可能无法在高速通信时有效地将总线拉到高电平状态,影响信号的质量和可靠性。

上拉电阻在I2C通信中扮演着至关重要的角色,它们确保了总线的稳定和设备间的可靠通信。

3.IIC的引脚为什么需要配置为开漏输出

允许多主设备: I2C支持多个主设备同时连接到同一总线上。通过将引脚配置为开漏输出,任何设备都可以将线拉低(Ground),但不能直接将线拉高(VCC)。这样,当多个主设备同时尝试发送数据时,如果有一个设备将线拉低,其他设备就能感知到总线被占用,从而避免冲突。

下面列出一个真值表来说明上面的功能,假设有两个设备A和B:

1.当A和B都输出1时,因为是开漏输出截止,所以这个时候SDA接到上拉电阻表现为高电平。

2.当A输出为0时,B输出为1,SDA输出的电平是0,因为此时开漏输出可以输出低电平,SDA此时被拉低。

3.这一种情况和第二种情况类似

4.当A和B都输出为0的时候SDA也输出为0

那么这样的话一旦有一个主设备想要输出低电平占用SDA线,那么SDA线就会表现为低电平,此时就可以避免冲突。
STM32 IIC协议基础概念,STM32框架式编程,stm32,嵌入式硬件,单片机

另一个重要原因是防止器件烧毁。在推挽输出模式下,引脚可以输出逻辑高电平和逻辑低电平,这样如果两个设备同时尝试将总线拉到不同的电平(一个设备拉高,另一个设备拉低),可能会导致电流直接从一个设备流向另一个设备,形成短路,从而损坏其中一个设备。

通过将引脚配置为开漏输出,设备只能拉低总线,而不能直接拉高总线。上拉电阻将总线拉高,当没有设备拉低时,总线保持在逻辑高电平。这种设计防止了推挽输出模式下的短路和过大电流的流动,从而降低了器件损坏的风险。因此,配置为开漏输出是一种更安全的设计选择,能够有效保护设备免受损坏。

STM32 IIC协议基础概念,STM32框架式编程,stm32,嵌入式硬件,单片机

四、STM32 IIC硬件结构

在写入数据时将数据写入IIC控制器的数据寄存器,写入数据后数据移位寄存器会将数据发送到SDA数据线。

当读取数据的时候,数据从SDA从传输进来,放入移位寄存器中,移位寄存器将数据放入数据寄存器中并且读取出来。
STM32 IIC协议基础概念,STM32框架式编程,stm32,嵌入式硬件,单片机

通过配置I2C_CR2寄存器可以配置IIC的时钟源:
STM32 IIC协议基础概念,STM32框架式编程,stm32,嵌入式硬件,单片机
通过配置I2C_CCR寄存器可以来配置I2C高低电平的时间:
STM32 IIC协议基础概念,STM32框架式编程,stm32,嵌入式硬件,单片机
(I2C_TRISE) 寄存器的作用是控制I2C总线上拉电阻的上升时间。这个时间是在I2C总线由逻辑低电平转变为逻辑高电平时的上升时间。上升时间的设定对于I2C通信的稳定性和性能至关重要。
STM32 IIC协议基础概念,STM32框架式编程,stm32,嵌入式硬件,单片机
配置I2C_CR1中的STOP和START位可以产生起始信号和停止信号。
STM32 IIC协议基础概念,STM32框架式编程,stm32,嵌入式硬件,单片机

总结

本篇文章主要讲解了IIC协议的基础概念,下篇文章将带大家来学习文章来源地址https://www.toymoban.com/news/detail-841110.html

到了这里,关于STM32 IIC协议基础概念的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • STM32使用IIC协议驱动0.96寸OLED屏

    IIC是常用的协议之一,它通过不同的地址来区分设备,并且端口需要是开漏模式,并且需要接上拉电阻  要使用IIC驱动OLED,首先要配置IIC 然后编写写入函数 ErrorStatus I2C_CheckEvent(I2C_TypeDef* I2Cx, uint32_t I2C_EVENT) 为判断事件的函数 有以下多种事件 OLED初始化 上图分别为 (起始位

    2024年02月03日
    浏览(32)
  • 嵌入式 STM32 通讯协议--MODBUS

    目录 一、自定义通信协议 1、协议介绍 2、网络协议 3、自定义的通信协议  二、MODBUS通信协议 1、概述 2、MODBUS帧结构  协议描述 3、MODBUS数据模型   4、MODBUS事务处理的定义 5、MODBUS功能码  6、功能码定义   7、MODBUS数据链路层 8、MODBUS地址规则  9、MODBUS帧描述 10、MODBUS两种

    2024年02月11日
    浏览(52)
  • STM32 第19讲 IIC(协议简介/读取驱动AT24C02/实验)

    IIC: Inter Integrated Circuit,集成电路总线,是一种 同步 串行 半双工通信协议 ①总线由数据线 SDA 和时钟线 SCL 构成的串行总线,数据线用来传输数据,时钟线用来同步数据收发。 ②总线上每一个器件都有一个唯一的地址识别,所以我们只需要知道器件的地址,根据时序就可以

    2024年02月03日
    浏览(32)
  • 嵌入式C语言基础(STM32)

    前言:一条混迹嵌入式3年的老咸鱼,想到自己第一次接触到stm32的库函数时,c语言稀碎,痛不欲生的场景,该文章为萌新指条明路。 位操作在嵌入式中常用于直接对芯片的寄存器进行操作,当时作为初学者的我看着一脸懵逼,至于为什么这样修改,下面好好分析一下。  一

    2024年02月02日
    浏览(49)
  • 嵌入式编程实践——怎么用STM32实现LLC电路控制(附代码示例)?

    STM32是意法半导体(STMicroelectronics)推出的一系列32位ARM Cortex-M微控制器产品线。它们广泛应用于嵌入式系统中,包括工业控制、汽车电子、智能家居、医疗设备等领域。STM32系列微控制器具有高性能、低功耗、丰富的外设接口和强大的开发生态系统等特点。LLC电路控制是一项

    2024年04月16日
    浏览(105)
  • 蓝桥杯嵌入式 STM32G4 MCP4017可编程电阻

    MCP4017为可编程电阻 查阅产品手册可知,MCP4017使用I2C通讯协议,引脚为PB6,PB7 ,控制的电阻连接至PB14,同时跳线帽连接J15.1与J15.2 如下图,Rs为单个电阻阻值;RWS为总阻值,与R17串联,两者对VDD电压进行分压, 可以通过测量PB14的电压判断可编程电阻的阻值。 MCP4017的默认总阻

    2023年04月08日
    浏览(47)
  • 嵌入式学习笔记——STM32硬件基础知识

    上一篇中我们重点是讲了一下怎么搭建开发环境以及怎么下载烧录的过程,这都是解决的电脑端的开发环境问题,还没有到实际的开发板上,我们的单片机是都是焊接在开发板上的,PCB上有着它所需的工作电路。并不是直接给供电电压就可以让其工作的,本文主要是简介一下

    2024年01月22日
    浏览(56)
  • 嵌入式学习stm32基础知识(期末复习)

    1. 计算机的体系架构 冯诺依曼架构 ​ 在完整的计算机系统中,包含五个部分,储存器,运算器,控制器输入设备和输出设备。 改进的冯诺依曼架构 改进型架构的各模块的高速数据交换中心利用储存器这个大容量,极大的提高了效率。 哈佛架构 ​ 哈佛结构数据空间和地址

    2024年02月07日
    浏览(55)
  • 【嵌入式学习笔记】嵌入式基础9——STM32启动过程

    程序段交叉引用关系(Section Cross References):描述各文件之间函数调用关系 删除映像未使用的程序段(Removing Unused input sections from the image):描述工程中未用到被删除的冗余程序段(函数/数据) 映像符号表(Image Symbol Table):描述各符号(程序段/数据)在存储器中的地址、类

    2024年02月15日
    浏览(75)
  • 嵌入式-stm32重要基础知识(及踩过的坑)

    1、固件库: 固件库就是函数的集合,固件库函数的作用是向下负责与寄存器直接打交道, 向上提供用户函数调用的接口(API)。 2、CMSIS标准与固件库的关系 就是对固件库函数的要求。 ARM 公司为了能让不同的芯片公司生产的 Cortex-M3 芯片能在软件上基本兼容,和芯片生产商

    2024年02月04日
    浏览(45)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包