STM32F407 IIC通信

news2025/3/15 7:21:21

1、IIC 介绍

        IIC(Inter-Integrated Circuit)总线是一种由数据线 SDA 和时钟线 SCL 构成的两线式串行总线,可发送和接收数据,常用于 MPU/MCU 与外部设备连接通信、数据传输。每个连接到总线的设备都有一个独立的地址,主机可以通过该地址来访问不同设备。因为 IIC 协议比较简单,常用GPIO 来模拟 II C时序,这种方法称为模拟 IIC。

        IIC 总线的特点:

  • 一主多从:IIC 协议允许多个“从机”芯片和一个或更多的“主机”芯片进行通讯。这种通信模式使得一个微控制器可以轻松地与多个外围设备通信,连接到总线的接口数量只由总线电容 400pF 的限制决定。
  • 两根线:IIC 通信仅需要两根信号线来完成信息交换,即 SCL 时钟信号线和 SDA 数据输入/输出线。这种简化的硬件接口降低了系统的复杂性和成本。
  • 半双工:IIC 通信是半双工的,说明数据可以在两个方向上传输,但同一时刻只能在一个方向上传输。这限制了数据的传输速率,但满足大多数低速外围设备的需求。
  • 同步通信:IIC 是一种同步通信协议,发送端在发送串行数据的同时提供一个时钟信号。接收端根据发送端提供的时钟信号接收数据,这确保了数据的准确性和一致性。
  • 总线上数据的传输速率在标准模式下可达 100Kbit/s,在快速模式下可达 400Kbit/s,在高速模式下可达 3.4Mbit/s。

2、模拟 IIC 的时序

  • 空闲状态:当 IIC 总线不处于通信状态时,SDA 和 SCL 两条信号线同时处于高电平,这被定义为总线的空闲状态,即释放总线。
  • 开始信号:当 SCL 为高期间,SDA 由高到低的跳变。这个信号标志着通信的开始,并使所有从机变为活动状态,等待接收地址位。
  • 停止信号:当 SCL 为高期间,SDA 由低到高的跳变。这个信号标志着通信的结束。
  • 应答信号:在 IIC 通信中,每传输一个字节后,接收端会发送一个应答信号来告知发送端数据是否接收成功。当主机发送了 8 位数据后,也就是在第 9 个时钟周期会再产生一个时钟,此时主机放开 SDA 的控制,读取 SDA 电平, 在上拉电阻的影响下,此时SDA默认为高,必须从机拉低, 以确认收到数据。应答信号为低电平时表示有效应答(ACK),高电平时表示非应答(NACK)。

3、模拟 IIC 传输流程

  1. SDA 和 SCL 开始都为高, 然后主机将 SDA 拉低, 表示开始信号;
  2. 在接下来的 8 个时间周期里,主机控制 SDA 的高低, 发送从机地址。 其中第 8 位如果为0, 表示接下来是写操作,即主机传输数据给从机; 如果为 1,表示接下来是读操作,即从机传输数据给主机;注意,数据传输方式为 MSB,即从最高位到最低位。
  3. 总线中对应从机地址的设备,发出应答信号;
  4. 在接下来的 8 个时间周期里,如果是写操作,则主机控制 SDA 的高低;如果是读操作,则从机控制 SDA 的高低;
  5. 每次传输完成, 接收数据的设备, 都发出应答信号;
  6. 最后, 在 SCL 为高时, 主机由低拉高 SDA, 表示停止信号,整个传输结束;

 4、模拟 IIC 的实现代码

4.1、GPIO 引脚定义与初始化

        IIC 的SCL 和 SDA 引脚在 iic.h 中定义:

/* 定义 I2C 引脚 */
#define I2C_SCL_PIN		GPIO_Pin_6
#define I2C_SDA_PIN 	GPIO_Pin_7
#define I2C_GPIO_PORT	GPIOB
#define I2C_RCC_CLOCK	RCC_AHB1Periph_GPIOB

/* I2C SDA 或 SCL 引脚拉高或拉低 */
#define SCL_H()			GPIO_SetBits(I2C_GPIO_PORT, I2C_SCL_PIN)
#define SCL_L()			GPIO_ResetBits(I2C_GPIO_PORT, I2C_SCL_PIN)

