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

STM32 IIC详解(软件模拟)

目录

一、IIC协议基本原理

1.IIC协议概述

2.时序图分析

二、代码分析

1.IIC初始化

2.IIC起始信号

3.IIC发送数据

4.获取应答信号

5.读一个字节

6.产生ACK应答

7.不产生ACK应答


IIC(Inter-Integrated Circuit)在嵌入式系统中是一种常见的数据通信接口,日常工作中许多传感器都是基于IIC来传输数据的,所以掌握这个接口对我们来说非常重要。

一、IIC协议基本原理

1.IIC协议概述

IIC也被称为I2C和I²C,硬件方面由于存在专利,所以日常中我们常以两个IO口用软件模拟IIC来使用。IIC串行总线有两根信号线:数据线SDA和时钟线SCL。IIC总线上的设备通过地址进行区分,不同种类的设备地址不同。只要不超过IIC总线上的电容限制(一般不超过400pf),就可以连接任意数量的从机,在通信时刻,只能有一个作为主机,其他的都为从机。高速IIC总线一般可达400kbps以上。

2.时序图分析

SCL为时钟线,SDA为数据线,SCL和SDA默认都是高电平,两条线相互配合会产生三种信号构成时序。

开始信号:SCL 为高电平时,SDA 由高电平向低电平跳变。
结束信号:SCL 为高电平时,SDA 由低电平向高电平跳变。
应答信号:接收数据的设备在接收到 8位 数据后,向发送数据的设备发出特定的低电平,表示已收到数据。主机设备向从机设备发出一个信号后,等待从机设备发出一个应答信号,主机设备接收到应答信号后,根据实际情况作出是否继续传递信号。若未收到应答信号,由判断为受控单元出现故障。

IIC在开始信号发出后开始发送数据,数据以8位传输,SCL高电平的时候SDA读到的数据有效,然后经历8位数据传输以后,第九次检测应答信号,如果检测到从机将SDA置为低电平,说明从机设备有应答(ACK),如果保持高电平,说明从机设备没有应答(NACK)。

二、代码分析

本文基于STM32F429的HAL库为例讲解IIC的使用,定义宏参数如下图所示

1.IIC初始化

void IIC_Init(void)
{GPIO_InitTypeDef GPIO_Initure;__HAL_RCC_GPIOH_CLK_ENABLE();   //使能GPIOH时钟//PH4,5初始化设置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_FAST;     //快速HAL_GPIO_Init(GPIOH,&GPIO_Initure);IIC_SDA=1;IIC_SCL=1;  
}

初始化IIC,使能PH4,PH5推挽输出、上拉、快速,然后又将SDA和SCL拉高。

2.IIC起始信号

void IIC_Start(void)
{SDA_OUT();     //sda线输出IIC_SDA=1;	  	  IIC_SCL=1;delay_us(4);IIC_SDA=0;//拉低电平delay_us(4);IIC_SCL=0;//钳住I2C总线,准备发送或接收数据 
}	  

在SDA和SCL高电平的同时,将SDA拉低产生一个下降沿。

3.IIC发送数据

void IIC_Send_Byte(u8 txd)
{                        u8 t;   SDA_OUT(); 	    IIC_SCL=0;//拉低时钟开始数据传输for(t=0;t<8;t++){              IIC_SDA=(txd&0x80)>>7;txd<<=1; 	  delay_us(2);IIC_SCL=1;delay_us(2); IIC_SCL=0;	delay_us(2);}	 
}

切换SDA为输出模式,拉低SCL电平,依次发送8位数据, 每次写好SDA位的时候,将SCL拉高后等待2us再拉低。

4.获取应答信号

//返回值:1,接收应答失败
//        0,接收应答成功
u8 IIC_Wait_Ack(void)
{u8 ucErrTime=0;SDA_IN();      //SDA设置为输入  IIC_SDA=1;delay_us(1);	   IIC_SCL=1;delay_us(1);	 while(READ_SDA){ucErrTime++;if(ucErrTime>250){IIC_Stop();return 1;}}IIC_SCL=0;//时钟输出0 	   return 0;  
} 

将SDA设置为输入模式,将SDA和SCL拉高,如果SDA在规定时间内依然是拉高的状态,说明从机没有应答,反之则说明从机应答。

5.读一个字节

读1个字节,ack=1时,发送ACK,ack=0,发送nACK   
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();//发送nACKelseIIC_Ack(); //发送ACK   return receive;
}

读取数据的时候,先将SDA设置成输入,然后依次拉低拉高SCL 8次,读取8位数据,如果还想继续读取,就产生ACK应答,如果不想继续读取了,就产生nACK应答。

