打印
[STM32F4]

STM32硬件I2C与软件模拟I2C超详解

[复制链接]
2258|53
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
一.I2C协议简介
I2C 通讯协议(Inter-Integrated Circuit)是由 Phiilps 公司开发的,由于它引脚少,硬件实现简单,可扩展性强,不需要 USART、CAN 等通讯协议的外部收发设备(那些电平转化芯片),现在被广泛地使用在系统内多个集成电路(IC)间的通讯。
I2C只有一跟数据总线 SDA(Serial Data Line),串行数据总线,只能一位一位的发送数据,属于串行通信,采用半双工通信
半双工通信:可以实现双向的通信,但不能在两个方向上同时进行,必须轮流交替进行,其实也可以理解成一种可以切换方向的单工通信,同一时刻必须只能一个方向传输,只需一根数据线.
对于I2C通讯协议把它分为物理层和协议层物理层规定通讯系统中具有机械、电子功能部分的特性(硬件部分),确保原始数据在物理媒体的传输。协议层主要规定通讯逻辑,统一收发双方的数据打包、解包标准(软件层面)。

使用特权

评论回复
评论
回复就哭哭 2022-10-18 23:43 回复TA
———————————————— 版权声明:本文为CSDN博主「rivencode」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。 原文链接:https://blog.csdn.net/k666499436/article/details/124686559 
沙发
回复就哭哭|  楼主 | 2022-10-18 23:44 | 只看该作者
二.I2C物理层
I2C 通讯设备之间的常用连接方式

(1) 它是一个支持设备的总线。“总线”指多个设备共用的信号线。在一个 I2C 通讯总线中,可连接多个 I2C 通讯设备,支持多个通讯主机及多个通讯从机。
(2) 一个 I2C 总线只使用两条总线线路,一条双向串行数据线SDA(Serial Data Line ),一条串行时钟线SCL(Serial Data Line )。数据线即用来表示数据,时钟线用于数据收发同步
(3) 总线通过上拉电阻接到电源。当 I2C 设备空闲时会输出高阻态,而当所有设备都空闲,都输出高阻态时,由上拉电阻把总线拉成高电平。

使用特权

评论回复
板凳
回复就哭哭|  楼主 | 2022-10-18 23:48 | 只看该作者
什么是普通的开漏输出详情请参考–》GPIO端口的八种工作模式


开漏输出PMOS不工作
1.当输出寄存器输出高电平,引脚输出高阻态相当于(开路),假设该引脚接到I2C的SDA总线上,则总线被默认拉成高电平。
2.当输出寄存器输出低电平,引脚输出低电平。

使用特权

评论回复
地板
回复就哭哭|  楼主 | 2022-10-18 23:55 | 只看该作者


复用功能开漏输出

使用特权

评论回复
5
回复就哭哭|  楼主 | 2022-10-18 23:57 | 只看该作者
复用功能开漏输出
复用功能模式中,输出使能,输出速度可配置,可工作在开漏模式, 但是输出信号源于其它外设(来自I2C外设),输出数据寄存器 GPIOx_ODR 无效;输入可用,可以通过输入数据寄存器可获取 I/O 实际状态,但一般直接用外设的寄存器来获取该数据信号
这里SMT32,I2C外设的两个引脚SDA,SCL就要配置成复用功能的开漏输出模式,输出信号源于I2C外设。

使用特权

评论回复
6
回复就哭哭|  楼主 | 2022-10-18 23:58 | 只看该作者
为什么引脚要设置成开漏模式
以及为什么两根总线要上拉电阻接高电平,总线默认情况是高电平,详情看下图。

为什么要设备空闲的时候SDA与SCL引脚要输出高阻态(相当于断开与SDA与SCL总线的连接),根本目的就是为了不干扰其他正在通信的设备。

使用特权

评论回复
7
回复就哭哭|  楼主 | 2022-10-18 23:58 | 只看该作者
(4) 多个主机同时使用总线时,为了防止数据冲突,会利用仲裁方式决定由哪个设备占用总线,也就是设备在发送数据之前会检测I2C总线是否忙碌(忙碌总线应该为低电平)。
(5)I2C 具有三种传输模式:标准模式传输速率为 100kbit/s ,快速模式为 400kbit/s ,高速模式下可达 3.4Mbit/s,但目前大多 I2C 设备尚不支持高速模式。
每个连接到总线的设备都有一个独立的地址,主机可以利用这个地址进行不同设备之间的访问的,地址也是一个数据,主机可以同过SDA发送这个地址出去,则挂载在总线上的设备会自行匹配,匹配成功之后就可以互相通信了

使用特权

评论回复
8
回复就哭哭|  楼主 | 2022-10-18 23:59 | 只看该作者
三.I2C协议层

STM32即可以作为主机,也可以做为从机,我主要介绍STM32作为主机如何进行读写数据。
I2C规定通信时的时钟,起始信号,停止信号只能由主机产生

下面以STM32做为主机,EEPROM存储器作为从机举例

使用特权

评论回复
9
sfd123| | 2022-10-19 12:43 | 只看该作者
未完待续!楼主,就等你了!

使用特权

评论回复
10
mmbs| | 2022-10-24 20:02 | 只看该作者
I2C口是带有上拉电阻的,你如何设置为GPIO呢

使用特权

评论回复
11
pixhw| | 2022-10-24 20:16 | 只看该作者
STM32F302RC 硬件I2C DMa有坑吗  

使用特权

评论回复
12
lihuami| | 2022-10-24 20:37 | 只看该作者
有没有什么相关测试软件?   

使用特权

评论回复
13
hilahope| | 2022-10-24 21:03 | 只看该作者
为什么正点原子的i2c程序都是模拟的呢  

使用特权

评论回复
14
adolphcocker| | 2022-10-24 21:42 | 只看该作者
stm32F407的硬件I2C稳定吗  

使用特权

评论回复
15
cashrwood| | 2022-10-24 22:27 | 只看该作者
如何区分STM32的一个程序是I2C程序是固件I2C还是模拟I2C

使用特权

评论回复
16
zerorobert| | 2022-10-25 18:38 | 只看该作者
有硬件IIC,为什么很多应用,还要模拟IIC

使用特权

评论回复
17
jtracy3| | 2022-10-25 19:33 | 只看该作者
在什么场合下需要模拟I2C通信              

使用特权

评论回复
18
alvpeg| | 2022-10-25 20:25 | 只看该作者
如何选择I2C总线缓冲器               

使用特权

评论回复
19
pixhw| | 2022-10-25 21:18 | 只看该作者
硬件I2C的话需要看时钟来源的  

使用特权

评论回复
20
hilahope| | 2022-10-25 22:08 | 只看该作者
怎样测模拟I2C总线速率?               

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

24

主题

358

帖子

0

粉丝