STM32-I2C软件模拟

news/2024/12/26 10:48:43/文章来源:https://www.cnblogs.com/Osen/p/18630637

1.I2C介绍
I2C是一种多主机、两线制、低速串行通信总线,广泛用于微控制器和各种外围设备之间的通信。它使用两条线路:串行数据线(SDA)和串行时钟线(SCL)进行双向传输。

2.时序

启动条件:SCL高电平时、SDA由高电平变为低电平
停止条件:SCL高电平时、SDA由低电平变为高电平
除此之外,不允许在SCL高电平时变换SDA电平。

数据传输
主机发送起始信号后,通信开始,每次传输一字节数据,传输完毕后应答(ACK)
主机拉低SCL电平,此时可改变SDA的电平
主机拉高SCL电平,此时开始读取SDA电平
如此重复8次,一字节数据传输完毕,数据接收方在下一个CLK低电平在SDA上进行应答,0代表数据接收成功,1数据接收失败或通信结束。

3.通信时序

如图,主机发送完起始信号后,再次拉低SCL,并改变SDA的电平为0或1,电平改变完成后,主机拉高(释放)SCL,代表此时从机可以读取SDA数据,之后主机再拉高SLC重复操作,如此重复8次,就发送了一个字节。
主机发送完字节最后一位数据后,拉高(释放)SCL等待从机读取完成,然后拉低SCL(代表主机准备好接受ACK)并且拉高(释放)SDA,将SDA的控制权交给从机,此时收到该数据的从机会对SDA进行操作,0(拉低SDA)代表存在从机收到该字节数据,可以继续发送数据,1(拉高,或者无从机操作SDA)代表从机数据接收完毕或根本没有从机,主机发送停止信号结束通信。

读取与写入数据
仔细研究以上通信时序,我们发现时序为
Start(起始信号)+8位数据+ACK(应答)+Stop(结束信号)
那么我们怎么知道主机跟从机通信是要读取数据还是写入数据呢?
实际使用中,我们会按照约定格式进行通信。

①读取数据

a.主机发送一个起始信号Start
这时通信总线上的设备准备接受数据
b.接着发送7位从设备ID+读写位(0写1读)
从机开始解析数据,发现该ID是自己ID那就发送ACK(0,代表有从机对SDA进行了操作)拉低SDA线,继续进行通信。
如果SDA保持1,即没有任何从机作出反应,那主机就发送Stop信号结束通信
c.发送要访问的从设备寄存器地址
主设备告诉从设备我要访问你该地址的数据,从设备收到地址后再次回应一个ACK(拉低SDA,告诉主设备我收到地址数据了)
d.根据之前发送发送的读写位进行数据交换
如果是7位地址+0,即写操作,则数据为主机发送给从机,从机接收到后回复一个ACK(0,即有从机拉低SDA),直到主机发送完成,产生一个Stop信号。
如果是7位地址+1,即读操作。则此时数据为从机发送给主机,主机接收完后向从机发送ACK位,当主机读取完成后就产生一个NACK(1),之后发送Stop信号结束通信。
e.产生一个结束信号Stop
主机在SCL高时拉高SDA(本质上为释放SCL与SDA两条线路,即不对该两条线路产生任何操作)

线与特性:
I2C的时钟线(SCL)与数据线(SDA)都使用开漏输出(OD)+上拉电阻的方式进行驱动,即线上连接的IO口全都只有拉低电平的能力,当线上连接的任意一个引脚输出低电平时,整条线路都会接地处于低电平状态。而IO口输出高电平时,引脚处于浮空状态,此时线上为高电平,但只要线上连接的任意一个IO口处于低电平,那整条线路都会处于低电平。

主机引脚电平 从机引脚电平 传输线电平
0 0 0
1 0 0
0 1 0
1 1 1

为何使用开漏输出上拉电阻?
既然都是简单的电平变换,那为什么I2C要使用开漏输出呢?直接使用推挽输出,不但省下一个上拉电阻,IO口还不会因上拉电阻影响到传输速率不是更好吗?这是我们就要仔细研究一下I2C时序了。
I2C因为被设计运用在多主机多从机的场景,所以不可避免地会遇到一个问题——总线冲突
若因某种原因时序混乱导致一个IO口输出高电平,一个输出低电平,那么就会出现短路现象,有烧坏设备的风险。