#define SDA_H()			GPIO_SetBits(I2C_GPIO_PORT, I2C_SDA_PIN)
#define SDA_L()			GPIO_ResetBits(I2C_GPIO_PORT, I2C_SDA_PIN)

        IIC 的 GPIO 则在 iic.c 文件中初始化:

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

jupyter无法转换为PDF,HTMLnbconvert failed: Pandoc wasn‘t found.

无法转为PDF 手动下载工具 https://github.com/jgm/pandoc/releases/tag/3.6.3 似乎跟我想的不大一样,还有新的报错 https://nbconvert.readthedocs.io/en/latest/install.html#installing-tex 不知道下的啥玩意儿 sudo apt-get install texlive-xetex texlive-fon…

使用 Excel 实现绩效看板的自动化

引言 在日常工作中,团队的绩效监控和管理是确保项目顺利进行的重要环节。然而,面临着以下问题: ​数据分散:系统中的数据难以汇总,缺乏一个宏观的团队执行情况视图。​看板缺失:系统本身可能无法提供合适…

vue3怎么和大模型交互?

引言 平时我们都是用的在线的AI工具,直接输入问题,然后AI回答我们,那么怎么把AI接入项目中呢? 这个问题问得好。 方案一:引入第三方已封装好的UI库方案二:自己写 对于方案一,市面上已有一些…

【网络编程】HTTP网络编程

13.1 HTTP 简介 HTTP(Hyper Text Transfer Protocol,超文本传输协议)是用于从万维网(WWW:World Wide Web) 服务器(简称Web 服务器)传输超文本到本地浏览器的传送协议,基于TCP/IP 通信协 议来传递数据 (HTML 文件、图片文件、查询结果等)。 13.2 HTTP 的工作原理 …

【Qt】QWidget属性介绍

🏠个人主页:Yui_ 🍑操作环境:Qt Creator 🚀所属专栏:Qt 文章目录 前言1. enabled属性2.geometry属性2.1 改变控件位置2.2 女神表白程序2.3 知识补充——window frame 3. windowsTitle属性4. windowIcon属性…

『Rust』Rust运行环境搭建

文章目录 rust编译工具rustupVisual Studio VS Code测试编译手动编译VSCode编译配置 参考完 rust编译工具rustup https://www.rust-lang.org/zh-CN/tools/install 换源 RUSTUP_DIST_SERVER https://rsproxy.cn RUSTUP_UPDATE_ROOT https://rsproxy.cn修改rustup和cargo的安…

vue/react/vite前端项目打包的时候加上时间最简单版本,防止后端扯皮

如果你是vite项目,直接写一个vite的插件,通过这个插件可以动态注入环境变量,然后当打包的时候,自动注入这个时间到环境变量中,然后在项目中App.vue中或者Main.tsx中打印出来,这就知道是什么时候编译的项目了…

Cadence学习笔记3

设置 PCB 层叠 初始我们有一个两层板,如果需要添加层叠怎么办? 点击进入层叠设置 首先右击 TOP 层下面的空白,然后鼠标右键进行 add layer 然后选择 Plane(一般层就是这个) 就好 然后 add就行 设置光标显示形式 在 setup ->…

Linux系统下如何部署svmspro平台

上传svmspro服务 rz回车后选择svmspro.zip上传如果提示rz命令未找到,请先运行 yum install -y lrzsz 安装将svmspro.zip解压出来,并拷贝到/usr/目录下,命令如下: unzip svmspro.zip//解压程序包cp svmspro /usr/ -r//将svmspro文件…

vue3:八、登录界面实现-忘记密码

一、页面效果 二、实现 1、视图层 <el-form-item class"flex flex-between"><el-checkbox label"记住密码" v-model"remember" /> </el-form-item> 参考 Checkbox 多选框 | Element Plus 2、逻辑层 首先设置记住密码的变…

el-table树形表格合并相同的值

el-table树形表格合并相同的值 el-table树形表格合并相同的值让Ai进行优化后的代码 el-table树形表格合并相同的值 <style lang"scss" scoped> .tableBox {/deep/ &.el-table th:first-child,/deep/ &.el-table td:first-child {padding-left: 0;} } …