6.产生ACK应答

void IIC_Ack(void)
{IIC_SCL=0;SDA_OUT();IIC_SDA=0;delay_us(2);IIC_SCL=1;delay_us(2);IIC_SCL=0;
}

先将SCL拉低,然后改SDA为输出模式,拉低SDA后拉高SCL后再拉低。

7.不产生ACK应答

//不产生ACK应答		    
void IIC_NAck(void)
{IIC_SCL=0;SDA_OUT();IIC_SDA=1;delay_us(2);IIC_SCL=1;delay_us(2);IIC_SCL=0;
}		

先将SCL拉低,然后改SDA为输出模式,拉高SDA后拉高SCL后再拉低,就可以告诉从机不再继续读取数据。

总体来说,IIC的通讯只用到了SCL(时钟线)和SDA(数据线)两条线,实现起来还是比较简单的,希望本文能帮助你理解IIC如何使用。

相关文章:

STM32 IIC详解(软件模拟)

目录 一、IIC协议基本原理 1.IIC协议概述 2.时序图分析 二、代码分析 1.IIC初始化 2.IIC起始信号 3.IIC发送数据 4.获取应答信号 5.读一个字节 6.产生ACK应答 7.不产生ACK应答 IIC&#xff08;Inter-Integrated Circuit&#xff09;在嵌入式系统中是一种常见的数据通…...

推三返一小程序商城开发搭建

推三返一小程序商城开发主要涉及到以下几个步骤&#xff1a; 确定需求和功能&#xff1a; 首先需要明确小程序商城的开发需求和功能。商家需要思考自己想要实现什么功能&#xff0c;例如推广、销售、裂变等。 同时还需要考虑小程序的页面设计、用户体验等方面。 选择合适的开…...

项目机会:4万平:智能仓,AGV,穿梭车,AMR,WMS,提升机,机器人……

导语 大家好&#xff0c;我是社长&#xff0c;老K。专注分享智能制造和智能仓储物流等内容。 如下为近期国内智能仓储物流相关项目的公开信息线索&#xff0c;这些项目具体信息会发布到知识星球&#xff0c;请感兴趣的球友先人一步到知识星球【智能仓储物流技术研习社】自行下载…...

[工具类]Java 合并、拆分PPT幻灯片

本文将介绍在Java程序中如何来合并及拆分PPT文档的方法。示例大纲&#xff1a; 1. 合并 1.1 将指定幻灯片合并到文档 1.2 合并多个幻灯片文档为一个文档 2. 拆分 2.1 按幻灯片每一页单独拆分为一个文档 2.2 按指定幻灯片页数范围来拆分为多个文档 使用工具&#xff1a;F…...

深入了解 Timber:全面掌握 Android 日志记录的最佳实践

深入了解 Timber&#xff1a;全面掌握 Android 日志记录的最佳实践 Timber 是由 Jake Wharton 提供的一个流行的 Android 日志记录库。它旨在简化日志记录、增强日志管理&#xff0c;并提高代码的可维护性。在本文中&#xff0c;我们将深入探讨 Timber 的功能、使用方法以及最…...

阿一课代表随堂分享:红队反向代理之使用frp搭建反向代理

frp反向代理 frp简介 frp 是一个开源、简洁易用、高性能的内网穿透和反向代理软件&#xff0c;支持 tcp, udp, http, https等协议。 frp 是一个可用于内网穿透的高性能的反向代理应用&#xff0c;分为服务端frps和客户端frpc&#xff0c;支持 tcp, udp, http, https 协议。详…...

基于vue的引入登录界面

以下是一些常见的登录页面布局&#xff1a; 1. 中心布局 - 登录表单位于页面的中心位置&#xff0c;通常包括用户名输入框、密码输入框、登录按钮等元素。页面背景简洁&#xff0c;以突出登录表单。 - 这种布局常见于大多数网站和应用&#xff0c;简洁明了&#xff0c;用户注意…...

centos7升级到欧拉openeule

centos7升级到欧拉openeule 一、准备工作 1、安装迁移工具&#xff08;安装迁移工具的机器不能给自己升级&#xff0c;请用其他机器作为迁移母机&#xff09; wget https://repo.oepkgs.net/openEuler/rpm/openEuler-20.03-LTS-SP1/contrib/x2openEuler/x86_64/Packages/x2…...

阿里云 Ubuntu 开启允许 ssh 密码方式登录

