STM32——关于I2C的讲解与应用

1、什么是I2C?

        I2C(Inter-Integrated Circuit)是一种通用的总线协议。它是由Philips(飞利浦)公司,现NXP(恩智浦)半导体开发的一种简单的双向两线制总线协议标准。是一种半双工的同步通信协议。

2、I2C协议标准  

      I2C协议使用两根总线线路,即时钟线(SCL)和数据线(SDA),用于在主设备和从设备之间传输数据。主设备负责生成时钟信号,并控制通信的起始和停止,从设备则负责响应主设备的指令和传输数据。

 对于I2C总线来说,支持总线挂载多设备(一主多从、多主多从),类似上面的就是一主多从。

        I2C协议支持多主设备和多从设备的连接,每个设备都有一个唯一的地址。主设备通过发送地址和数据来选择要与之通信的从设备,并可以进行读取和写入操作。I2C总线保持向下兼容性。

        I2C串行总线一般有两根信号线,一根是双向的数据线SDA,另一根是时钟线SCL。所有I2C总线设备上的串行数据SDA都接到总线的SDA上,各设备的时钟线SCL接到总线的SCL上。各设备连接到总线的输出端时必须是漏极开路(OD)输出或者集电极开路(OC)输出。

        在I2C的实际应用中,我们实际一般将软件模拟的I2C引脚定义为开漏输出(GPIO_Mode_Out_OD),将硬件模拟的I2C引脚定义为复用开漏输出( GPIO_Mode_AF_OD)

3、I2C的通信速率

  • 标准模式:100Kbps,采用7位寻址。
  • 快速模式:400Kbps,采用10位寻址。
  • 高速模式:3.4Mbps。

4、I2C总线的工作原理

        MCU与I2C芯片之间的通信,可以形象的比喻成两个人对话,因此必须遵循基本的规范;一是你说的话别人能够听懂,即双方要有约定的信号协议(通信协议);二是你的语速要能够被别人所接受,即双方满足时序要求。

5、I2C总线的信号要求

        I2C总线上可以挂多个设备,每个I2C设备都有固定的地址,只有当I2C两条线上传输的地址值等于某个I2C设备的地址时,该I2C设备才做出响应。数据传输后,必须要有应答信号(响应信号)。数据传输前必须有开始信号,传输结束后必须有结束信号。

  •  开始信号:I2C协议规定,SCL处于高电平时,SDA由高到低变化,这种信号是起始信号。当I2C总线上的设别检测到这个开始信号后,就知道该发送数据了。
  • 停止信号:I2C协议规定,SCL处于高电平,SDA由低到高变化,这种信号是停止信号。
  • 数据传输:I2C协议对数据的采样发生在SCL高电平期间,除了起始和停止信号,在数据传输期间,SCL为高电平时,SDA必须保持稳定,不允许改变,在SCL低电平时才可以进行变化。
  • 应答信号:处理器把数据发给从设备,如何知道从设备已经接收到数据呢?这就需要从设备回应一个信号给主机,因为当主机发送玩数据会后就不再驱动总线(SDA引脚由输出变为输入),而SDA和SCL硬件在设计时都有上拉电阻,所以这时SDA变为高电平。当一个字节的数据传输完成后,即在第九个SCL时钟周期内,此时主机需要释放SDA总线,把总线控制权交给从机,由于上拉电阻的作用,此时总线为高电平,如果从机正确的收到了主机发来的数据,会把SDA拉低,表示应答响应。当在第九个SCL时钟周期内,若SDA是高电平,则为无效应答,表示从机位接收到主机发送来的数据。

6、软件模拟I2C通信

首先我们设置软件I2C的引脚,将其定义为开漏输出
void Soft_I2C_Init(void)
{
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE);
	
	GPIO_InitTypeDef GPIO_InitStructure;
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_OD;
	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_11 | GPIO_Pin_12;
	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
	GPIO_Init(GPIOB,&GPIO_InitStructure);

/*这里为什么两个引脚都设置为高电平,是由于I2C总线的要求,
在使用I2C协议时,当SCL和SDA处于高电平时,此时I2C总线为空闲状态。*/
    GPIO_SetBits(GPIOB, GPIO_Pin_10 | GPIO_Pin_11);
}
在这里我们定义SCL和SDA
void Soft_I2C_W_SCL(uint8_t BitValue)
{
	GPIO_WriteBit(GPIOB, GPIO_Pin_11, (BitAction)BitValue);
	Delay_us(10);
}

