STM32_IIC通信

IIC通信

I2C(Inter IC Bus)是由Philips公司开发的一种通用数据总线
两根通信线SCL(串行时钟线)、SDA(串行数据线)
同步,半双工
带数据应答
支持总线挂载多设备(一主多从、多主多从)
一主多从:单片机作为主机,主导I2C总线的运行,挂载在I2C总线的所有外部模块都是从机,从机只有被主机点名之后才能控制I2C总线,不能在未经允许的情况下去碰I2C总线,防止冲突。
多主多从:在总线上的任何一个模块都可以是主机。

硬件电路

所有I2C设备的SCL连在一起,SDA连在一起
设备的SCL和SDA均要配置成开漏输出模式
SCL和SDA各添加一个上拉电阻,阻值一般为4.7KΩ左右
左边的CPU就是单片机,作为总线的主机。总线的权利很大,包括对SCL线的完全控制,任何时候,都是主机完全掌握SCL线。另外在空闲状态下,主机可以主动发起对SDA的控制,只有在从机发送数据和从机应答的时候,主机才会转交SDA的控制给从机。
从机:挂载在I2C总线上的从机,这些从机可以是姿态传感器、OLED\存储器、时钟模块等。从机的权利比较小,对于SCL时钟线,在任何时候都只能被动的读取,从机不允许控制SCL线。对于SDA数据线,从机不允许主动发起对SDA的控制,只有在主机发送读取从机的命令后,或者从机应答的时候,从机才能短暂地获取到SDA的控制权
所有I2C设备的SCL连在一起,SDA连在一起。
先忽略这两个电阻,假设我们就按照上图连接。那如何规定每个设备SCL和SDA的输入输出模式呢?SCL应该好规定,因为现在是一主多从,主机拥有SCL的绝对控制权,所以主机的模式可以配置成推挽输出,所有从机的SCL都配置成浮空输入或者上拉输入。数据流向是,主机发送,所有从机接收。但是到SDA线这里,就比较麻烦了,因为这是半双工的协议,所以主机的SDA在发送的时候是输出,在接收的时候是输入。同样,从机的SDA也会在输入和输出之间反复切换,如果能协调好输入输出的切换时机,那也没问题。但如果总线时序没有协调好,极有可能发生两个引脚同时处于输出的状态,又正好是一个输出高电平,一个输出低电平,那这个状态就是电源短路。所以为了 避免总线没有协调好导致电源短路这个问题,I2C的设计,禁止所有的设备输出强上拉的高电平,采 用外置弱上拉电阻加开漏输出的电路结构, 所以设备的SCL和SDA均要配置成开漏输出模式。
所有的设备,CPU和被控IC,他引脚的内部结构都是上图所示:
左边的一部分是SCL,右边是SDA的结构。
首先引脚的信号进来,都可以通过一个数据缓冲器或者施密特触发器,进行输入,因为输入对电路没有任何影响,所以任何设备在任何时候都是可以输入的,但是在输出的部分,采用的是开漏输出的配置。
推挽输出:上面一个开关管接到正极,下面一个开关管接到负极。
上面导通,输出高电平
下面导通,输出低电平
开漏输出:去掉强上拉的开关管,输出低电平时,下管导通,是强下拉;输出高电平时,下管断开,但是没有上管了,此时引脚处于浮空的状态,这就是开漏输出。
输出低电平,这个开关管导通,引脚直接接地,是强下拉;输出高电平,引脚管断开,处于浮空状态,这样所有的设备都只能输出低电平而不能输出高电平。但这样的话,为了避免高电平造成的引脚浮空,这时就需要在总线外面SCL和SDA各外置一个上拉电阻。

I2C时序基本单元

起始条件:SCL高电平期间,SDA从高电平切换到低电平
终止条件:SCL高电平期间,SDA从低电平切换到高电平

起始条件:

