STM32-----I2C

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.rhkb.cn/news/447288.html

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

相关文章

讲一讲Redis五大数据类型的底层实现

讲一讲Redis五大数据类型的底层实现 Redis五大数据类型的底层实现 Redis的五大数据类型分别是字符串&#xff08;String&#xff09;、列表&#xff08;List&#xff09;、哈希&#xff08;Hash&#xff09;、集合&#xff08;Set&#xff09;和有序集合&#xff08;Zset&…

中药药材推荐系统

毕业设计还在发愁选题&#xff1f;又想实用又怕复杂&#xff1f;那这篇介绍你一定感兴趣&#xff01; 今天为大家推荐一个基于Django框架开发的中药药材推荐系统&#xff0c;简洁易用&#xff0c;功能丰富&#xff0c;非常适合毕业设计。无论你是技术经验丰富的开发人员&#…

Jmeter监控服务器性能

目录 ServerAgent 安装 打开Jmeter ServerAgent 在Jmeter上监控服务器的性能比如CPU&#xff0c;内存等我们需要用到ServerAgent&#xff0c;这里可以下载我分享 ServerAgent-2.2.3.zip 链接: https://pan.baidu.com/s/1oZKsJGnrZx3iyt15DP1IYA?pwdedhs 提取码: edhs 安装…

【4.8】图搜索算法-BFS解单词接龙

一、题目 给 定 两 个 单 词 &#xff08; beginWord 和 endWord &#xff09; 和 一 个 字 典 &#xff0c; 找 到 从 beginWord 到 endWord 的最短转换序列的长度。转换需遵循如下规则&#xff1a; 1. 每次转换只能改变一个字母。 2. 转换过程中的中间单词必须是字…

JavaScript 网页设计案例:使用 Canvas 实现趣味打气球小游戏

JavaScript 网页设计案例&#xff1a;使用 Canvas 实现趣味打气球小游戏 在网页设计中&#xff0c;交互性和趣味性是吸引用户的重要因素。借助 JavaScript 和 HTML5 的 canvas 元素&#xff0c;我们可以轻松实现各种动画效果&#xff0c;今天将带你打造一个有趣的 打气球小游戏…

【银行科技岗】相关考试知识点总结及部分考题

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 一、**网络与安全**二、**软件开发与设计**三、**数据库与数据管理**四、**编程与系统**五、**计算机硬件与性能**六、**大数据与人工智能**七、**系统与应用**相关…

dfs +剪枝sudoku———poj2676

目录 前言 lowbit函数 数独 suduku 问题描述 输入 输出 问题分析 子网格位置 优化搜索顺序剪枝1 优化搜索顺序剪枝2 可行性剪枝 代码 前言 lowbit函数 这是一个利用二进制位运算取出二进制数最后一位’1‘的函数 数独 数独大家肯定都玩过&#xff0c;…

<<迷雾>> 第11章 全自动加法计算机(7)--部分自动化加法 示例电路

部分实现了自动化的连续加法电路. info::操作说明 增加了译码器模块, 把从内存中取数的步骤和装载/相加的步骤综合起来, 总共五步骤 存储器中已经提前预存了 5 个数. 如果地址计数器 AC 还没有清零, 则需要先清零. 闭合 K装载 开关, 断开 K相加 开关 将开关 K 连续按 5 次, 第…

SpringMVC后台控制端校验-表单验证深度分析与实战优化

前言 在实战开发中&#xff0c;数据校验也是十分重要的环节之一&#xff0c;数据校验大体分为三部分&#xff1a; 前端校验后端校验数据库校验 本文讲解如何在后端控制端进行表单校验的工作 案例实现 在进行项目开发的时候,前端(jquery-validate),后端,数据库都要进行相关的数据…

Java多线程面试题

一.Java多线程基础 1.进程和线程的区别 程序是由指令和数据组成&#xff0c;但这些指令要运行&#xff0c;数据要读写&#xff0c;就必须将指令加载至 CPU中&#xff0c;数据加载至内存。在指令运行过程中还需要用到磁盘、网络等设备。进程就是用来加载指令、管理内存、管理 I…

【C语言】动态内存管理及相关笔试题

文章目录 一、为什么有动态内存分配二、malloc和free1.malloc函数的使用2.free函数的使用 三、calloc和realloc1.calloc函数的使用2.realloc函数的使用 四、常见动态内存分配的错误五、动态内存经典笔试题题1题2题3 六、总结C/C中程序内存区域划分 一、为什么有动态内存分配 我…

【C语言刷力扣】2206.将数组划分成相等数对

题目&#xff1a; 解题思路&#xff1a; 题目中要求元素成数对出现&#xff0c;即每个元素出现偶数次。用哈希表存放每个数出现的次数&#xff0c;再循环查看每个数的次数是否位偶数。 typedef struct {int key;int count;UT_hash_handle hh; } hashEntry;bool divideArray(int…

数据库实验3视图

10-1 创建视图计算学生课程平均分 现有一个学生数据库&#xff0c;内包含学生表&#xff08;Student&#xff09;、课程表&#xff08;Course&#xff09;和选修表&#xff08;SC&#xff09;。 在每一学年&#xff0c;学生处需要统计每位学生的学习情况&#xff0c;以便进行…

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

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

layui table 自定义表头

自定义表头-查询 js/css静态文件引用 <!-- 引入 layui.css --> <link href"//unpkg.com/layui2.9.16/dist/css/layui.css" rel"stylesheet"> <!-- 引入 layui.js --> <script src"//unpkg.com/layui2.9.16/dist/layui.js"…

算法 动态规划

更多文章&#xff1a;https://www.pandaer.space 动态规划 算法很简单&#xff01;今天我们来聊聊动态规划&#xff0c;我们先从动态规划怎么来的讲起&#xff0c;然后聊聊动态规划应该如何学&#xff1f;最后正式开始动态规划的学习之旅。 动态规划怎么就出现了呢&#xff…

串扰的耦合长度与串扰的关系

一、 名词解释 串扰&#xff1a;简单理解为两条或者多条信号线产生的耦合现象 攻击传输线&#xff08;侵略线&#xff09;&#xff1a;对其他线产生影响的线 受害传输线&#xff1a;被影响的线 串扰产生的原因&#xff0c;简单来说就是当线与线之间平行布线时&#xff0c;两…

2d实时数字人聊天语音对话使用案例,对接大模型

参看: https://github.com/wan-h/awesome-digital-human-live2d 电脑环境: ubuntu 1060ti 下载: git clone https://github.com/wan-h/awesome-digital-human-live2d.gitdocker部署; cd awesome-digital-human-live2d docker-compose -f docker-compose-quickStart.ya…

基于springboot的网页时装购物系统(含源码)

随着科学技术的飞速发展&#xff0c;社会的方方面面、各行各业都在努力与现代的先进技术接轨&#xff0c;通过科技手段来提高自身的优势&#xff0c;时装购物系统当然也不能排除在外。时装购物系统是以实际运用为开发背景&#xff0c;运用软件工程原理和开发方法&#xff0c;采…

Excel:vba实现禁止新增工作表

实现效果&#xff1a;禁止新增工作表 步骤如下&#xff1a; 1.点击开发工具里面的Visual Basic 2.不要自己创建&#xff0c;点击ThisWorkbook&#xff0c;点击选择Workbook&#xff0c;点击选择NewSheet 这里的NewSheet就是工作簿事件 代码如下&#xff1a; 这是事件处理程序…