void Soft_I2C_W_SDA(uint8_t BitValue)
{
	GPIO_WriteBit(GPIOB, GPIO_Pin_12, (BitAction)BitValue);
	Delay_us(10);
}
I2C协议规定,SCL处于高电平时,SDA由高到低变化,这种信号是起始信号。
当I2C总线上的设别检测到这个开始信号后,就知道该发送数据了。
void Soft_I2C_Start(void)
{
	Soft_I2C_W_SDA(1);
	Soft_I2C_W_SCL(1);
	Soft_I2C_W_SDA(0);
	Soft_I2C_W_SCL(0);
}

当I2C准备发送一个字节时,SCL在低电平期间,主机会依次将数据位放到SDA线上(高位先行)
所以在这里我们将SCL拉到低电平,更便于我们理解。

void Soft_I2C_Stop(void)
{
	Soft_I2C_W_SDA(0);
	Soft_I2C_W_SDA(1);
	Soft_I2C_W_SCL(1);
}

当SCL低电平,变换数据,高电平,保持数据稳定
void Soft_I2C_SendByte(uint8_t Byte)
{
	uint8_t i;
	for(i = 0 ;i<8;i++)
	{
		当SCL低电平时,把Byte的最高位放在SDA线上(高位先行)
		Soft_I2C_W_SDA(Byte & (0x80 >> i));
		Soft_I2C_W_SCL(1);从机将在SCL高电平期间读取数据位
		Soft_I2C_W_SCL(0);当SCL低电平时,SDA会继续取下一位的数据
	}
}

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

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

相关文章

Ubuntu内存扩容

目录 vmware设置Ubuntu设置查看 读研后发现&#xff0c;Ubuntu的使用量直线上升&#xff0c;之前给配置了20g内存&#xff0c;安装了个ros后&#xff0c;没啥内存了。本文实现给Ubuntu扩容。 vmware设置 这里 我使用别人的截图来演示。 我在这里改成了60 Ubuntu设置 sudo a…

opencv dnn模块 示例(27) 目标检测 object_detection 之 yolov11

文章目录 1、YOLO v11 介绍1.1、改进点特性1.2、性能对比1.3、多任务支持 2、测试2.1、官方Python测试2.2、Opencv dnn测试2.3、测试统计 3、训练 1、YOLO v11 介绍 YOLO11是Ultralytics实时目标探测器系列中最新的迭代版本&#xff0c;重新定义尖端的精度、速度和效率。在以往…

数据结构实验十二 图的遍历及应用

数据结构实验十二 图的遍历及应用 一、【实验目的】 1、 理解图的存储结构与基本操作&#xff1b; 2、熟悉图的深度度优先遍历和广度优先遍历算法 3、掌握图的单源最短路径算法 二、【实验内容】 1.根据下图&#xff08;图见实验11&#xff09;邻接矩阵&#xff0c;编程实…

嵌入式开发:STM32 硬件 CRC 使用

测试平台&#xff1a;STM32G474系列 STM32硬件的CRC不占用MCU的资源&#xff0c;计算速度快。由于硬件CRC需要配置一些选项&#xff0c;配置不对就会导致计算结果错误&#xff0c;导致使用上没有软件计算CRC方便。但硬件CRC更快的速度在一些有时间资源要求的场合还是非…

ACM CCS 2024现场直击:引爆通信安全新纪元

今天是 ACM CCS 2024即ACM计算机与通信安全会议举办的第四天&#xff01;本届ACM CCS在美国盐湖城召开。从10月14日开始&#xff0c;会议日程紧凑&#xff0c;内容丰富&#xff0c;每一天都充满了精彩的议程和突破性的讨论&#xff0c;为参与者带来了一场知识与灵感的盛宴。 跟…

自动化测试与敏捷开发的重要性

敏捷开发与自动化测试是现代软件开发中两个至关重要的实践&#xff0c;它们相互补充&#xff0c;共同促进了软件质量和开发效率的提升。 敏捷开发的重要性 敏捷开发是一种以人为核心、迭代、循序渐进的软件开发方法。它强调以下几个核心价值观和原则&#xff1a; 个体和交互…

如何实现MCGS与S7-200SMART PLC以太网多台通信控制?

说到MCGS与S7-200SMART PLC以太网通讯&#xff0c;都是单个单台通讯&#xff0c;如果是多台PLC该如何进行通讯呢&#xff1f;下面就带大家来实现一台MCGS触摸屏如何和两台及以上S7-200SMART PLC进行以太网通讯控制。 一、设备选型 &#xff08;1&#xff09;TPC1570GI触摸屏一…

【数据结构与算法】LeetCode每日一题

