STM32通信协议-I2C
目录
一,IC2的协议规则
I2C总线是PHILIPS公司开发的两线式串行总线,I2C总线主要解决了单片机一对多通信的问题
两根通信线:SCL,SDA,同步,半双工通信,支持数据应答机制,支持总线挂载多设备。
好处:相比于USART通信,大大地节约了单片机宝贵的I/O资源,降低了PCB的布线成本
不同通信规则的衍生以及他们各自的应用场景
最先接触的USART串口通信,简单方便,但是它也有一定的缺点
- 不能远距离传输,衍生出RS232
- 通信速度慢,衍生出SPI
- 不能一对多通信,衍生出I2C
单片机怎样实现读取外挂寄存器模块?
程序完成之后,可以根据MPU6050的参考手册依据寄存器是否可读/写测试
如果外设对应的寄存器比较多,可以另起一个'.h'的头文件,用来存储寄存器的宏
你别说,学着还怪有意思
某一时刻有两个设备同时发送信号怎么办?
开漏输出“线与”的特性。
IC2的硬件电路规定
对于一个通信协议,必须在硬件和软件上都作出规定。硬件上的规定,根据通信协议的特点,研究电路应该怎样连接,端口的输入输出应该怎样配置,里面包含电路知识,我实在听得头大,有机会详细整理。
所有I2C设备的SCL和SDL连接一起
所有设备的SCL和SDL均要配置成开漏输出模式(电路知识),如果都配置成开漏输出模式,引脚的内部结构都是图2 ,只有下方的N-MOS管工作。输出0时MOS管打开时输出低电平;输出1时MOS管关闭时处于浮空状态,因此需要在SCL和SDL各添加一个上拉电阻,阻值一般在4.7k欧左右。
开漏输出加上拉电阻兼具输入和输出的功能。避免了引脚的频繁切换
所谓SDA的控制权就是如果主机使总线输出低电平,便是主机拥有控制权,如果从机使总线输出低电平,便是从机拥有SDA控制权。
void MyI2C_Init()
{RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);GPIO_InitTypeDef GPIO_InitStructure;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_OD;GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10 | GPIO_Pin_11;GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;GPIO_Init(GPIOB, &GPIO_InitStructure);GPIO_SetBits(GPIOB,GPIO_Pin_10 | GPIO_Pin_11);
}
图2
I2C的软件上的规定
传输数据的时序应该怎样规定,怎样传输一个字节,一个完整的时序包括哪些
1.起始信号
当从机捕获到SCL高电平、SDA下降沿这个时刻时,会自身复位,等待主机召唤,之后主机将SCL拉低,起始信号之后,SCL与SDA都是低电平。这时候SCL开始产生时钟信号,SDA开始被写入数据
//拉高或拉低SCL
void MyI2C_W_SCL(uint8_t BitValue)
{GPIO_WriteBit(GPIOB,GPIO_Pin_10,(BitAction)BietValue);//延时的目的保证防止芯片频率过快MPU6050能够及时检测Delay_us(10);
}void MyI2C_W_SDA(uint8_t BitValue)
{GPIO_WriteBit(GPIOB,GPIO_Pin_11,(BitAction)BitValue);Delay_us(10);
}//读取SDA上的数据
uint8_t MyI2C_R_SDA(void)
{uint8_t BitValue;BitValue=GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_11);Delay_us(10); return BitValue;}//起始信号
void MyI2C_Start()
{MyI2C_W_SCL(1);MyI2C_R_SDA(1);MyI2C_W_SDA(0);MyI2C_W_SCL(0);}
2.终止信号
当发送完最后一个字节接收应答后,主机会将SCL拉低再拉高,之后主机也会将SDA拉低再拉高
void MyI2C_Stop()
{MyI2C_W_SDA(0);MyI2C_W_SCL(1);MyI2C_W_SDA(1)}
3.主机发送一个字节
在SCL低电平期间,如果主机想发送0(高位先行),拉低SDA,否则反之,从机在SCL高电平期间读取,一低一高循环8次,即可发送一个字节,发送完后SCL处于低电平,并且在下一个时钟接受应答位
void MyI2C_SendByte(uint8_t Byte)
{uint8_t i=0;for(i=0;i<8;i++){MyI2C_R_SDA(Byte & (0x80 >> i));//SCL函数里有缓冲时间,博主说,没有缓冲时间,MPU6050也能反应过来MyI2C_W_SCL(1);MyI2C_W_SCL(0);}
}
4.主机接收一个字节
在SCL低电平期间,如果从机想发送0(高位先行),拉低SDA,否则反之,主机在SCL高电平期间读取,一低一高循环8次,即可接收一个字节。主机接收之前,输出1,表示将SDA的控制权让给从机。并且接受应答位之后是低电平,不需要再次拉低SCL
如果没接收到正确的应答位会怎样?
uint8_t MyI2C_ReceiveByte()
{uint8_t Byte=0x00;uint8_t i=0;//主机将SDA的控制权给从机MyI2C_W_SDA(1);for(i = 0; i < 8; i ++){MyI2C_W_SCL(1);if(MyI2C_R_SDA() == 1) {Byte |= (0x80 >> i);} //其他位默认为0MyI2C_W_SCL(0);}return Byte;
}
5.发送应答 接收应答
接收应答:主机在发送一个字节之后,在下一个时钟接收一个数据,判断从机是否应答,
数据0表示应答,数据1,表示非应答。在这之前,主机需要将SDA的控制权给从机,
//发送应答
void MyI2C_SendACK(uint8_t ACK)
{MyI2C_R_SDA(ACK);MyI2C_W_SCL(1);MyI2C_W_SCL(0);}//接收应答
uint8_t MyI2C_ReceiveACK()
{uint8_t Ack=0;//将SDA的控制权给从机MyI2C_W_SDA(1);MyI2C_W_SCL(1);Ack=MyI2C_R_SDA();MyI2C_W_SCL(0);return Ack;
}
二,完整时序
指定地址写的完整时序
指定地址读的完整时序
一旦读写标志位为1,下一个字节立马转为读的时序,来不及寄存器指定,所以读取的便是当前地址指针指向的地址,所以完整时序如下:指定地址写+当前地址读的复合格式。
啃不下去了,休战2024-6-12 16:33,下次继续
//指定地址读完整时序
void MPU6050_WriteReg(uint8_t RegAddress,uint8_t Data)
{MyI2C_Start();MyI2C_SendByte(MPU6050_ADDRESS);MyI2C_ReceiveACK();MyI2C_SendByte(RegAddress);MyI2C_ReceiveACK();MyI2C_SendByte(Data);MyI2C_ReceiveACK();MyI2C_Stop();}//指定地址读完整时序
uint8_t MPU6050_ReadReg(uint8_t RegAddress)
{uint8_t Byte;MyI2C_Start();MyI2C_SendByte(MPU6050_ADDRESS);MyI2C_ReceiveACK();MyI2C_SendByte(RegAddress);MyI2C_ReceiveACK();MyI2C_Start();MyI2C_SendByte(MPU6050_ADDRESS | 0x01);MyI2C_ReceiveACK();Byte=MyI2C_ReceiveByte();MyI2C_SendACK(1); //表示不希望对方发送数据MyI2C_Stop();return Byte;}
二,介绍STM32的I2C外设
使用硬件的方式实现I2C通信
STM32内部集成了硬件I2C收发电路,可以由硬件自动执行时钟生成、起始终止条件生成、应答收发、数据收发等功能,减轻CPU的负担。GPIO端口输入输出信号都来自I2C,所以端口需要配置成复用开漏输出模式。
相关文章:
STM32通信协议-I2C
目录 一,IC2的协议规则 I2C总线是PHILIPS公司开发的两线式串行总线,I2C总线主要解决了单片机一对多通信的问题 两根通信线:SCL,SDA,同步,半双工通信,支持数据应答机制,支持总线挂载多设备。 …...
廉颇老矣尚能饭否,实践甘肃数据挖掘挑战赛作物与杂草的智能识别,基于YOLOv3全系列【tiny/l/spp】参数模型开发构建田间低头作物杂草智能化检测识别模型
一、背景 田间杂草的有效管理是现代农业生产中面临的重要挑战之一。杂草不仅竞争作物的养分、 水分和阳光,还可能成为害虫和病原体的寄主,从而降低农作物的产量和品质。因此,开发 高效、精确的杂草检测和管理系统对于提高农业生产效率、降低化…...
基于Django+Python的宾馆管理系统设计与实现
项目运行 需要先安装Python的相关依赖:pymysql,Django3.2.8,pillow 使用pip install 安装 第一步:创建数据库 第二步:执行SQL语句,.sql文件,运行该文件中的SQL语句 第三步:修改源…...
MySQL--mysql的安装
1.Linux上mysql的安装: Ubuntu下: (1)安装前首先切换到管理员身份:sudo su (2)然后执行命令:apt install mysql-server (注意:装的是服务器端,客户端自动就安装了) (3)执行过程中按y; 2.Mysql初始化配置 注意,一定是sudo su,必须是管理员才能进行Mysql的初始化设置; 初始化…...
qt 构建、执行qmake、运行、重新构建、清除
qt右键功能有 构建、执行qmake、运行、重新构建、清除,下面简单介绍一下各个模块的作用。 1. 执行qmake qmake是一个工具, 它根据pro文件生成makefile文件,而makefile文件中则定义编译与连接的规则。pro文件中定义了头文件,源文件…...
微软发布 Win11 22H2/23H2 十月可选更新KB5044380!
系统之家于10月23日发出最新报道,微软针对Win11 22H2和23H2用户,发布了10月可选更新KB5044380,用户安装后版本号升至22621.4391和22631.4391。本次更新开始推出屏幕键盘的新游戏板键盘布局,支持用户使用Xbox控制器在屏幕上移动和键…...
TensorFlow面试整理-TensorFlow 基础概念
在学习和准备 TensorFlow 时,了解基础概念是至关重要的。以下是 TensorFlow 的一些核心基础概念: 1. Tensor (张量) ● 定义:张量是 TensorFlow 中的核心数据结构。它是一个多维数组,可以表示标量、向量、矩阵以及更高维的数组。张量在数学上与矩阵非常相似,但可以具有任意…...
Java实现HTTP代理的技巧与方法
在互联网时代,代理IP已经成为了网络访问中不可或缺的一部分。无论是为了保护隐私,还是为了访问特定的网络资源,代理IP都能发挥重要作用。那么,如何在Java中实现HTTP代理呢?本文将带您逐步了解这个过程。 什么是HTTP代…...
MFC图形函数学习02——绘制像素点函数
再次强调一下,我们这里学习的MFC图形函数,是指绘制二维图形的函数。一般来说,一个二维图形组成的基本要素是点、线、面以及相关的颜色。在本文中,将学习绘制像素点函数,与绘制像素点相关的其它基础知识也随着绘图函数学…...
Oracle CONNECT BY、PRIOR和START WITH关键字详解
Oracle CONNECT BY、PRIOR和START WITH关键字详解 1. 基本概念2. 数据示例3. SQL示例3.1. 查询所有员工及其上级3.2. 显示层次结构3.3. 查询特定员工的子级 4. 结论 在Oracle数据库中,CONNECT BY、PRIOR和START WITH关键字主要用于处理层次结构数据,例如…...
gateway 整合 spring security oauth2
微服务分布式认证授权方案 在分布式授权系统中,授权服务要独立成一个模块做统一授权,无论客户端是浏览器,app或者第三方,都会在授权服务中获取权限,并通过网关访问资源 OAuth2的四种授权模式 授权码模式 授权服务器将授…...
Unity3D学习FPS游戏(1)获取素材、快速了解三维模型素材(骨骼、网格、动画、Avatar、材质贴图)
前言:最近重拾Unity,准备做个3D的FPS小游戏,这里以官方FPS案例素材作为切入。 导入素材和素材理解 安装Unity新建项目新建文件夹和Scene如何去理解三维模型素材找到模型素材素材预制体结构骨骼和网格材质(Material)、…...
Eclipse Java 构建路径
Eclipse Java 构建路径 Eclipse 是一款广受欢迎的集成开发环境(IDE),特别适用于 Java 开发。在 Eclipse 中,构建路径(Build Path)是指编译器在编译项目时搜索类(.class)文件和源代码(.java)文件的路径。正确设置构建路径对于确保项目能够顺利编译和运行至关重要。 …...
FileLink跨网文件摆渡系统:重构跨网文件传输新时代
在数字化浪潮的推动下,企业对于数据的高效利用和安全管理提出了前所未有的要求。面对不同网络环境间的文件传输难题,传统方法往往显得力不从心,不仅效率低下,还存在极大的安全隐患。而FileLink跨网文件摆渡系统的出现,…...
macOS下QuickTime player+Blackhole录视频只录制系统声音
Blackhole是一个虚拟的音频驱动程序,免费的 安装方法: 方法1:通过homebrew安装 前提:你的系统中自己安装了homebrew,没有安装用方法2 系统终端执行下面的命令中的一个: brew install blackhole-2ch 或…...
Vscode + EIDE +CortexDebug 调试Stm32(记录)
{// 使用 IntelliSense 了解相关属性。 // 悬停以查看现有属性的描述。// 欲了解更多信息,请访问: https://go.microsoft.com/fwlink/?linkid830387"version": "0.2.0","configurations": [{"cwd": "${workspaceRoot…...
qt QApplication详解
一、概述 QApplication是Qt应用程序的基础类,负责设置和管理应用的环境。它的主要功能包括:初始化应用程序、管理事件循环、处理命令行参数、提供全局设置(如样式和调色板)以及创建和管理主窗口。通常在main函数中创建QApplicati…...
C++ 图像处理框架
在 C 中,有许多优秀的图像处理框架可以用来进行图像操作、计算机视觉、图像滤波等任务。以下是一些常用的 C 图像处理框架,每个框架都有其独特的特性和适用场景: 1. OpenCV OpenCV(Open Source Computer Vision Library…...
基于知识图谱的美食推荐系统
想象一下,每次打开应用,它都能为你量身推荐最符合你口味的美食,不需要再为“今天吃什么?”烦恼。这听起来是不是非常吸引人?今天就给大家介绍一个适合做毕业设计的创新项目——基于知识图谱的美食推荐系统!…...
记录:网鼎杯2024赛前热身WEB01
目录扫描,发现上传点,判断可能存在文件上传漏洞,并根据文件后缀判断网站开发语言为php 编写蚁剑一句话木马直接上传 蚁剑连接 这里生成 的flag是随机的,因为烽火台反作弊会随机生成环境,在一顿查找后,在hom…...
java 提示 避免用Apache Beanutils进行属性的copy。
避免用Apache Beanutils进行属性的copy。 Inspection info: 避免用Apache Beanutils进行属性的copy。 说明:Apache BeanUtils性能较差,可以使用其他方案比如Spring BeanUtils, Cglib BeanCopier。 TestObject a new TestObject(); TestObject b new Te…...
autMan框架对接Kook机器人
一、创建kook机器人 KOOK 二、获取机器人token 三、填写autMan参数并重启 四、将机器人加入服务器 五、效果图 回复...
RK3568平台(camera篇)UVC AICamera集成
一.客供AIcamera集成思路 主板端:目前在RK主板上预留了一个USB接口,使用USB接口来连接供应商提供的UVC摄像头。 供应商UVC摄像头:目前供应商提供的usbcamera是rv1126,基于usb接口跟主板端相连接。 其实使用供应商提供的camera,里面的大部分功能供应商已经是做好的,里面…...
【mod分享】极品飞车10魔改模组,全新UI,全新道路,全新建筑,高清植被,全新的道路围栏,全新的天空,体验另一种速度与激情
各位好,今天小编给大家带来一款新的高清重置魔改MOD,本次高清重置的游戏叫《极品飞车10卡本峡谷》。 《极品飞车10:卡本峡谷》该游戏可选择四个模式:生涯、快速比赛、挑战赛、多人连线游戏模式(已不可用)&…...
[实时计算flink]数据摄入YAML作业快速入门
实时计算Flink版基于Flink CDC,通过开发YAML作业的方式有效地实现了将数据从源端同步到目标端的数据摄入工作。本文介绍如何快速构建一个YAML作业将MySQL库中的所有数据同步到StarRocks中。 前提条件 已创建Flink工作空间,详情请参见开通实时计算Flink版…...
CMOS 图像传感器:像素寻址与信号处理
CMOS image sensor : pixel addressing and signal processing CMOS image sensor 对于寻址和信号处理有三种架构 pixel serial readout and processingcolumn parallel readout and processingpixel parallel readout and processing 其中,图 (b) column paralle…...
React Native 项目使用Expo模拟器运行iOS和Android
iOS没有连接设备: 确保你已经用 USB 线将你的 iOS 设备连接到了你的 Mac。 设备未信任: 如果你的设备是第一次连接到 Mac,可能需要在设备上信任这台计算机。通常,当你连接设备时,设备上会弹出一个对话框,…...
鸿蒙-键盘弹出时 promptAction.showToast 被遮盖
可以设置弹窗显示模式showMode,支持显示在应用之上。 参考代码: promptAction.showToast({ message: Message Info, duration: 2000, showMode: promptAction.ToastShowMode.TOP_MOST }); 文档中心...
十一、pico+Unity交互开发教程——手指触控交互(Poke Interaction)
一、XR Poke Interactor 交互包括发起交互的对象(Interactor)和可被交互的对象(Interactable)。XR Interaction Toolkit提供了XR Poke Interactor脚本用于实现Poke功能。在LeftHand Controller和RightHand Controller物体下创建名…...
Request2:Post请求和Json
百度翻译拿到自己想看的数据,下图查看请求到数据的请求 preview提前看下 取出对应的RequestUrl ,看出来要使用的话得用post请求 #!/usr/bin/env python # -*- coding:utf-8 -*- import requests import json if __name__ "__main__":#1.指定…...
南阳网站建设aokuo/企业网络营销
1.案例一:在末尾添加节点 1.1 步骤 (1)获取到ul标签 (2)创建li标签,createElement (3)创建文本标签,createElement (4)将文本添加到li下面&…...
建标网/线上seo关键词优化软件工具
在现实问题中我们对于一个实验往往会重复成千上万次,那么我们就需要关注在实验次数趋于无穷之后,整个实验的期望会趋于怎样一个结果。其实这一章“极限定理”都是在处理这个问题。 强大数定理: 这里的证明过程给出了一些前提条件,…...
义乌做网站的公司哪家好/seo顾问合同
Centos基础优化一、给系统添加普通账户在生产环境当中root账户是不允许被使用的,所以我们需要给系统增加一些普通账户来进行日常维护操作使用。增加账户命令如下:[rootlocalhost ~]# useradd jerry[rootlocalhost ~]# passwd jerryChanging password for…...
番禺网站建设专家/百度平台
今天面试,被考一道循环移位的算法问题:有一数组,N个元素,循环移动K个元素,要求算法时间复杂度为O(N)。 当时,还真被难住了。回来后,查查资料,才发现,这真是个操蛋的题啊。…...
武汉网站seo德升/关键词歌词简谱
Hi,各位同学好!我是吴明课堂的答疑老师之一陈婉。祝大家新年快乐! 今天我给大家分享的主题是在access窗体中如何为列表控件自定义右键菜单。 效果演示动图: 组成结构解析: 一张员工表—数据取自吴明老师《Access…...
怎么查看一个网站的后台/武汉服装seo整站优化方案
树的建立 前提的知识: 前序 : 先访问根节点,再访问左子树,最后访问右子树中序 : 先访问左子树,先访问根节点,最后访问右子树后序 : 先访问左子树,再访问右子树…...