STM32-----I2C

news2025/2/25 3:36:19

1.基本原理:

上图是I2C的总线图和通讯协议图(就是I2C是怎么实现设备之间读写数据的)

下面主要介绍通讯协议的每一步:

1.发出开始信号:  一开始都为高电平为空闲状态。当SCL为高电平时,主机将SDA拉低即为发出开始信号,从机设备检测到开始信号后会开始监听总线,总线进入繁忙状态

2.地址传输

主设备向总线发送一个字节数据:7位设备地址+1位读写数据帧。

每个从机都会将主机发送的地址与自己的地址进行比较,成功匹配地址的从设备通过拉低 SDA 线返回 ACK(应答)信号。至此主从机配对成功。接下来,无论谁是接收方,在接受到数据后必须向发送方返回成功接收的应答信号“ACK",或者接收失败的应答信号”NACK"

而后面数据传输的方向由  “ R/W读写位 ” 决定

0(写) = 主机  →  从机

1 (读)= 从机 →   主机

3.数据传输

根据读写位,主机开始发送/接收数据,接下来就是正常返回应答,还有编写自己的传输协议就行了。最后记得拉高SDA发出停止信号,代表数据传输结束

注:

因为写数据一直是”一个方向“,所以不用重写读写数据帧

但是读数据需要在配对后更改传输方向,所以需要重写读写数据帧

2.软件IIC  /  硬件I2C

首先一般我们要编写I2C驱动,然后再编写通讯协议

I2C驱动指的就是定义接口、读写指令、发出应答等指令函数

通讯协议就是传感器的数据传输函数

而关于软硬件驱动:

硬件I2C驱动编写:

1.用CUBEMX配置的HAL库I2C,自动生成的i2c.h就是驱动

2.不用CUBEMX配置的HAL库I2C,自己用HAL库去编写驱动,会比纯软少一点代码(

#ifndef __BSP_I2C_H
#define	__BSP_I2C_H

#include "stm32f1xx.h"
#include "./usart/bsp_debug_usart.h"

/*等待超时时间*/
#define Delay 		HAL_Delay

#define I2Cx_FLAG_TIMEOUT             ((uint32_t) 1000) //0x1100
#define I2Cx_LONG_TIMEOUT             ((uint32_t) (300 * I2Cx_FLAG_TIMEOUT)) //was300
/**************************I2C参数定义,I2C1或I2C2********************************/
#define I2C_OWN_ADDRESS           0x00


#define SENSORS_I2C              		      I2C1
#define SENSORS_I2C_RCC_CLK_ENABLE()   	 __HAL_RCC_I2C1_CLK_ENABLE()
#define SENSORS_I2C_FORCE_RESET()    		 __HAL_RCC_I2C1_FORCE_RESET()
#define SENSORS_I2C_RELEASE_RESET()  		 __HAL_RCC_I2C1_RELEASE_RESET()

/*引脚定义*/ 
#define SENSORS_I2C_SCL_GPIO_PORT         GPIOB
#define SENSORS_I2C_SCL_GPIO_CLK_ENABLE() __HAL_RCC_GPIOB_CLK_ENABLE()
#define SENSORS_I2C_SCL_GPIO_PIN         	GPIO_PIN_6
 
#define SENSORS_I2C_SDA_GPIO_PORT         GPIOB
#define SENSORS_I2C_SDA_GPIO_CLK_ENABLE()  __HAL_RCC_GPIOB_CLK_ENABLE()
#define SENSORS_I2C_SDA_GPIO_PIN          GPIO_PIN_7

#define SENSORS_I2C_AF                  	 GPIO_AF4_I2C1





/*信息输出*/
#define I2C_DEBUG_ON         1
#define I2C_DEBUG_FUNC_ON    0

#define I2C_INFO(fmt,arg...)           printf("<<-I2C-INFO->> "fmt"\n",##arg)
#define I2C_ERROR(fmt,arg...)          printf("<<-I2C-ERROR->> "fmt"\n",##arg)
#define I2C_DEBUG(fmt,arg...)          do{\
                                          if(I2C_DEBUG_ON)\
                                          printf("<<-I2C-DEBUG->> [%d]"fmt"\n",__LINE__, ##arg);\
                                          }while(0)

#define I2C_DEBUG_FUNC()               do{\
                                         if(I2C_DEBUG_FUNC_ON)\
                                         printf("<<-I2C-FUNC->> Func:%s@Line:%d\n",__func__,__LINE__);\
                                       }while(0)


																			 
