4.STM32之通信接口《精讲》之IIC通信---软件实现IIC《深入浅出》面试必备!

接下正式,进入软件编写IIC时序了,并实现对MPU6050的控制,既然是软件实现,那么硬件方面,我仅需两根控制线即可,即:数据控制线SDA,时钟控制线SCL。(人为软件层面定义的,就是把单片机的GPIO模拟成IIC时序)在单片机上,我们只需两个普通的GPIO即可。

(软件实现IIC的好处就是端口不受限,可以任意指定)

STM32之软件IIC通信(自学)

可以参考51单片机-IIC实验1-AT24C02数据存储(实战1)_51使用iic模块-CSDN博客icon-default.png?t=O83Ahttps://blog.csdn.net/qq_58662017/article/details/142199565?spm=1001.2014.3001.5501

座右铭:我们何必为人生的部分片段而哭泣,我们整个人生都催人泪下!

目前实现的逻辑是STM32是主机,MPU6050是从机,一主一从。如下图(主机对SCL完全掌控在写程序的过程中我们一般只关注主机端的程序。

程序主框架,编写IIC时序,然后利用IIC对MPU6050进行写寄存器和读寄存器。最后,在主函数里调用一下即可!(主函数主要实现初始化,拿到数据,和打印数据)

开漏输出(Open-Drain 或 Open-Collector)是单片机或其他数字电路中常用的一种输出方式,它可以通过合理的电路设计实现输入功能。以下是详细说明:


问题1:开漏输出,可以输入吗?

开漏输出的工作原理

  • 开漏输出特点

    1. 当输出为低电平(逻辑0)时,开漏输出内部的 MOSFET 或晶体管导通,输出直接拉低至地(GND)。
    2. 当输出为高电平(逻辑1)时,内部 MOSFET 或晶体管断开,输出处于高阻态(悬空状态),需要通过外部上拉电阻将输出电平拉高。
  • 电路结构: 开漏输出电路没有直接的 "高电平" 驱动能力,必须依赖外部上拉电阻将输出端拉到高电平电压(如 3.3V 或 5V)。


开漏输出是否可以作为输入?

可以实现输入功能,但需要特定的电路设计。

1. 直接作为输入
  • 如果开漏输出端口本身的电路允许双向通信(如 I2C 总线),它可以接收来自其他设备的信号。
  • 在这种情况下:
    • 当开漏输出为高阻态时,端口可以感知外部输入信号(如其他设备的驱动信号或电压变化)。
    • 当开漏输出为低电平时,它会主动拉低信号线。
2. 需要外部电路支持
  • 如果开漏端口不直接支持输入,可以通过额外的硬件设计(如与其他电路连接)实现输入功能。典型方法包括:
    • 外部上拉电阻与驱动器相结合,输入信号可以通过上拉电阻的电压水平反映到开漏输出端。
    • 使用外部电路,如电平转换器或双向驱动芯片,将开漏端与输入信号连接。
3. I2C 典型例子
  • I2C 总线是一种开漏输出的经典应用。I2C 中的 SDA(数据线)和 SCL(时钟线)通过外部上拉电阻实现双向数据通信:
    • 在设备 "发送" 数据时,单片机通过开漏端口主动拉低 SDA 线。
    • 在设备 "接收" 数据时,单片机的开漏端口进入高阻态,从而允许外部设备驱动 SDA 线。

注意事项

  1. 上拉电阻的选择

    • 电阻值太大:信号线的上升时间变长,影响高速通信。
    • 电阻值太小:消耗过多电流,降低电路能效。
    • 一般情况下,推荐使用 4.7kΩ ~ 10kΩ 的电阻。
  2. 输入电压范围

    • 确保外部输入信号的电压范围在单片机的输入电平(如 0V ~ VCC)之内,以避免损坏器件。
  3. 避免冲突

    • 如果多个设备连接到开漏输出引脚,必须确保这些设备不会同时主动拉低信号线(避免驱动冲突)。

总结

开漏输出引脚可以实现输入功能,特别是在需要双向通信的场景(如 I2C 总线)。关键在于设计合理的外部电路,包括适当的上拉电阻,并确保输入信号的电压范围和驱动能力与开漏端口兼容。

代码实现:

软件初始化IIC:(也就是IIC的基本6个操作基本单元)

起始条件,终止条件,读一个字节,写一个字节,接收应答位,不接受应答位。

通过下面6张图,可以看出,分离设计,也就是在SCL期间:SDA如果改变电平,则就会产生开始或停止的信号(即:SCL=1 ,SDA从高到底就是开始信号,SDA从低到高就是停止信号),反之,就会使传输数据的过程,即:就是在SCL=0期间,变换电平来传输数据。

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

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

相关文章

使用mingw+CMake在Windows平台编译OpenCV

1. 安装mingw和cmake cmake的安装比较简单,百度一下完成相关操作即可,笔者安装的是3.24.3版本。 Mingw的安装也有很多相关文章,不过我使用的是安装QT时附带安装的mingw,其路径为D:\software\Qt\Tools\mingw1120_64。其中的bin文件…

2024APMCM亚太杯数学建模C题【宠物行业】原创论文分享

大家好呀,从发布赛题一直到现在,总算完成了2024 年APMCM亚太地区大学生数学建模竞赛C题的成品论文。 给大家看一下目录吧: 目录 摘 要: 10 一、问题重述 14 二.问题分析 15 2.1问题一 15 2.2问题二 15 2.3问题三…

win10中使用ffmpeg和MediaMTX 推流rtsp视频

在win10上测试下ffmpeg推流rtsp视频,需要同时用到流媒体服务器MediaMTX 。ffmpeg推流到流媒体服务器MediaMTX ,其他客户端从流媒体服务器拉流。 步骤如下: 1 下载MediaMTX github: Release v1.9.3 bluenviron/mediamtx GitHub​​​​​…

海康面阵、线阵、读码器及3D相机接线说明

为帮助用户快速了解和配置海康系列设备的接线方式,本文将针对海康面阵相机、线阵相机、读码器和3D相机的主要接口及接线方法进行全面整理和说明。 一、海康面阵相机接线说明 海康面阵相机使用6-pin P7接口,其功能设计包括电源输入、光耦隔离信号输入输出…

vue3(十七)-基础入门之vue-nuxt路由

一、路由 Nuxt.js 依据 pages 目录结构自动生成 vue-router 模块的路由配置。 要在页面之间使用路由&#xff0c;建议使用 < nuxt-link> 标签。 <template><nuxt-link to"/">首页</nuxt-link> </template>1、基础路由 pages 的目录结…

C++设计模式-中介者模式

动机(Motivation) 多个对象相互关联的情况&#xff0c;对象之间常常会维持一种复杂的引用关系&#xff0c;如果遇到一些需求的更改&#xff0c;这种直接的引用关系将面临不断的变化。在这种情况下&#xff0c;可以使用一种”中介对象“来管理对象间的关联关系&#xff0c;避免…

IntelliJ+SpringBoot项目实战(十四)--在SpringBoot中整合SpringSecurity和JWT(上)

SpringSecurity是大名鼎鼎的认证授权框架&#xff0c;在SSH时代就已经大放异彩。在JAVA项目中&#xff0c;权限框架的解决方案主要是以SpringSecurity和Shiro为主。JWT是目前主流的基于access-token的的认证框架&#xff0c;在项目中一般时SpringSecurity和JWT结合使用&#xf…

【AI系统】Tensor Core 架构演进

自 Volta 架构时代起&#xff0c;英伟达的 GPU 架构已经明显地转向深度学习领域的优化和创新。2017 年&#xff0c;Volta 架构横空出世&#xff0c;其中引入的张量核心&#xff08;Tensor Core&#xff09;设计可谓划时代之作&#xff0c;这一设计专门针对深度学习计算进行了优…

问题记录-Java后端

问题记录 目录 问题记录1.多数据源使用事务注意事项&#xff1f;2.mybatis执行MySQL的存储过程&#xff1f;3.springBoot加载不到nacos配置中心的配置问题4.服务器产生大量close_wait情况 1.多数据源使用事务注意事项&#xff1f; 问题&#xff1a;在springBoot项目中多表处理数…

java:aqs实现自定义锁

aqs采用模板方式设计模式&#xff0c;需要重写方法 package com.company.aqs;import java.util.concurrent.TimeUnit; import java.util.concurrent.locks.AbstractQueuedSynchronizer; import java.util.concurrent.locks.Condition; import java.util.concurrent.locks.Lock;…

day11_JS初识_语法

day11_JS初识_语法 今日学习目标 : 入门HarmonyOS生态中 , ArkTS最基础的语法 JavaScript , 今天最主要的学习内容了解和掌握JavaScript的基础语法 , 并灵活的再后面开发过程进行使用 今日学习目标 什么是JavaScript JavaScript组成 JavaScript执行环境 JavaScript代码的书…

[C++]:IO流

1. IO 流 1.1 流的概念 在C中&#xff0c;存在一种被称为“流”的概念&#xff0c;它描述的是信息流动的过程&#xff0c;具体来说就是信息从外部输入设备&#xff08;比如常见的键盘&#xff09;传输到计算机内部&#xff08;像内存区域&#xff09;&#xff0c;以及信息从内…

基于Kubernetes编排部署EFK日志收集系统

基于K8S编排部署EFK日志收集系统 案例分析 1. 规划节点 节点规划&#xff0c;见表1。 表1 节点规划 IP主机名k8s版本信息192.168.100.3masterv1.25.2192.168.100.4nodev1.25.2 2. 基础准备 Kubernete环境已安装完成&#xff0c;将提供的软件包efk-img.tar.gz上传至master…

Kubernetes 还是 SpringCloud?

前些年&#xff0c;随着微服务的概念提出以及落地&#xff0c;不断有很多的公司都加入到了这场技术革新中&#xff0c;现在可谓是人人都在做和说微服务。 提到微服务&#xff0c;Java栈内&#xff0c;就不得不提SpringBoot、SpringCloud、Dubbo。 近几年&#xff0c;随着Cloud …

ChatGPT如何辅助academic writing?

今天想和大家分享一篇来自《Nature》杂志的文章《Three ways ChatGPT helps me in my academic writing》&#xff0c;如果您的日常涉及到学术论文的写作&#xff08;writing&#xff09;、编辑&#xff08;editing&#xff09;或者审稿&#xff08; peer review&#xff09;&a…

101.【C语言】数据结构之二叉树的堆实现(顺序结构) 2

目录 1.堆删除函数HeapPop 一个常见的错误想法:挪动删除 正确方法 设计堆顶删除函数HeapPop 解析向下调整函数AdjustDown 核心思想 向下调整最多次数 向下调整的前提 代码实现 提问 细节分析 2.测试堆删除函数 运行结果 3.引申问题 运行结果 4.练习 分析 代码…

【机器学习chp8】统计学习理论

前言 本文遗留问题&#xff1a;无 目录 前言 一、结构风险最小化 1、最小化风险决策 2、分类与回归中的最小化风险决策 3、统计学习的基本目标 4、无免费午餐定理 5、Hoeffding不等式 &#xff08;1&#xff09;背景及定义 &#xff08;2&#xff09;Hoeffding不等式…

Springboot启动报错’javax.management.MBeanServer’ that could not be found.

报错信息如下图&#xff1a; 解决办法&#xff1a; 1.在你的.yml文件或者.properties文件里加上如下配置&#xff1a; properties: management.endpoints.jmx.enabledfalseyml: management:endpoints:jmx:enabled: false2.如果以上方法行不通&#xff0c;在springboot启动类…

英语知识网站:Spring Boot技术构建

6系统测试 6.1概念和意义 测试的定义&#xff1a;程序测试是为了发现错误而执行程序的过程。测试(Testing)的任务与目的可以描述为&#xff1a; 目的&#xff1a;发现程序的错误&#xff1b; 任务&#xff1a;通过在计算机上执行程序&#xff0c;暴露程序中潜在的错误。 另一个…

英伟达推出了全新的小型语言模型家族——Hymba 1.5B

每周跟踪AI热点新闻动向和震撼发展 想要探索生成式人工智能的前沿进展吗&#xff1f;订阅我们的简报&#xff0c;深入解析最新的技术突破、实际应用案例和未来的趋势。与全球数同行一同&#xff0c;从行业内部的深度分析和实用指南中受益。不要错过这个机会&#xff0c;成为AI领…