正点原子软件模拟I2C引脚使用推挽输出?
那么问题来了,正点原子例程中软件模拟I2C的GPIO配置代码如下:
GPIO_Initure.Pin=GPIO_PIN_4|GPIO_PIN_5; GPIO_Initure.Mode=GPIO_MODE_OUTPUT_PP; GPIO_Initure.Pull=GPIO_PULLUP; GPIO_Initure.Speed=GPIO_SPEED_FREQ_VERY_HIGH;
我们惊讶的发现,他们将引脚的输出方式设置为了推挽输出,这是为什么?
查阅了资料,理由如下:
1.该例程的使用场景为单主-单从,即整条线上只有一个主机、一个从机,SCL不存在争抢控制权的现象。
2.在主机交出SDA控制权时,SDA引脚被设置为了输入模式
u8 IIC_Read_Byte(unsigned char ack) { unsigned char i,receive=0; SDA_IN();//SDA输入模式 for(i=0;i<8;i++ ) { IIC_SCL(0); delay_us(2); IIC_SCL(1); receive<<=1; if(READ_SDA)receive++; delay_us(1); } if (!ack) IIC_NAck(); else IIC_Ack(); return receive; }
输入模式时,主机SDA引脚浮空,只对SDA上的电平进行读取,此时从机改变SDA上的电平是安全的。
综上,使用推挽输出只适用于单主从模式,并且该方式需要对SDA输入输出状态进行切换。

问题探究:
1.推挽模式读取引脚状态需要改变引脚输入输出状态,开漏难道不需要吗?
请看GPIO基本构造:

如图所示STM32引脚输出靠下方的两个MOS管进行强上拉、下拉。当使用推挽输出时会用到两个MOS管,无论输出高电平还是低电平会是引脚保持强上拉、下拉状态,因此引脚输出高电平就会读到高电平,引脚输出低电平就会读到低电平。
而使用开漏输出时只会用到下方连接GND的NMOS管,也就是说该模式只有强下拉,如果给引脚输出高电平,那么此时引脚实际处于浮空状态,受连接线上的电平影响,此时读取的电平即为连接线上的电平。

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

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

相关文章

系统攻防-WindowsLinux远程探针本地自检任意代码执行权限提升入口点

Windows&Linux&远程探针&本地自检&任意代码执行&权限提升&入口点知识点: 1、远程漏扫-Nessus&Nexpose&Goby 2、本地漏扫(提权)-Wesng&Tiquan&Suggester 3、利用场景-远程利用&本地利用&利用条件一、演示案例-操作系统-远程漏…

新能源汽车门店管理:项目管理工具的高效运用策略

使用项目管理工具进行新能源汽车门店管理可以显著提高门店的运营效率和团队协作能力。通过明确项目目标和需求、选择合适的项目管理工具、实施项目管理以及持续优化与改进等步骤,新能源汽车门店可以更好地应对市场变化,提升竞争力。使用项目管理工具进行新能源汽车门店管理,…

C5GAME 游戏饰品交易平台借助 RocketMQ Serverless 保障千万级玩家流畅体验

C5GAME 通过采用云消息队列 RocketMQ 版 Serverless 系列,有效解决了现有架构中存在的性能瓶颈,极大增强了交易系统的灵活性和稳定性,有效实现了流量的削峰填谷,显著提升了整体运维效率,确保了千万级玩家能够享受到流畅的游戏交易体验。作者:邹星宇、刘尧 C5GAME:安全便…

SQL语言1-MySQL

1. SQL语言 1.1 关系型数据库的常见组件数据库:database 表的集合,物理上表现为一个目录 表:table,行:row 列:column 索引:index 视图:view,虚拟的表 存储过程:procedure 存储函数:function 触发器:trigger 事件调度器:event scheduler,任务计划 用户:user 权限…

虚引用

当被应用的强引用失去后,强引用关联的这个引用也就是虚引用相关的分配就会被回收以ThreadLocal<T>为例1.进行塞值 public void set(T value) { Thread t = Thread.currentThread(); ThreadLocalMap map = getMap(t); if (map != null) { …

容器环境的MySQL、canal、Elasticsearch数据同步测试

回顾一次容器环境的MySQL、canal、Elasticsearch数据同步 MySQL和Elasticsearch安装初始化就不展示了,版本如下:sql表关键字段如下: CREATE TABLE `fault_code` (`title` varchar(255) CHARACTER SET utf8mb4 DEFAULT NULL,`description` varchar(512) CHARACTER SET utf8mb…

从全球到本地:跨境电商如何提升供应链管理效率

一、引言 随着全球化的推进与互联网技术的飞速发展,跨境电商已成为全球贸易的重要组成部分。跨境电商平台通过缩短国际贸易的链条,打破了传统贸易壁垒,使消费者能够方便快捷地购买来自世界各地的商品。然而,跨境电商的成功不仅仅依赖于商品的丰富性和价格竞争力,背后更为复…

违规停放智能监测摄像机

违规停放智能监测摄像机结合高清晰度摄像功能和智能识别算法,可以对违规停放行为进行准确识别和监测。这种设备可根据设定的监测区域和参数,自动识别车辆停放位置和停放时间,一旦发现有车辆违停停放,系统将立即发送警报通知相关部门及时处理。通过这种方式,可以及时发现、…

破解跨境电商的竞争难题:高效市场竞争管理的核心要素

一、引言 随着全球化进程的加速和互联网技术的快速发展,跨境电商成为了全球贸易的新兴力量。跨境电商平台通过打破国界和时间的限制,为消费者和商家提供了更便捷、更高效的购物和销售渠道。然而,随着这一市场的逐步成熟,平台之间的竞争愈加激烈,如何在这样的竞争中脱颖而出…

MIT、OpenAI等震撼力作:AI首次自主发现人工生命!人类窥见上帝造物

就在刚刚,由Transformer八子创立的Sakana AI,联合来自MIT、OpenAI、瑞士AI实验室IDSIA等机构的研究人员,提出了「自动搜索人工生命」的新算法!论文地址:https://arxiv.org/abs/2412.17799 言归正传,ALife,即「人工生命」,是一门跨学科研究,旨在通过模拟生命的行为、特…

AI基坑监测识别摄像机

AI基坑监测识别摄像机是一种利用人工智能技术进行基坑监测的智能设备,其作用是监测基坑工程施工过程中的变化,并识别潜在的风险因素,以提供准确数据和及时预警,确保基坑工程的安全进行。这种摄像机通过高清摄像头实时捕捉基坑工程的图像,然后利用AI算法对基坑的土体稳定性…