在I2C 总线处于空闲状态时:SCL和SDA都处于高电平状态,是由SCL和SDA由外挂的上拉电阻拉高至高电平,总线处于平静的高电平状态。
主机需要进行数据收发时,当从机捕获到SCL高电平,SDA下降沿信号时,就会进行自身的复位,等待主机的召唤。然后在SDA下降沿之后,主机要再把SCL拽下来,拽下SCL:1、占用总线,2、方便拼接。

终止条件

SCL先放手,回到高电平;SDA再放手,回到高电平,产生一个上升沿。上升沿触发终止条件,同时终止条件之后,SCL和SDA都是高电平。

发送一个字节

SCL低电平期间,主机将数据位依次放到SDA线上 (高位先行),然后释放SCL,从机将在SCL高电平期间读取数据位, 所以SCL高电平期间SDA不允许有数据变化,依次循环上述过程8次,
即可发送一个字节.。
主机如果想发送0,就拉底SDA到低电平;如果想发送1,就放手,SDA回到高电平,在SCL低电平期间,允许改变SDA的电平。当这一位的数据放好之后,主机就松手时钟线,SCL回到高电平。在高电平期间,是从机读取SDA的时候,所以高电平期间,SDA不允许变化。SCL处于高电平之后,从机需要尽快地读取SDA,一般在上升沿这个时刻,从机就已经读取完成了。主机在放手SCL一段时间后,就可以继续拉低SCL,然后传输下一位。

接收一个字节

SCL低电平期间,从机将数据位依次放到SDA线上 (高位先行),然后释放SCL,主机将在SCL高电平期间读取数据位,所以SCL高电平期间SDA不允许有数据变化,依次循环上述过程8次,
即可接收一个字节(主机在接收之前,需要释放SDA)
SCL低电平期间,从机将数据位依次到SDA线上(高位先行),然后释放SCL,主机在SCL高电平期间读取数据位,所以SCL高电平期间SDA不允许有数据变化。

发送应答和接收应答

发送应答:主机在接收完一个字节之后,在下一个时钟发送一位数据,数据0表示应答,数据1表示非应答
接收应答:主机在发送完一个字节之后,在下一个时钟接收一位数据,判断从机是否应答,数据0表示应答,数据1表示非应答(主机在接收之前,需要释放SDA)

I2C时序

指定地址写
对于指定设备(Slave Address),在指定地址(Reg Address)下,写入指定数据(Data)

空闲状态:SCL和SDA都是高电平。

主机给从机写入数据的时候:1、SCL高电平期间,拉低SDA,产生起始条件,紧跟着的时序,必须是发送一个字节的时序,字节的内容,必须是从机地址+读写位。从机地址是7位,读写位是1位。加起来刚好一个字节。发送从机地址,就是确定通信的对象。发送读写位,就是确认我接下来是要写入还是要读出。

I2C的硬件实现

I2C外设简介

• STM32 内部集成了硬件 I2C 收发电路,可以由硬件自动执行时钟生成、起始终止条件生成、应答位收发、数据收发等功能,减轻 CPU 的负担
• 支持多主机模型
• 支持 7 位 /10 位地址模式
• 支持不同的通讯速度,标准速度 ( 高达 100 kHz) ,快速 ( 高达 400 kHz)
• 支持 DMA
• 兼容 SMBus 协议
• STM32F103C8T6 硬件 I2C 资源: I2C1 、 I2C2
(硬件I2C的资源是有限的,这也是硬件和软件的区别)

I2C框图

I2C基本结构

发送:移位寄存器中的数据由高位到低位先移出去,移8次就可以移一个字节,有高位到低位依次放到SDA线上。

接收:数据从GPIO口从右边依次移进来,最终移8次,一个字节就接收完成了。

主机发送

主机接收

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/706454.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

基于SpringBoot设计模式之创建型设计模式·生成器模式

文章目录 介绍开始架构图样例一定义生成器定义具体生成器(HTML格式、markdown格式)实体类HTML格式生成器MarkDown格式生成器 测试样例 总结优点缺点 介绍 将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。   如…

停车场车位引导系统是什么,停车场车位引导系统有哪些作用?

