STM32通信协议-I2C

目录


一,IC2的协议规则

I2C总线是PHILIPS公司开发的两线式串行总线,I2C总线主要解决了单片机一对多通信的问题

两根通信线:SCL,SDA,同步,半双工通信,支持数据应答机制,支持总线挂载多设备。

好处:相比于USART通信,大大地节约了单片机宝贵的I/O资源,降低了PCB的布线成本

不同通信规则的衍生以及他们各自的应用场景

最先接触的USART串口通信,简单方便,但是它也有一定的缺点

  1. 不能远距离传输,衍生出RS232
  2. 通信速度慢,衍生出SPI
  3. 不能一对多通信,衍生出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);}  //其他位默认为0
		MyI2C_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,所以端口需要配置成复用开漏输出模式。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

2024ideaUI切换和svn与git的切换,svn的安装和配置,idea集成svn ,2024-10-18日

2024-10-18日 2024的UI实在很不舒服&#xff0c;隐藏了很多按键&#xff1b; 第一步&#xff1a; 视图 -》 外观 -》 工具栏选出来&#xff1b; 结果出来&#xff1a; 运行的按键和设置的按钮 第二步 点击设置的按钮&#xff0c;选择最后一个&#xff0c;重启就行 结果 舒服&…

网站漏扫:守护网络安全的关键防线

网站漏洞扫描&#xff0c;简称漏扫&#xff0c;是一种针对网站进行漏洞检测的安全服务。网站漏洞扫描在网络安全中占据着至关重要的地位。 网站漏扫在及时发现和修复漏洞方面发挥着关键作用 通过对网站和系统的全面扫描&#xff0c;能够快速识别出各种潜在的漏洞&#xff0c;…

网络安全领域推荐证书介绍及备考指南

在网络安全领域&#xff0c;拥有专业认证不仅可以证明个人的专业能力&#xff0c;还能帮助在实际工作中应用先进的技术和知识。以下是几种热门的网络安全证书介绍及备考指南。 1. OSCP (Offensive Security Certified Professional) 证书简介 OSCP是针对渗透测试领域的入门级…

<项目代码>YOLOv8路面垃圾识别<目标检测>

YOLOv8是一种单阶段&#xff08;one-stage&#xff09;检测算法&#xff0c;它将目标检测问题转化为一个回归问题&#xff0c;能够在一次前向传播过程中同时完成目标的分类和定位任务。相较于两阶段检测算法&#xff08;如Faster R-CNN&#xff09;&#xff0c;YOLOv8具有更高的…

实现简道云与企业微信的自动化数据集成

简道云入职新增企微成员西乡公司 在企业信息化管理中&#xff0c;数据的高效集成和实时同步是提升业务效率的重要环节。本文将分享一个具体的系统对接集成案例&#xff1a;如何通过轻易云数据集成平台&#xff0c;将简道云的数据无缝集成到企业微信&#xff0c;实现西乡公司新…

汽车免拆诊断案例 | 2023款零跑C01纯电车后备厢盖无法电动打开和关闭

故障现象  一辆2023款零跑C01纯电车&#xff0c;累计行驶里程约为2万km&#xff0c;车主进厂反映&#xff0c;后备厢盖无法电动打开和关闭。 故障诊断  接车后试车&#xff0c;操作后备厢盖外侧、驾驶人侧及遥控钥匙上的后备厢盖开启按钮&#xff0c;可以听到后备厢盖解锁的…

Golang | Leetcode Golang题解之第500题键盘行

题目&#xff1a; 题解&#xff1a; func findWords(words []string) (ans []string) {const rowIdx "12210111011122000010020202" next:for _, word : range words {idx : rowIdx[unicode.ToLower(rune(word[0]))-a]for _, ch : range word[1:] {if rowIdx[unico…

精益思维在新能源汽车研发中的应用体现

近年来&#xff0c;新能源汽车作为绿色出行的重要载体&#xff0c;其研发与生产模式正经历着深刻的变革。精益思维&#xff0c;这一源自制造业的管理理念&#xff0c;正逐步渗透并深刻影响着新能源汽车的研发过程&#xff0c;不仅提升了产品质量与生产效率&#xff0c;还促进了…

C++ -stack、queue

博客主页&#xff1a;【夜泉_ly】 本文专栏&#xff1a;【C】 欢迎点赞&#x1f44d;收藏⭐关注❤️ 文章目录 &#x1f4a1; 简介1. 栈2. 队列3. 容器适配器的特点4. 适配器的本质5. 小结 &#x1f4a1; 简单实现1. 栈的实现2. 队列的实现 &#x1f4a1; 简单使用1. 用队列实现…

