[STM32F4] STM32硬件I2C与软件模拟I2C超详解

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

评论

———————————————— 版权声明:本文为CSDN博主「rivencode」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。 原文链接:https://blog.csdn.net/k666499436/article/details/124686559  发表于 2022-10-18 23:43
 楼主| 回复就哭哭 发表于 2022-10-18 23:44 | 显示全部楼层
二.I2C物理层
I2C 通讯设备之间的常用连接方式
84906634ec9bf66e9d.png
(1) 它是一个支持设备的总线。“总线”指多个设备共用的信号线。在一个 I2C 通讯总线中,可连接多个 I2C 通讯设备,支持多个通讯主机及多个通讯从机。
(2) 一个 I2C 总线只使用两条总线线路,一条双向串行数据线SDA(Serial Data Line ),一条串行时钟线SCL(Serial Data Line )。数据线即用来表示数据,时钟线用于数据收发同步
(3) 总线通过上拉电阻接到电源。当 I2C 设备空闲时会输出高阻态,而当所有设备都空闲,都输出高阻态时,由上拉电阻把总线拉成高电平。
 楼主| 回复就哭哭 发表于 2022-10-18 23:48 | 显示全部楼层
什么是普通的开漏输出详情请参考–》GPIO端口的八种工作模式
6078634ecaafd0ee6.png

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

 楼主| 回复就哭哭 发表于 2022-10-18 23:55 | 显示全部楼层
92853634ecc51adc6b.png
36140634ecc5ed5d73.png
复用功能开漏输出
 楼主| 回复就哭哭 发表于 2022-10-18 23:57 | 显示全部楼层
复用功能开漏输出
复用功能模式中,输出使能,输出速度可配置,可工作在开漏模式, 但是输出信号源于其它外设(来自I2C外设),输出数据寄存器 GPIOx_ODR 无效;输入可用,可以通过输入数据寄存器可获取 I/O 实际状态,但一般直接用外设的寄存器来获取该数据信号
这里SMT32,I2C外设的两个引脚SDA,SCL就要配置成复用功能的开漏输出模式,输出信号源于I2C外设。
 楼主| 回复就哭哭 发表于 2022-10-18 23:58 | 显示全部楼层
为什么引脚要设置成开漏模式
以及为什么两根总线要上拉电阻接高电平,总线默认情况是高电平,详情看下图。
39918634ecd1de1c6b.png
为什么要设备空闲的时候SDA与SCL引脚要输出高阻态(相当于断开与SDA与SCL总线的连接),根本目的就是为了不干扰其他正在通信的设备。
 楼主| 回复就哭哭 发表于 2022-10-18 23:58 | 显示全部楼层
(4) 多个主机同时使用总线时,为了防止数据冲突,会利用仲裁方式决定由哪个设备占用总线,也就是设备在发送数据之前会检测I2C总线是否忙碌(忙碌总线应该为低电平)。
(5)I2C 具有三种传输模式:标准模式传输速率为 100kbit/s ,快速模式为 400kbit/s ,高速模式下可达 3.4Mbit/s,但目前大多 I2C 设备尚不支持高速模式。
每个连接到总线的设备都有一个独立的地址,主机可以利用这个地址进行不同设备之间的访问的,地址也是一个数据,主机可以同过SDA发送这个地址出去,则挂载在总线上的设备会自行匹配,匹配成功之后就可以互相通信了
 楼主| 回复就哭哭 发表于 2022-10-18 23:59 | 显示全部楼层
三.I2C协议层

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

下面以STM32做为主机,EEPROM存储器作为从机举例
sfd123 发表于 2022-10-19 12:43 | 显示全部楼层
未完待续!楼主,就等你了!
mmbs 发表于 2022-10-24 20:02 | 显示全部楼层
I2C口是带有上拉电阻的,你如何设置为GPIO呢
pixhw 发表于 2022-10-24 20:16 | 显示全部楼层
STM32F302RC 硬件I2C DMa有坑吗  
lihuami 发表于 2022-10-24 20:37 | 显示全部楼层
有没有什么相关测试软件?   
hilahope 发表于 2022-10-24 21:03 | 显示全部楼层
为什么正点原子的i2c程序都是模拟的呢  
adolphcocker 发表于 2022-10-24 21:42 | 显示全部楼层
stm32F407的硬件I2C稳定吗  
cashrwood 发表于 2022-10-24 22:27 | 显示全部楼层
如何区分STM32的一个程序是I2C程序是固件I2C还是模拟I2C
zerorobert 发表于 2022-10-25 18:38 | 显示全部楼层
有硬件IIC,为什么很多应用,还要模拟IIC
jtracy3 发表于 2022-10-25 19:33 | 显示全部楼层
在什么场合下需要模拟I2C通信              
alvpeg 发表于 2022-10-25 20:25 | 显示全部楼层
如何选择I2C总线缓冲器               
pixhw 发表于 2022-10-25 21:18 | 显示全部楼层
硬件I2C的话需要看时钟来源的  
hilahope 发表于 2022-10-25 22:08 | 显示全部楼层
怎样测模拟I2C总线速率?               
您需要登录后才可以回帖 登录 | 注册

本版积分规则

29

主题

436

帖子

0

粉丝
快速回复 在线客服 返回列表 返回顶部