void I2cMaster_Init(void);
unsigned short Get_I2C_Retry(void);
																			 
int Sensors_I2C_ReadRegister(unsigned char slave_addr,
                                       unsigned char reg_addr,
                                       unsigned short len, 
                                       unsigned char *data_ptr);
int Sensors_I2C_WriteRegister(unsigned char slave_addr,
                                        unsigned char reg_addr,
                                        unsigned short len, 
                                        unsigned char *data_ptr);


#endif /* __BSP_I2C_H */

而软件

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

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

相关文章

hadoop集群搭建-安装虚拟机

2.1 安装虚拟机 在本地搭建集群就需要这么几个事 装虚拟机 安装环境 配置集群 启动 这篇博客主要就是讲的装虚拟机这一个环节的 装虚拟机就是和组装一台现实中的电脑一样&#xff0c;首先来说就是要有硬件&#xff0c;就是组装硬件&#xff0c;然后就是装系统&#xff…

SpringCloud学习记录|day5

学习材料 2024最新SpringCloud微服务开发与实战&#xff0c;java黑马商城项目微服务实战开发&#xff08;涵盖MybatisPlus、Docker、MQ、ES、Redis高级等&#xff09; 目前讲过的 可惜&#xff0c;自己基本没理解。 雪崩问题 1.服务保护&#xff1a; 请求限流&#xff0c;线…

量化择时技术指标详解及实战应用(一)

🌟作者简介:热爱数据分析,学习Python、Stata、SPSS等统计语言的小高同学~🍊个人主页:小高要坚强的博客🍓当前专栏:《Python之量化交易》🍎本文内容:量化择时技术指标详解及实战应用(一)🌸作者“三要”格言:

从零开始使用最新版Paddle【PaddleOCR系列】——文本检测和识别模型的环境安装与基础使用

目录 一、环境安装配置 1.基本环境配置&#xff1a;torch与paddlepaddle安装 2.专精任务配置&#xff1a;PaddleX与PaddleOCR插件安装 3.测试数据配置&#xff1a;测试数据集下载与验证 二、模型基础使用 1.使用OCR模型预测 ​ 2.使用Detect检测模型 ​ 3.使用…

【论文笔记】Fine-tuned CLIP Models are Efficient Video Learners

&#x1f34e;个人主页&#xff1a;小嗷犬的个人主页 &#x1f34a;个人网站&#xff1a;小嗷犬的技术小站 &#x1f96d;个人信条&#xff1a;为天地立心&#xff0c;为生民立命&#xff0c;为往圣继绝学&#xff0c;为万世开太平。 基本信息 标题: Fine-tuned CLIP Models a…

QT实现改变窗口大小其子控件也自动调节大小

创建一个顶层布局即可&#xff0c;一定要在MainWindows或者Widget的下面&#xff01; 观察图标变化 带有禁止的意思是分拆布局&#xff08;当前无布局&#xff09; 现在是添加布局后了 注意&#xff1a;一定是在MainWindows或Widget才可以添加顶层布局&#xff0c;才可以实现…

antDesign Form.List下的Form.Item如何通过setFieldsValue设置值

翻了一下antDesign官网只看见了Form可以使用setFieldsValue设置值&#xff0c;却没找到Form.List使用setFieldsValue设置值。 于是研究了一下&#xff01;&#xff01;&#xff01;&#xff01;&#xff01;&#xff01; 我的解决方案是&#xff1a; 先设置为空数组, 再设置成…

241014-绿联UGOSPro-通过虚拟机访问主机的用户目录及文件夹

如图所示&#xff0c;两种方式&#xff1b; 方式1: 通过Files中的Other Locations 添加主机ip&#xff0c;随后输入主机的用户名及密码即可系统及文件加载可能需要一段时间&#xff0c;有点卡&#xff0c;加载完应该就可以点击访问了 方式2: 通过命令行直接ssh/sftp userna…

解锁C++继承的奥秘:从基础到精妙实践(下)

文章目录 前言&#x1f950;五、多继承&#xff0c;菱形继承和菱形虚拟继承&#x1f9c0;5.1 多继承&#x1f9c0;5.2 菱形继承&#x1f9c0;5.3 虚拟继承&#xff08;解决菱形继承问题&#xff09;5.3.1 虚拟继承的语法&#xff1a;5.3.2 虚拟继承示例&#xff1a; &#x1f9…