随着城市交通的快速发展,车辆的数量也在迅速增长,随之而来的就是停车难的问题,那么在城市中,如何合理的利用好现有资源,让停车资源得到合理利用呢?这就需要一套科学有效的智能停车场系统,可以帮…

2024 年第四届长三角高校数学建模竞赛B题

赛道 B:人工智能范式的物理化学家 物理和化学研究的对象日益复杂化、高维化,传统的研究范式主要是依赖于“穷举”、“试错”、“重复”等手段。面对庞大的化学空间,配方和工艺等各种参数的搜索常常止步于局部最优,无法进行配方和工…

圆上点云随机生成(人工制作模拟数据)

1、背景介绍 实际上,很多地物外表形状满足一定的几何形状结构,如圆形是作为常见一类。那么获取该类目标的点云数据便是位于一个圆上的点云数据。如下图所示为两簇典型的点云,其中一种为理想型,点均位于一个圆上,另外一簇则是近似位于一个圆上,这种更加符合真实情况。有时…

语法分析-文法

如果对于一部文法中,存在至少一个句子有两个或者两个以上的语法树则该文法是二义性的。 我们可以以上面的例子进行解释,对于第棵个语法树,我们可以看到是先进行了加法运算再进行的乘法运算,因为需要先把EE作为整体运算完后再成为E…

18.04版本的ubuntu没有连接网络的图标(坑人版)

以下更新内核别看,因为后面安装驱动报一堆错误!!! 不升级内核成功方法跳转连接:https://blog.csdn.net/weixin_53765004/article/details/138771613?csdn_share_tail%7B%22type%22%3A%22blog%22%2C%22rType%22%3A%22article%22%2C%22rId%22%3A%2213877…

详解jmeter命令行参数的使用方法

相信大多数同学都通过命令行的方式使用过jmeter,因为在压测机是linux时,一般都是通过命令行的方式运行jmeter来进行压测的,本文会对这些命令行参数进行详解讲解。 如果大家还不了解如何在linux中运行jmeter,可以参考文章&#x…

哪些充电宝比较耐用?小米可以用什么充电宝、十大公认耐用充电宝

在现代社会的快节奏生活中,智能手机已经变得不可或缺。它不仅是我们的通讯工具,还是我们获取信息、娱乐休闲的重要设备。然而,当我们在外出、旅行或日常生活中频繁使用手机时,手机的续航问题常常让我们感到焦虑。为了解决这个问题…

C++ static_cast学习

static_cast可实现, 1 基本类型之间的转换 2 void指针转换为任意基本类型的指针 3 用于有继承关系的子类与父类之间的指针或引用的转换 用于基本类型转化时,会损失精度类似于C语言的强制转化; 下面先看一下void指针的转换; …

CTF网络安全大赛web题目:just_sqli

这道题目是bugku的web题目 题目的 描  述: KosenCTF{} 原文链接&#xff1a; CTF网络安全大赛web题目&#xff1a;just_sqli - 红客网-网络安全与渗透技术 题目Web源代码&#xff1a; <?php$user NULL; $is_admin 0;if (isset($_GET["source"])) {highlig…

位图和布隆过滤器:位图

在《unordered_map 和 unordered_set》 中提到过&#xff1a; 哈希是一种思想&#xff0c;通过哈希函数将数据转化为一个或多个整型 —— 映射关系&#xff1b;通过这种映射关系&#xff0c;可以做到以 O(1) 的时间复杂度查找数据。 本文即将介绍的 位图 和 布隆过滤器 就是两个…

24长三角数学建模ABC题已出!!!

需要ABC题资料的宝子们可以进企鹅 赛题如下&#xff1a; 赛道 A&#xff1a;“抢救”落水手机 上有天堂&#xff0c;下在苏杭&#xff1b;五一假期&#xff0c;杭州西湖、西溪湿地、京杭大运河等著名 景点&#xff0c;游人如织&#xff0c;作为享誉国内外的旅游胜地&#xff0…