什么是机器人流量?如何识别和预防有害机器人流量?

机器人流量是指由自动软件程序&#xff08;或机器人&#xff09;而非人类用户生成的互联网流量。机器人可以执行各种任务&#xff0c;包括有益的和恶意的&#xff0c;而且速度比人类快得多。 据估计&#xff0c;大约 30% 的互联网流量来自旨在窃取内容、破坏服务和开展其他恶意…

手机柔性屏全贴合视觉应用

在高科技日新月异的今天&#xff0c;手机柔性显示屏作为智能手机市场的新宠&#xff0c;以其独特的可弯曲、轻薄及高耐用性特性引领着行业潮流。然而&#xff0c;在利用贴合机加工这些先进显示屏的过程中&#xff0c;仍面临着诸多技术挑战。其中&#xff0c;高精度对位、应力控…

stm32的f103---esp8266模块(一)

1 esp8266作为设备  &#xff45;&#xff53;&#xff50;&#xff0d;&#xff10;&#xff11;&#xff53; 1.1入网设置 设置工作模式 AT_CWMODE1 //1. 是station&#xff08;设备&#xff09;模式2.是AP&#xff08;路由器&#xff09;模式3.是双模 OK 以设备模式接入…

[手机Linux PostmarketOS]七, Linux使用selenium爬虫

一&#xff0c;selenium安装 # 用pip 安装 selenium pip3 install selenium --break-system-packages 二&#xff0c;安装浏览器Chrome Alpine Linux 环境中没有google Chrome&#xff0c; 使用 Chromium 浏览器作为 Chrome 的替代品&#xff0c;Chromium 是 Chrome 的开源版本…

Java:抽象类和接口

一.抽象类 1.抽象类概念和语法 ⨀概念&#xff1a; 在面向对象的概念中&#xff0c;所有的对象都是通过类来描绘的&#xff0c;但是并不是所有的类都是用来描绘对象的&#xff0c;如果一个类中没有包含足够的信息来描绘一个具体的对象&#xff0c;这样的类就是抽象类。 ⨀语…

stm32F103 实现呼吸灯效果

目录 硬件连接 软件实现步骤 初始化系统时钟。 配置 GPIO 引脚。 配置定时器以生成 PWM 信号。 在主循环中调整 PWM 占空比以实现呼吸效果。 示例代码 1. 初始化系统时钟 2. 配置 GPIO 引脚 3. 配置定时器以生成 PWM 信号 4. 在主循环中调整 PWM 占空比以实现呼吸效…

python基础综合案例(数据可视化—折线图可视化)

可视化案例的学习目标&#xff1a; 通过案例&#xff0c;回忆巩固python基础的语法 锻炼编程能力&#xff0c;熟练语法的使用 1.json数据格式 两种不同的语言由于数据格式不同&#xff0c;所以没有办法直接沟通&#xff0c;就比如我们可以将python 的数据格式转成json&…

股票的一些术语

杠杆倍数 当你有1万港元&#xff0c;并且融资比例是1:9时&#xff0c;这意味着你可以用1万港元的保证金借入额外的9万港元。这样一来&#xff0c;你总共可以支配10万港元&#xff08;1万港元本金 9万港元借款&#xff09;来投资。 在这种情况下&#xff0c;杠杆倍数是这样计…

无人机之自主飞行关键技术篇

无人机自主飞行指的是无人机利用先进的算法和传感器&#xff0c;实现自我导航、路径规划、环境感知和自动避障等能力。这种飞行模式大大提升了无人机的智能化水平和操作的自动化程度。 一、传感器技术 传感器是无人机实现自主飞行和数据采集的关键组件&#xff0c;主要包括&a…

AndroidStudio部署多渠道打包环境(一)

对于游戏来说&#xff0c;需要上架国内很多家应用商店&#xff0c;还有一些小的渠道SDK&#xff0c;大大小小加起来也有几十家了&#xff0c;那么我们部署了多渠道打包环境之后就很方便了。 一 、配置游戏基本参数&#xff1a;在app下面的build.gradle文件里编辑&#xff0c; …

java实现类似C++的union

目录 1.引言 2.实际案例 3.java实现 1.引言 在C中有一种用户自定义数据类型叫联合体union&#xff0c;它允许你在相同的内存位置存储不同的数据类型。与结构体&#xff08;struct&#xff09;不同&#xff0c;结构体中的所有成员都占用各自的内存空间&#xff0c;而 union 的…