STM32-----I2C

news/2024/10/15 9:03:34/

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.ppmy.cn/news/1539362.html

相关文章

ceph基础

ceph基础搭建 存储基础 传统的存储类型: DAS设备:SAS,SATA,SCSI,IDW,USB 无论是那种接口,都是存储设备驱动下的磁盘设备,而磁盘设备其实就是一种存储是直接接入到主板总线上去的。直连存储。 NAS设备:NFS CIFS FTP 几乎所有的网络存储设备基本上都是以文件系统样式进行使…

科研绘图系列:R语言绘制中国地理地图

文章目录 介绍加载R包导入数据图a图b图c图d系统信息介绍 文章提供了绘制图a,图b和图d的数据和代码。该图展示了不同省份的物种分布情况。 加载R包 library(geojsonsf) library(sf) library(ggplot2) library(RColorBrewer) library(ggspatial) library(</

“DataOps+大模型”——数造科技在大模型时代的数据开发创新探索

写在前面 自《“数据要素x”三年行动计划》印发以来&#xff0c;各界积极投身于探索数据开发的新技术、新应用场景和新模式&#xff0c;力求通过挖掘数据要素的价值来推动新型生产力的蓬勃发展。在这个过程中&#xff0c;以大模型为核心的人工智能技术为数据开发工作带来了全新…

Android Studio简易项目|随机选择器(类似转盘)

一、背景 为了强化对flowlayout流式布局的理解和简易安卓项目架构结构的理解&#xff0c;写一个小项目&#xff0c;随机选择器&#xff0c;控制可见等 二、项目代码 2.1流式布局 <?xml version"1.0" encoding"utf-8"?> <LinearLayout xmlns…

技术成神之路:设计模式(二十)装饰模式

介绍 装饰模式&#xff08;Decorator Pattern&#xff09;是一种结构型设计模式&#xff0c;它允许在不改变对象自身的情况下&#xff0c;动态地为对象添加额外的职责。这个模式通常用于增强或改变对象的功能。 1.定义 装饰模式通过创建一个装饰类&#xff0c;将功能动态地添加…

深入解析TCP/IP协议:网络通信的基石

1. 引言 TCP/IP 协议是现代计算机网络的核心&#xff0c;它为互联网上的设备提供了通信的基础。在网络通信中&#xff0c;TCP/IP 协议栈是无处不在的&#xff0c;无论是个人设备的浏览器请求&#xff0c;还是大型分布式系统的内部通信&#xff0c;都依赖于它的稳定、高效与可靠…

电子电气架构---软件定义汽车,产业变革

我是穿拖鞋的汉子&#xff0c;魔都中坚持长期主义的汽车电子工程师。 老规矩&#xff0c;分享一段喜欢的文字&#xff0c;避免自己成为高知识低文化的工程师&#xff1a; 屏蔽力是信息过载时代一个人的特殊竞争力&#xff0c;任何消耗你的人和事&#xff0c;多看一眼都是你的不…

理解和解决TCP 网络编程中的粘包与拆包问题

1. 什么是TCP网络编程中的粘包和拆包现象&#xff1f; 在TCP网络编程中&#xff0c;粘包和拆包问题是常见的现象&#xff0c;通常会导致数据传输中的错误。这些现象的发生源于TCP协议的特点。TCP是面向流的协议&#xff0c;它保证数据传输的可靠性&#xff0c;但不会像UDP那样…