题目&#xff1a; 解答&#xff1a; 思路第一&#xff0c;什么语言不重要 1.首先&#xff0c;如果是两个正序的&#xff0c;那么我们可以直接两个链表各个位数相加&#xff0c;但是有一个问题&#xff0c;如果有个数是两位数&#xff0c;另一个位是三位数&#xff0c;那个两位…

shell脚本宝藏仓库(基础命令、正则表达式、shell基础、变量、逻辑判断、函数、数组)

一、shell概述 1.1 shell是什么 Shell是一种脚本语言 脚本&#xff1a;本质是一个文件&#xff0c;文件里面存放的是特定格式的指令&#xff0c;系统可以使用脚本解析器、翻译或解析指令并执行&#xff08;shell不需要编译&#xff09; Shell既是应用程序又是一种脚本语言&…

ES6扩展运算符

1.介绍&#xff1a; ... 扩展运算符能将数组转换为逗号分隔的参数序列&#xff1b; 扩展运算符&#xff08;spread&#xff09;也是三个点&#xff08;...&#xff09;。它好比 rest 参数的逆运算&#xff0c;将一个数组转为用逗号分隔的 参数序列&#xff0c;对数组进…

Morris算法(大数据作业)

我只能说&#xff0c;概率证明真的好难啊&#xff01;(&#xff1b;′⌒) 这也证明我的概率论真的学的很差劲&#xff0c;有时间一定要补补/(ㄒoㄒ)/~~ 算法不难证明难&#xff01; 当一个数足够大时&#xff0c;能不能用更少的空间来近似表示这个整数n&#xff0c;于是&…

用Java爬虫API,轻松获取电商商品SKU信息

在电子商务的精细化运营时代&#xff0c;SKU信息的重要性不言而喻。SKU&#xff08;Stock Keeping Unit&#xff09;信息不仅包含了商品的规格、价格、库存等关键数据&#xff0c;还直接影响到库存管理、价格策略和市场分析等多个方面。如何高效、准确地获取这些信息&#xff0…

卸载Python

1、查看安装框架位置并删除 Sudo rm -rf /Library/Developer/CommandLineTools/Library/Frameworks/Python3.framework/Versions/3.8 2、查看应用并删除 在 /Applications/Python 3.x 看是否存在&#xff0c;如果存在并删除。 3、删除软连接 ls -l /usr/bin/py* 或 ls -…

闯关leetcode——110. Balanced Binary Tree

大纲 题目地址内容 解题代码地址 题目 地址 https://leetcode.com/problems/balanced-binary-tree/description/ 内容 Given a binary tree, determine if it is height-balanced. A height-balanced binary tree is a binary tree in which the depth of the two subtrees…

系统内核分析工具

工具下载地址&#xff1a;系统内核分析工具-32位64位资源-CSDN文库

PyQt5高级界面控件一

如何查看widget类及其子类有哪些属性和函数&#xff1a; dir() from PyQt5.QtWidgets import QWidget dir(QWidget)help() from PyQt5.QtWidgets import QWidget help(QWidget)表格与树 表格与树解决的问题是如何在一个控件种有规律地呈现更多的数据。PyQt提供了两种控件类用…

初识git · 有关模型

目录 前言&#xff1a; 有关开发模型 前言&#xff1a; 其实文章更新到这里的时候&#xff0c;我们已经学习了可以满足我们日常生活中的基本需求的指令了&#xff0c;但是为什么要更新本篇文章呢&#xff1f;是因为实际生活中我们对于开发工作&#xff0c;运维工作&#xff…

RISC-V笔记——显式同步

1. 前言 RISC-V的RVWMO模型主要包含了preserved program order、load value axiom、atomicity axiom、progress axiom和I/O Ordering。今天主要记录下preserved program order(保留程序顺序)中的Explicit Synchronization(显示同步)。 2. 显示同步 显示同步指的是&#xff1a…

网络空间指纹:新型网络犯罪研判的关键路径

前言 新型网络犯罪是指利用计算机技术和互联网平台进行犯罪活动的一类犯罪行为。它涵盖了一系列使用网络和数字技术进行非法活动的行为&#xff0c;如网络钓鱼、网络诈骗、恶意软件攻击、黑客入侵、数据泄露、网络色情和社交网络犯罪等。 随着当前打击治理新型网络犯罪博弈态…

idea中,git提交时忽略某些本地修改.将文件从git暂存区移除

我们有时候在本地调试代码时&#xff0c;某些配置文件需要修改成本地环境中。当改完后&#xff0c;需要提交代码时&#xff0c;这些文件又不能推到git上。如下图&#xff1a; 当出现这种情况&#xff0c;我们每次都需要手动去将不需要提交的文件的对号去掉。文件多了后&#x…