当前位置: 首页 > article >正文

STM32——I2C通讯(软件模拟)

I2C概念

I2C:Inter-Integrated Circuit(内部集成电路)

Philps公司80年代初期开发的,引脚少,硬件实现简单,可扩展性广泛地使用在系统内多个集成电路(IC)间的低速通讯

简单的双向两线制总线协议标准,支持同步串行半双工通讯。

标准模式传输速率为100kbit/s,快速模式为400kbit/s,高速模式下可达3.4Mbit/s,目前大多I2C设备尚不支持高速模式。 

物理层

SCL:串行时钟总线,用于数据收发同步
SDA:串行数据总线,用高低电平表示数据
可连接多个IC通讯设备,支持一主多从也支持多主多从
每个设备都有唯一的地址,主机通过这个地址与从机通信
总线通过上拉电阻接到电源。设备空闲时,输出高阻态,当所有设备都空闲,都输出高阻态时,由上拉电阻把总线拉成高电平

协议层

位传输            作为串行通信,是按照位进行传输,一般是高位先行
起始信号        当SCL是高电平时,SDA线从高电平向低电平切换
停止信号        当SCL是高电平时,SDA线从低电平向高电平切换

//头文件定义
#define IIC_SCL(x)        do{ x ? \HAL_GPIO_WritePin(IIC_SCL_GPIO_PORT, IIC_SCL_GPIO_PIN, GPIO_PIN_SET) : \HAL_GPIO_WritePin(IIC_SCL_GPIO_PORT, IIC_SCL_GPIO_PIN, GPIO_PIN_RESET); \}while(0)       /* SCL */#define IIC_SDA(x)        do{ x ? \HAL_GPIO_WritePin(IIC_SDA_GPIO_PORT, IIC_SDA_GPIO_PIN, GPIO_PIN_SET) : \HAL_GPIO_WritePin(IIC_SDA_GPIO_PORT, IIC_SDA_GPIO_PIN, GPIO_PIN_RESET); \}while(0)       /* SDA */#define IIC_READ_SDA     HAL_GPIO_ReadPin(IIC_SDA_GPIO_PORT, IIC_SDA_GPIO_PIN) /* 读取SDA */

//起始信号
void iic_start(void)
{
/* SCL为高电平期间,SDA从高电平往低电平跳变*/
IIC_SDA(1);
IIC_SCL(1);
iic_delay();
IIC_SDA(0);
iic_delay();
IIC_SCL(0);
iic_delay();/*钳住总线,准备发送/接收数据
}//结束信号
void iic_stop (void)
/* SCL为高电平期间,SDA从低电平往高电平跳变*/
IIC_SDA(0);
iic_delay();
IIC_SCL(1);
iic_delay();
IIC_SDA(1);/*发送总线停止信号*/
iic_delay();
}

传输地址        主机通过SDA信号线发送设备地址(SLAVE_ADDRESS)来查找从机
                        PC协议规定设备地址可以是7位或10位,实际中7位的地址应用比较广泛。
                        紧跟设备地址的一个数据位用来表示数据传输方向,它是数据方向位(R/W),第                          8位或第11位
                        数据方向位为"1"时表示主机由从机读数据,该位为"0"时表示主机向从机写数据

 数据的有效性
SDA高或低电平状态只有在SCL时钟信号是低电平时才能改变
SDA线上的数据必须在时钟的高电平周期保持稳定