Apache Tomcat漏洞,对其进行升级

我们付出一些成本&#xff0c;时间的或者其他&#xff0c;最终总能收获一些什么。 升级背景&#xff1a; 近日&#xff0c;新华三盾山实验室监测到 Apache 官方修复了一个远程代码执行漏洞 (CVE-2025-24813) &#xff0c;其CVSS3 漏洞评分为 7.5 。 影响范围 9.0.0.M1 ≤…

工程实践:如何使用SU17无人机来实现室内巡检任务

阿木实验室最近发布了科研开发者版本的无人机SU17&#xff0c;该无人机上集成了四目视觉&#xff0c;三维激光雷达&#xff0c;云台吊舱&#xff0c;高算力的机载计算机&#xff0c;是一个非常合适的平台用于室内外巡检场景。同时阿木实验室维护了多个和无人机相关的开源项目。…

OSPF-3 1类LSA Router LSA

前面两期我们介绍了OSPF的邻居与邻接建立的关系及失败因素和原因 这章我们来说说OSPF是如何通过不同的LSA去描述拓扑的信息以及路由信息 一、概述 OSPF通过不同的LSA来构成LSDB链路状态数据库,再通过SPF算法来计算出最优的最短路径 二、LSA的分类 类型名称描述传播范围1类…

【清华大学第七版】DeepSeek赋能家庭教育的实操案例(批改作文+辅助语文/数学/科学学习+制定学习计划)

我用夸克网盘分享了「DeepSeek完整资料合集」&#xff0c;点击链接即可保存。打开「夸克APP」&#xff0c;无需下载在线播放视频&#xff0c;畅享原画5倍速&#xff0c;支持电视投屏。 链接&#xff1a;https://pan.quark.cn/s/621259e4af15 近日&#xff0c;清华大学发布了《…

HCIA-ACL实验

前提条件&#xff1a;实现底层互通 转发层面 1、基本ACL ①要求PC3不能访问网段192.168.2.0的网段&#xff0c;PC4和客户端能正常访问服务器 ②AR2配置 acl 2000 rule deny source 192.168.1.1 0 匹配流量 int g 0/0/0 traffic-filter inbound acl 2000 接口调用…

DeepLabv3+改进10:在主干网络中添加LSKBlock|动态调整其大型空间感受野,助力小目标识别

🔥【DeepLabv3+改进专栏!探索语义分割新高度】 🌟 你是否在为图像分割的精度与效率发愁? 📢 本专栏重磅推出: ✅ 独家改进策略:融合注意力机制、轻量化设计与多尺度优化 ✅ 即插即用模块:ASPP+升级、解码器 PS:订阅专栏提供完整代码 目录 论文简介 步骤一 步骤二…

词向量:优维大模型语义理解的深度引擎

★ 放闸溯源 优维大模型「骨架级」技术干货 第二篇 ⇓ 词向量是Transformer突破传统NLP技术瓶颈的核心&#xff0c;它通过稠密向量空间映射&#xff0c;将离散符号转化为连续语义表示。优维大模型基于词向量技术&#xff0c;构建了运维领域的“语义地图”&#xff0c;实现从…

编译原理:语法分析程序【附源码和超详细注释】

目录 一 、实验目的 二 、实验内容及步骤 三、程序分析 1. 需求分析 2. 功能分析 1. LL(1)文法功能分析 2. 算符优先文法功能分析 3. 信创分析-主要针对能力提升中国产操作系统上开发内容。 四、源代码 1. LL(1)文法代码 2. 算符优先文法 五、测试结果 1. LL(1)文…

使用Flask和OpenCV 实现树莓派与客户端的视频流传输与显示

使用 Python 和 OpenCV 实现树莓派与客户端的视频流传输与显示 在计算机视觉和物联网领域&#xff0c;经常需要将树莓派作为视频流服务器&#xff0c;通过网络将摄像头画面传输到客户端进行处理和显示。本文将详细介绍如何利用picamera2库、Flask 框架以及 OpenCV 库&#xff…