以前用的 centos&#xff0c;重置系统为 ubuntu 后在ssh 远程连接时遇到了点问题&#xff1a; 在阿里云控制台重置实例密码后无法使用密码进行 SSH 连接登录 原因&#xff1a;阿里云 Ubuntu 默认禁用密码登录方式 解决办法&#xff1a; 先使用其他用户登录到服务器 这里进来…...

利用投标相似度辅助围串标判定

摘要 围标&#xff08;bid rigging&#xff09;是一种非法的竞争行为&#xff0c;对市场公平性和公共资源分配造成严重影响。本文探讨了如何利用投标相似度来辅助判定围标行为。通过详细分析投标文件的内容相似性&#xff0c;选取适当的指标进行相似度计算&#xff0c;并结合实…...

iOS 开发者的 Flutter 入门课

作为一名 iOS 开发者&#xff0c;入门 Flutter 需要了解一些新的工具和概念&#xff0c;但也能利用你已有的知识和技能。以下是一个详细的入门指南&#xff0c;帮助你快速上手 Flutter&#xff1a; 1. 环境设置 首先&#xff0c;你需要设置开发环境。 安装 Flutter SDK 前往…...

单机版k8s搭建

环境配置&#xff1a; 关闭防火墙和交换内存 systemctl stop ufwsudo swapoff -a安装Docker 更新安装包 sudo apt-get update安装依赖 sudo apt install -y curl gnupg2 software-properties-common apt-transport-https ca-certificates获取证书 curl -fsSL http://mirrors.a…...

IDEA创建Spring项目无法使用Java8的解决方案

文章目录 一&#xff0c;创建Project&#xff0c;无法选择Java81&#xff0c;无法选择Java82&#xff0c;选择JDK17报错 二&#xff0c;原因分析1&#xff0c;Spring Boot将来会全力支持Java17&#xff0c;不再维护支持Java8的版本 三&#xff0c;解决方案1&#xff0c;使用国内…...

无障碍快捷方式图标

问题背景 测试反馈&#xff0c;无障碍快捷方式和setting里的无障碍图标不一致。 无障碍快捷方式悬浮窗 1、悬浮窗在systemui中 frameworks\base\packages\SystemUI\src\com\android\systemui\accessibility\floatingmenu\AccessibilityTargetAdapter.java 图标获取方式&…...

基于LangChain的RAG开发教程(二)

v1.0官方文档&#xff1a;https://python.langchain.com/v0.1/docs/get_started/introduction/ 最新文档&#xff1a;https://python.langchain.com/v0.2/docs/introduction/ LangChain是一个能够利用大语言模型&#xff08;LLM&#xff0c;Large Language Model&#xff09;能…...

Nifi 与 Kettle

01 Kettle简介 Kettle是一个开源的ETL&#xff08;Extract-Transform-Load&#xff09;工具&#xff0c;可以用于数据集成、数据转换和数据处理等任务。它提供了一组可视化的设计工具&#xff0c;使得用户可以通过简单的拖拽和连接来构建数据流程&#xff0c;并且还支持多种数据…...

uniapp安卓端实现语音合成播报

最初尝试使用讯飞语音合成方式,能获取到语音数据,但是数据是base64格式的,在安卓端无法播放,网上有说通过转成blob格式的url可以播放,但是uniapp不支持转换的api;于是后面又想其他办法,使用安卓插件播报原生安卓语音播报插件 - DCloud 插件市场 方案一(讯飞语音合成) 1.在讯飞…...

Studying-代码随想录训练营day31| 56.合并区间、738.单调递增的数字、968.监控二叉树、贪心算法总结

第31天&#xff0c;贪心最后一节(ง •_•)ง&#x1f4aa;&#xff0c;编程语言&#xff1a;C 目录 56.合并区间 738.单调递增的数字 968.监控二叉树 贪心算法总结 56.合并区间 文档讲解&#xff1a;代码随想录合并区间 视频讲解&#xff1a;手撕合并区间 题目&#xf…...

springboot装修接单平台-计算机毕业设计源码25005

摘要 随着装修行业的快速发展和数字化趋势&#xff0c;传统的装修接单方式已显不足以满足用户需求&#xff0c;因此建立一个便捷高效的平台具有重要意义。通过利用Java语言的跨平台特性和强大的编程能力&#xff0c;结合SpringBoot框架的快速开发特性和Mysql数据库的稳定性&…...

matlab仿真 信道(下)

&#xff08;内容源自详解MATLAB&#xff0f;SIMULINK 通信系统建模与仿真 刘学勇编著第四章内容&#xff0c;有兴趣的读者请阅读原书&#xff09; 之前的内容还剩下simulink的仿真过程。 3.simulink中的AWGN模块仿真 系统框图如图所示&#xff0c;TX和RX 模块需要单独实现…...