//发送一个字节
void iic_send_byte (uint8_t data)
{for(uint8_t t = 0; t < 8; t++){/*高位先发*\IIC_SDA((data &0x80)>> 7);iic_delay();IIC_SCL(1);iic_delay();IIC_SCL(0);data<<=1;/* 左移1位用于下一次发送}IIC_SDA(1);/*发送完成,主机释放SDA线*
}//读取一个字节数据
uint8_t iic_read_byte(uint8_t ack) /* 1:ack 0:nack*/
{uint8_t receive = 0;for(uint8_t t = 0; t < 8; t++){/*高位先输出,先收到的数据位要左移*receive <<= 1;IIC_SCL(1);iic_delay();if(IIC_READ_SDA) receive++;IIC_SCL(0);iic_delay();}if(!ack) iic_nack();else iic_ack() ;return receive;
}

响应

接收方接收到数据后,有两种响应

1.应答响应。给发送方一个低电平

2.非应答响应。给发送方一个高电平

//等待应答
uint8_t iic_wait_ack<(void))/* return 1:fail 0:succeed*/
{IIC_SDA(1);/*主机释放SDA线*iic_delay();IIC_SCL(1);/*从机返回ACK*/iic_delay();if(IIC_READ_SDA)/* SCL高电平读取SDA状态*/{iic_stop();/*SDA高电平表示从机nack*/return 1;}IIC_SCL(0);/*SCL低电平表示结束ACK检查*/iic_delay();return 0;
}//发送应答
void iic_ack(void)
{IIC_SCL(0)iic_delay();IIC_SDA(0);/*数据线为低电平,表示应答iic_delay();IIC_SCL(1);iic_delay();
}//发送非应答
void iic_ack(void)
{IIC_SCL(0)iic_delay();IIC_SDA(1);/*数据线为高电平,表示非应答iic_delay();IIC_SCL(1);iic_delay();
}

相关文章:

STM32——I2C通讯(软件模拟)

I2C概念 I2C:Inter-Integrated Circuit&#xff08;内部集成电路&#xff09; Philps公司80年代初期开发的&#xff0c;引脚少&#xff0c;硬件实现简单&#xff0c;可扩展性广泛地使用在系统内多个集成电路&#xff08;IC&#xff09;间的低速通讯 简单的双向两线制总线协议…...

JetBrains Terminal 又发布新架构,Android Studio 将再次迎来新终端

不到一年的时间&#xff0c;JetBrains 又要对 Terminal 「大刀阔斧」&#xff0c;本次发布的新终端是重构后的全新的架构&#xff0c;而上一次终端大调整还是去年 8 月的 v2024.2 版本&#xff0c;并且在「Android Studio Ladybug | 2024.2.1」也被引入。 不知道你们用不用内置…...

论文:Generalized Category Discovery with Large Language Models in the Loop

论文下载地址&#xff1a;Generalized Category Discovery with Large Language Models in the Loop - ACL Anthology 1、研究背景 尽管现代机器学习系统在许多任务上取得了优异的性能&#xff0c;绝大多数都遵循封闭世界的设置&#xff0c;假设训练和测试数据来自同一组预定义…...

第十六届蓝桥杯 省赛C/C++ 大学B组

编程题目现在在洛谷上都可以提交了。 未完待续&#xff0c;写不动了。 C11 编译命令 g A.cpp -o A -Wall -lm -stdc11A. 移动距离 本题总分&#xff1a;5 分 问题描述 小明初始在二维平面的原点&#xff0c;他想前往坐标 ( 233 , 666 ) (233, 666) (233,666)。在移动过程…...

从输入URL到页面渲染:浏览器请求的完整旅程解析

&#x1f310; 从输入URL到页面渲染&#xff1a;浏览器请求的完整旅程解析 #网络协议 #浏览器原理 #性能优化 #Web开发 一、概览&#xff1a;一次请求的9大关键阶段 1. 用户输入URL → 2. DNS解析 → 3. 建立TCP连接 → 4. 发送HTTP请求 5. 服务器处理 → 6. 接收响应 → 7…...

【计网】网络交换技术之分组交换(复习自用,重要1)

复习自用的&#xff0c;处理得比较草率&#xff0c;复习的同学或者想看基础的同学可以看看&#xff0c;大佬的话可以不用浪费时间在我的水文上了 另外两种交换技术可以直接点击链接访问相关笔记&#xff1a; 电路交换 报文交换 一、分组交换的定义 1.定义 分组交换&#x…...

6.2 GitHub API接口设计实战:突破限流+智能缓存实现10K+仓库同步

GitHub Sentinel 定期更新 API 接口设计 关键词:GitHub API 集成、异步爬虫开发、RESTful 接口设计、请求限流策略、数据增量更新 1. 接口架构设计原则 采用 分层隔离架构 实现数据采集与业务逻辑解耦: #mermaid-svg-WihvC78J0F5oGDbs {font-family:"trebuchet ms&quo…...

考研单词笔记 2025.04.13

alleviate v减轻&#xff0c;缓解 alleviation n减轻&#xff0c;缓解 blunt a钝的&#xff0c;不锋利的&#xff0c;坦率的&#xff0c;直截了当的v使减弱&#xff0c;使变钝 dampen v抑制&#xff0c;减弱&#xff0c;使潮湿 dim v减弱&#xff0c;淡化&#xff0c;变昏暗…...

解密CHASE-SQL和XiYan-SQL多智能体AI如何最终实现TEXT2SQL的突破

想象一个世界,无论技术背景如何,任何人都能轻松查询海量数据库、挖掘深层洞察。比如:“我想知道安徽地区最畅销电子产品的第三季度销售额?”——只需一句话。“去年营销支出与客户获取成本之间的相关性如何?”——像聊天一样输入问题。这就是Text-to-SQL的承诺:将人类语言…...

思考力提升的黄金标准:广度、深度与速度的深度剖析

文章目录 引言一、广度的拓展&#xff1a;构建多元知识网络1.1 定义与重要性1.2 IT技术实例与提升策略小结&#xff1a;构建多元知识网络&#xff0c;提升IT领域思考力广度 二、深度的挖掘&#xff1a;追求知识的精髓2.1 定义与重要性2.2 IT技术实例与提升策略小结&#xff1a;…...

web自动化:下拉选择框、弹出框、滚动条的操作

web自动化&#xff1a;下拉选择框、弹出框、滚动条的操作 一、下拉选择框 1、导包 from selenium.webdriver.support.select inport Select 2、实例化对象 Select(element) 3、常用方法 通过option索引来定位&#xff0c;从0开始&#xff1a;select_by_index(index)通过…...

数字人:打破次元壁,从娱乐舞台迈向教育新课堂(4/10)

摘要&#xff1a;数字人正从娱乐领域的璀璨明星跨界到教育领域的智慧导师&#xff0c;展现出无限潜力。从虚拟偶像、影视游戏到直播短视频&#xff0c;数字人在娱乐产业中大放异彩&#xff0c;创造巨大商业价值。在教育领域&#xff0c;数字人助力个性化学习、互动课堂和虚拟实…...

互联网三高-数据库高并发之分库分表ShardingJDBC

1 ShardingJDBC介绍 1.1 常见概念术语 ① 数据节点Node&#xff1a;数据分片的最小单元&#xff0c;由数据源名称和数据表组成 如&#xff1a;ds0.product_order_0 ② 真实表&#xff1a;再分片的数据库中真实存在的物理表 如&#xff1a;product_order_0 ③ 逻辑表&#xff1a…...

【NLP】 18. Tokenlisation 分词 BPE, WordPiece, Unigram/SentencePiece

1. 翻译系统性能评价方法 在机器翻译系统性能评估中&#xff0c;通常既有人工评价也有自动评价方法&#xff1a; 1.1 人工评价 人工评价主要关注以下几点&#xff1a; 流利度&#xff08;Fluency&#xff09;&#xff1a; 判断翻译结果是否符合目标语言的语法和习惯。充分性…...

Android游戏逆向工程全面指南

文章目录 第一部分&#xff1a;基础概念与环境搭建1.1 游戏逆向工程概述1.2 法律与道德考量1.3 开发环境准备基础工具集&#xff1a;环境配置示例&#xff1a; 第二部分&#xff1a;静态分析技术2.1 APK反编译与资源提取使用Apktool解包&#xff1a;关键文件分析&#xff1a; 2…...

ip route show 命令详解

《Linux 中 ip route show 输出结果解析及关键概念》 以下是对 ip route show 输出结果的详细解析&#xff0c;帮助你理解每条路由的含义及作用&#xff1a; 一、路由表整体结构 Linux 路由表中的每条条目包含 目标网络 / 主机、下一跳网关、出接口、路由协议、作用域、源地…...

antv x6使用(支持节点排序、新增节点、编辑节点、删除节点、选中节点)

项目需要实现如下效果流程图&#xff0c;功能包括节点排序、新增节点、编辑节点、删除节点、选中节点等 html部分如下&#xff1a; <template><div class"MindMapContent"><el-button size"small" click"addNode">新增节点&…...

DP主站如何华丽变身Modbus TCP网关!

DP主站如何华丽变身Modbus TCP网关&#xff01; 在工业自动化领域&#xff0c;Profibus DP和Modbus TCP是两种常用的通信协议。Profibus DP通常应用于制造业自动化场景&#xff0c;而Modbus TCP则广泛使用于工业自动化和楼宇自动化等领域。为了实现这两种协议之间的互联互通&a…...

榕壹云在线商城系统:基于THinkPHP+ Mysql+UniApp全端适配、高效部署的电商解决方案

项目背景&#xff1a;解决多端电商开发的痛点 随着移动互联网的普及和用户购物习惯的碎片化&#xff0c;传统电商系统面临以下挑战&#xff1a; 1. 多平台适配成本高&#xff1a;需要同时开发App、小程序、H5等多端应用&#xff0c;重复开发导致资源浪费。 2. 技术依赖第三方…...

Pinia最基本用法

1. 定义 Store 首先&#xff0c;定义一个 Pinia Store&#xff0c;使用组合式 API 风格和 ref 来管理状态。 示例&#xff1a;stores/ids.js import { defineStore } from pinia; import { ref } from vue;export const useIdsStore defineStore(ids, () > {const ids …...

Android studio打包uniapp插件

一.参考资料与环境准备 原生工程配置需要使用到Android studio和HbuilderX 当前测试的as版本-20240301,下载地址&#xff1a;HbuilderX版本&#xff1a;4.36 二.插件创建流程 1.导入下载的UniPlugin-Hello-AS工程&#xff08;下载地址见参考资料&#xff09; 2.生成jks证书…...

App Cleaner Pro for Mac 中 Mac软件卸载工具

App Cleaner Pro for Mac 中 Mac软件卸载工具 一、介绍 App Cleaner & Uninstaller Pro Mac破解&#xff0c;是一款Mac软件卸载工具&#xff0c;残余垃圾清除工具&#xff01;可以卸载应用程序或只删除不需要的服务文件&#xff0c;甚至可以删除以前删除的应用程序中的文…...

多线程与Tkinter界面交互

在现代图形用户界面(GUI)应用程序中,可能会遇到需要长时间运行的任务,例如网络请求、数据处理或文件读取等。如果这些任务直接在主线程中运行,会导致GUI界面“卡顿”或“不响应”。为了保持界面流畅和响应用户操作,我们可以通过使用多线程来将这些任务移到后台运行。然而…...

开发规范——Restful风格

目录 Restful Apifox 介绍 端口号8080怎么来的&#xff1f; 为什么要使用Apifox? Restful 如果请求方式是Post&#xff0c;那我就知道了要执行新增操作&#xff0c;要新增一个用户 如果请求方式是Put&#xff0c;那就代表我要修改用户 具体要对这些资源进行什么样的操…...

大模型——Llama Stack快速入门 部署构建AI大模型指南

Llama Stack快速入门 部署构建AI大模型指南 介绍 Llama Stack 是一组标准化和有主见的接口,用于如何构建规范的工具链组件(微调、合成数据生成)和代理应用程序。我们希望这些接口能够在整个生态系统中得到采用,这将有助于更轻松地实现互操作性。 Llama Stack 定义并标准化…...

符号右移“ >>= “ 与 无符号右移“ >>>= “ 的区别

符号右移" >> " 与 无符号右移" >>> " 的区别 一、符号右移" >> " 与 无符号右移" >>> " 的区别1. 符号右移&#xff08;>>&#xff09;与无符号右移&#xff08;>>>&#xff09;的区别…...

利用阿里云企业邮箱服务实现Python群发邮件

目录 一、阿里云企业邮箱群发邮件全流程实现 1. 准备工作与环境配置 2. 收件人列表管理 3. 邮件内容构建 4. 附件添加实现 5. 邮件发送核心逻辑 二、开发过程中遇到的问题与解决方案 1. 附件发送失败问题 2. 中文文件名乱码问题 3. 企业邮箱认证失败 三、完整工作流…...

探秘 Ruby 与 JavaScript:动态语言的多面风采

1 语法特性对比&#xff1a;简洁与灵活 1.1 Ruby 的语法优雅 Ruby 的语法设计旨在让代码读起来像自然语言一样流畅。它拥有简洁而富有表现力的语法结构&#xff0c;例如代码块、符号等。 以下是一个使用 Ruby 进行数组操作的简单示例&#xff1a; # 定义一个数组 numbers [1…...

08-JVM 面试题-mk

文章目录 1.JVM 的各部分组成2.运行时数据区2.1.什么是程序计数器?2.2.你能给我详细的介绍Java堆吗?2.3.能不能解释一下方法区?2.3.1常量池2.3.2.运行时常量池2.4.什么是虚拟机栈?2.4.1.垃圾回收是否涉及栈内存?2.4.2.栈内存分配越大越好吗?2.4.3.方法内的局部变量是否线…...

PostgreSQL技术大讲堂 - 第86讲:数据安全之--data_checksums天使与魔鬼

PostgreSQL技术大讲堂 - 第86讲&#xff0c;主题&#xff1a;数据安全之--data_checksums天使与魔鬼 1、data_checksums特性 2、避开DML规则&#xff0c;嫁接非法数据并合法化 3、避开约束规则&#xff0c;嫁接非法数据到表中 4、避开数据检查&#xff0c;读取坏块中的数据…...