C语言 | Leetcode C语言题解之第479题最大回文数乘积

题目&#xff1a; 题解&#xff1a; int largestPalindrome(int n){if (n 1) {return 9;}int upper pow(10, n) - 1;for (int left upper;; --left) { // 枚举回文数的左半部分long p left;for (int x left; x > 0; x / 10) {p p * 10 x % 10; // 翻转左半部分到其自…

相机畸变模型

文章目录 概述相机畸变类型径向畸变切向畸变 畸变数学模型径向畸变模型切向畸变模型畸变数学模型总结 去畸变数学过程去畸变步骤 畸变测试结论参考 概述 相机畸变是图像处理和计算机视觉中的常见问题。由于透镜的物理特性&#xff0c;图像边缘的物体往往会呈现扭曲&#xff0c…

(34)FFT与信号频谱(双边谱)

文章目录 前言一、仿真代码二、仿真结果画图 前言 本文首先使用MATLAB生成一段余弦信号&#xff0c;然后对其进行FFT变换&#xff0c;给出了信号的双边幅度谱。 一、仿真代码 代码如下&#xff08;示例&#xff09;&#xff1a; %% 生成余弦波 % 指定信号的参数&#xff0c;…

k8s中的微服务

一、什么是微服务 用控制器来完成集群的工作负载&#xff0c;那么应用如何暴漏出去&#xff1f;需要通过微服务暴漏出去后才能被访问 Service是一组提供相同服务的Pod对外开放的接口。 借助Service&#xff0c;应用可以实现服务发现和负载均衡。 service默认只支持4层负载均…

Java 输入与输出(I\O)详解

一、Java 输入与输出&#xff08;I\O)系统概述 Java 输入/输出流&#xff08;Input/Output&#xff0c;简称I/O&#xff09;是Java语言用于读写数据的API&#xff0c;它提供了一系列类和接口&#xff0c;用于读取和写入各种类型的数据信息。 输入/输出&#xff08;I/O&#xff…

SpringBoot项目热部署-devtools

DevTools 会使用两个类加载器&#xff08;一个用于加载不变的类&#xff0c;一个用于加载可能会变化的类&#xff09;&#xff0c;每次重启只重新加载管理变化的类的加载器&#xff0c;因此会快很多 1.导入依赖 <dependency> <groupId>org.springframework.boot&l…

动态设置placeholder-class.默认搜索图标在中间获取焦点之后再左边

默认状态:placeholder和图标在中间位置 获取焦点&#xff1a;placeholder和图标在左边光标前面位置 动态设置placeholder-class <view class"search"><input type"search" class"select-input" input-align"center" v-model.…

算法题---动态规划

题目展示&#xff1a; 动态规划的题目我们一半分为5个步骤去分析&#xff0c;第一&#xff0c;状态表示&#xff1b;第二&#xff0c;动态转移方程&#xff1b;第三&#xff0c;初始化&#xff1b;第四&#xff0c;填表顺序&#xff1b;第五&#xff0c;返回值。 状态表示 这…

[权威出版|稳定检索]2024年大数据经济与公共管理国际会议(BDEPM 2024)

2024年大数据经济与公共管理国际会议 2024 International Conference on Big Data Economy and Public Management 【1】大会信息 会议名称&#xff1a;2024年大数据经济与公共管理国际会议 会议简称&#xff1a;BDEPM 2024 大会时间&#xff1a;请查看官网 大会地点&#xf…

网络协议原理

文章目录 TCP通信原理TCP与UDP的对比应用层应用层协议 --- tcp协议定制直接传递对象自定义协议现在要解决的问题业务处理 json的使用使用json进行序列化和反序列化操作 总结 TCP通信原理 tcp是面向字节流的 同时他也是面向连接的 所以TCP的服务器编写代码如图所示: 客户端的编…

Scala入门基础(10)高级函数

一.什么是高阶函数 二.map函数 三.foreach函数 四.filter函数 五.flatten函数 正文&#xff1a; 一.什么是高阶函数 高阶函数&#xff1a;是一个特殊的函数&#xff0c;特殊之处在于&#xff1a;它指使用其他函数作为参数或返回值 &#xff08;演示&#xff09; 二.map函…