Redis相关知识总结(缓存雪崩,缓存穿透,缓存击穿,Redis实现分布式锁,如何保持数据库和缓存一致)

文章目录 1.什么是Redis&#xff1f;2.为什么要使用redis作为mysql的缓存&#xff1f;3.什么是缓存雪崩、缓存穿透、缓存击穿&#xff1f;3.1缓存雪崩3.1.1 大量缓存同时过期3.1.2 Redis宕机 3.2 缓存击穿3.3 缓存穿透3.4 总结 4. 数据库和缓存如何保持一致性5. Redis实现分布式…...

IGP(Interior Gateway Protocol,内部网关协议)

IGP&#xff08;Interior Gateway Protocol&#xff0c;内部网关协议&#xff09; 是一种用于在一个自治系统&#xff08;AS&#xff09;内部传递路由信息的路由协议&#xff0c;主要用于在一个组织或机构的内部网络中决定数据包的最佳路径。与用于自治系统之间通信的 EGP&…...

2025盘古石杯决赛【手机取证】

前言 第三届盘古石杯国际电子数据取证大赛决赛 最后一题没有解出来&#xff0c;实在找不到&#xff0c;希望有大佬教一下我。 还有就会议时间&#xff0c;我感觉不是图片时间&#xff0c;因为在电脑看到是其他时间用老会议系统开的会。 手机取证 1、分析鸿蒙手机检材&#x…...

涂鸦T5AI手搓语音、emoji、otto机器人从入门到实战

“&#x1f916;手搓TuyaAI语音指令 &#x1f60d;秒变表情包大师&#xff0c;让萌系Otto机器人&#x1f525;玩出智能新花样&#xff01;开整&#xff01;” &#x1f916; Otto机器人 → 直接点明主体 手搓TuyaAI语音 → 强调 自主编程/自定义 语音控制&#xff08;TuyaAI…...

JVM暂停(Stop-The-World,STW)的原因分类及对应排查方案

JVM暂停(Stop-The-World,STW)的完整原因分类及对应排查方案,结合JVM运行机制和常见故障场景整理而成: 一、GC相关暂停​​ 1. ​​安全点(Safepoint)阻塞​​ ​​现象​​:JVM暂停但无GC日志,日志显示No GCs detected。​​原因​​:JVM等待所有线程进入安全点(如…...

A2A JS SDK 完整教程:快速入门指南

目录 什么是 A2A JS SDK?A2A JS 安装与设置A2A JS 核心概念创建你的第一个 A2A JS 代理A2A JS 服务端开发A2A JS 客户端使用A2A JS 高级特性A2A JS 最佳实践A2A JS 故障排除 什么是 A2A JS SDK? A2A JS SDK 是一个专为 JavaScript/TypeScript 开发者设计的强大库&#xff…...

作为测试我们应该关注redis哪些方面

1、功能测试 数据结构操作&#xff1a;验证字符串、列表、哈希、集合和有序的基本操作是否正确 持久化&#xff1a;测试aof和aof持久化机制&#xff0c;确保数据在开启后正确恢复。 事务&#xff1a;检查事务的原子性和回滚机制。 发布订阅&#xff1a;确保消息正确传递。 2、性…...

Chromium 136 编译指南 Windows篇:depot_tools 配置与源码获取(二)

引言 工欲善其事&#xff0c;必先利其器。在完成了 Visual Studio 2022 和 Windows SDK 的安装后&#xff0c;我们即将接触到 Chromium 开发生态中最核心的工具——depot_tools。这个由 Google 精心打造的工具集&#xff0c;就像是连接开发者与 Chromium 庞大代码库的智能桥梁…...

安卓基础(Java 和 Gradle 版本)

1. 设置项目的 JDK 版本 方法1&#xff1a;通过 Project Structure File → Project Structure... (或按 CtrlAltShiftS) 左侧选择 SDK Location 在 Gradle Settings 部分&#xff0c;设置 Gradle JDK 方法2&#xff1a;通过 Settings File → Settings... (或 CtrlAltS)…...

c# 局部函数 定义、功能与示例

C# 局部函数&#xff1a;定义、功能与示例 1. 定义与功能 局部函数&#xff08;Local Function&#xff09;是嵌套在另一个方法内部的私有方法&#xff0c;仅在包含它的方法内可见。 • 作用&#xff1a;封装仅用于当前方法的逻辑&#xff0c;避免污染类作用域&#xff0c;提升…...