STM32----IIC详解

2023-11-05

一.IIC简介

1.IIC总线概述

IIC总线是飞利浦公司研发的两线制串行通信总线,IIC两线制包括:串行时钟线(SCL)和串行数据线(SDA)。串行时钟线(SCL)只能由主器件控制,串行数据线(SDA)实现双向数据传输(IIC通信属于同步、半双工串行通信)。IIC总线遵从主/从结构,可以实现一个主器件和多个从器件之间的通信,并且从器件永远不会主动给主器件发送数据。器件发送数据到总线上,则定义为发送器,器件从总线上读取数据,则定义为接收器(主器件和从器件都可以是发送器也可以是接收器)谁接收谁应答。

2.IIC总线物理结构

上拉电阻作用:确保总线空闲时为高电平

3.IIC总线通信方式

通过器件地址建立通信。器件地址:固定地址(4)+ 可编程地址(3)+ 读写为(0读1写)

IIC设备地址是一个7位地址,并且这个7位地址分成两部分,分别是固定地址(器件地址)和可编程地址(芯片管脚地址)。 4+3

  • 固定地址:IIC器件在生产时,芯片厂家已经固化在芯片内部的地址,使用者不可更改。
  • 可编程地址:由IIC器件地址管脚上的电平状态决定。地址管脚接电源则表示数字“1”,地址管脚接地则表示数字“0”。(可以根据器件说明修改地址 例如:迈莱芯MLX90640修改设备地址方法,I2C挂载多个MLX90640
  • 最低位为控制字节,控制读写方向(指主机的读写方向)。

IIC总线数据传输速度在标准模式下可达100Kbit/S,快速模式下可达400Kbit/S以及高速模式下可达3.4Mbit/S。

 

4.IIC模式配置

1)引脚配置

 

  • SCL,SDA可以配置成推挽输出、开漏输出(上拉电阻输出1)
  • SCL,SDA也可以配置成开漏输出、开漏输出(开漏输出为防止多个器件存在短路)  

                注意:必须器件内部自带上拉电阻      或者外界接上拉电阻   或者软件设置上拉电阻

  • SCL,SDA也可以配置成推挽输出、推挽输出与浮空输入(通过切换模式)

2)开漏输出和线与

硬件IIC:会自动配置为开漏输出,(不推荐不稳定)

软件IIC

推挽输出:输出0,N-MOS激活。 输出1,P-MOS激活

开漏输出(不带上拉电阻):输出0,N-MOS激活。   输出1,P-MOS不会激活,不会输出高电平

开漏输出(带上拉电阻):输出0,N-MOS激活。   输出1,P-MOS激活

简言之:开漏输出必须有上拉电阻才能输出高电平。目前单片机GPIO口可以通过软件设置配置上下拉

开漏输出的作用:

  1. 防止短路: 在一些情况下(比如总线), 多个GPIO口可能会连接在同一根线上, 存在某个GPIO输出高电平, 另一个GPIO输出低电平的情况. 如果使用推挽输出, 你会发现这个GPIO的VCC和另一个GPIO的GND接在了一起, 也就是短路了(凉凉了). 如果换成开漏输出呢? VCC和GND多了个电阻, 这样电路就是安全的.所以总线一般会使用开漏输出.
  2. 实现线与,减少一个与门,简化逻辑。同时当多个器件通讯的时候,因为线与. 如果主设备A拉高SDA时, 已经有其他主设备将SDA拉低了. 由于 1 & 0 = 0 那么主设备A在检查SDA电平时, 会发现不是高电平, 而是低电平. 说明其他主设备抢占总线的时间比它早, 主设备A只能放弃占用总线. 如果是高电平, 则可以占用.(SDA为高电平的时候才可以与器件进行通信,)

二.三种模式区别

IIC之所以分成三种模式,是由于SCL与SDA保持时间长短不同所决定的。例如:标准模式下要求SCL高电平保持时间最小为4.7us,快速模式下要求SCL高电平保持时间最小为0.7us. 这也是为什么高速率可以兼容低速率,而低速率不能兼容高速率的原因。

  标准/S 快速/F 高速/HSE
速率 100KHZ 400KHZ 3.4MHZ

例如:数据保持时间(为SCL低电

平时数据允许保存最长时间)

 

0.9us 72或150ns
器件寻址 7位(128个器件) 7位或10位(1024个器件) 7位或10位(1024个器件)
优化功能   快速模式器件的输入有抑制毛刺的功能
 
Hs 模式器件的输出可以抑制毛刺
 

 

更多区别请查看IIC协议规范

三.时序分析

以软件模拟推挽输出例100K时序为例

1)起始信号

SCL在高电平期间,SDA出现一个由高到低的跳变(SDA,SCL有最小保持时间 )

void IIC_Start(void)
{
	SDA_OUT();
	SDA_H;   							//串行数据线高电平(空闲信号)
	CLK_H;   							//串行时钟线高电平(空闲信号)
	Delay_us(5);
	SDA_L;   							//串行数据线拉出下降沿
	Delay_us(5);
	CLK_L;   							//串行时钟线拉出下降沿
}

2)终止信号

SCL在高电平期间,SDA出现由低变高的跳变(SDA,SCL有最小保持时间 )

void IIC_Stop(void)
{
	SDA_OUT();					//输出模式
	CLK_L;							//串行时钟线低电平
	SDA_L;							//串行数据线低电平
	CLK_H;							//串行时钟线高电平
	Delay_us(5);
	SDA_H;							//串行数据线高电平  上升沿
	Delay_us(5);

}

 

3)应答信号

SCL在高电平期间SDA始终处于低电平(SCL保持时间<= SDA保持时间)

需要在传输完毕一个字节后发送

void IIC_Send_ACK(void)
{
	
	CLK_L;
	SDA_OUT();			   				//输出模式
	SDA_L;										//串行数据线低电平
	Delay_us(5);
	CLK_H;										//串行时钟线线高电平    上下
	Delay_us(5);
	CLK_L;										//串行时钟线线低电平
}

4)非应答信号

SCL在高电平期间SDA始终处于高电平(SCL保持时间<= SDA保持时间)

需要在传输完毕一个字节后发送

void IIC_Send_NoACK(void)
{
	
	CLK_L;
	SDA_OUT(); 
	SDA_H;											//串行数据线为高电平
	Delay_us(5);
	CLK_H;
	Delay_us(5);
	CLK_L;
}

5)检测应答

SCL为高电平的时候可以读取SDA的状态,因此可以将SDA模式切换为输入模式,读取SDA引脚状态,0位应答,1位非应答

SCL为低电平允许数据发生变化

SDA:为高电平的时候可以占用总线,此时将SDA拉低,开始通信。当为低电平的时候,SDA已经被占用。
SCL: SCL为高电平的时候要求数据稳定  SCL为低电平的时候允许数据改变

u8 IIC_Get_ACK(void)
{
	u8 ERRTIME = 0;    //超时变量
	SDA_IN();
	//SDA_L;// 没有影响
	Delay_us(5);
	CLK_H;
	Delay_us(5);
	while( READ_SDA() )
	{
		ERRTIME++;
		if(ERRTIME >=250)
		{
			IIC_Stop();
			return 1;
		}
	}
	CLK_L;
	return 0;
}

 

6)发送数据

void IIC_Send_Data(u8 dat)
{
	u8 i;
	SDA_OUT();
	CLK_L;
	for(i = 0; i < 8; i++)					//分8次传输数据  一位一位传递  串行
	{
		if(dat & 0x80)								//先发最高位  1000 0000
		{
			SDA_H;     //写1
		}
		else
		{
			SDA_L;     //写0
		}
		dat <<= 1;									//左移操作  次高位-->最高位
		Delay_us(5);
		CLK_H;
		Delay_us(5);
		CLK_L;
		Delay_us(5);	
	}
}

7)接收数据

将SDA切换为输入模式。拉高SCK电平,可以读取数据

u8 IIC_Read_Data(u8 ack)
{
	unsigned char i,date = 0;
	SDA_IN();
	for(i = 0; i < 8; i++)
	{
		
		CLK_L;
		Delay_us(5);
		CLK_H;
		date <<= 1;
		Delay_us(5);
		if( READ_SDA() )
		{
			date ++;
		}
		//Delay_us(2);
	}
	if(ack)
	{
		IIC_Send_ACK();																	//发送应答
	}
	else
	{
		IIC_Send_NoACK();																	//发送非应答
	}
	return date;

}

 

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

STM32----IIC详解 的相关文章

  • 2022 SWPUCTF Web+Crypto方向wp

    文章目录 2022 SWPUCTF WP web 欢迎来到web安全 easy sql happy rce do not wakeup newnew baby pop happy php easy xss baby ssrf sql2 ph

随机推荐

  • 计算机图形学入门(十三)-光线追踪(基本原理)

    本部分主要介绍了光线追踪的基本原理 简述了光线追踪的实现过程 并对实现过程中第一步 求解射线与表面的交点的过程进行了全面的分析和解答 学习视频来源 GAMES101 现代计算机图形学入门 闫令琪 哔哩哔哩 bilibilihttps www
  • Spring的事务配置文件配置

  • 大数据毕设 - 深度学习植物识别系统(python OpenCV)

    文章目录 0 前言 2 相关技术 2 1 VGG Net模型 2 2 VGG Net在植物识别的优势 1 卷积核 池化核大小固定 2 特征提取更全面 3 网络训练误差收敛速度较快 3 VGG Net的搭建 3 1 Tornado简介 1 优
  • 213. House Robber II

    题目描述 每个房子有一定的钱 条件 不能偷相邻房子的钱 条件 第一个房子和最后一个房子相邻 围成一个圆形 也就是不能同时偷第一个房子和最后一个房子的钱 解题思路 如果抢劫第一家 则不可以抢最后一家 否则 可以抢最后一家 因此 这个问题就转化
  • Java——JavaWeb

    文章目录 1 Tomcat 1 1 安装Tomcat 1 2 Tomcat启动和配置 1 3 配置文件 2 HTTP 2 1 HTTP请求 2 2 HTTP响应 3 Maven 3 1 Maven项目架构管理工具 3 2 下载安装Maven
  • Dictionary用法总结

    说明 必须包含名空间System Collection Generic Dictionary里面的每一个元素都是一个键值对 由二个元素组成 键和值 键必须是唯一的 而值不需要唯一的 键和值都可以是任何类型 比如 string int 自定义
  • 嵌入式硬件 入门路线

    嵌入式硬件 入门路线 文章目录 嵌入式硬件 入门路线 前言 C语言 推荐学习方法 推荐资料 51单片机 学习51单片机的收获 推荐学习方法 推荐资料 学习成本 stm32单片机 前置知识需求 推荐学习法 推荐资料 学习线路推荐说明 学习成本
  • matlab的详细使用方法

    help命令 格式help 函数名 例 局部上 1 help plot 二维绘图 2 help elfun 基本函数 初等函数的帮助 3 help exp 指数函数的简单帮助 4 网页格式的帮助doc exp 5 Lookfor 模糊查询
  • vscode连接远程服务器+SFTP同步本地文件

    vscode连接远程服务器 SFTP同步本地文件 前言 准备工作 配置远程服务器 SFTP 前言 最近在做毕设 本来使用的是kaggle的gpu资源 但是上传数据 修改数据实在不方便 于是向实验室学长要了一个单卡服务器 下面介绍如何使用vs
  • Android使用SharedPreferences(sp)存储基本数据类型、List集合、Map集合、对象都在这了

    基于一些小伙伴说在取出对象的时候出现null 这个问题可能是因为你的对象没有序列化的原因 如果存在内部类的也需要进行序列化 看下面的例子 public class Test implements Serializable 内部类 publi
  • c语言蛇形填充数组,蛇形

    题目描述 蛇形矩阵是由1开始的自然数依次排列成的一个矩阵上三角形 例如 当输入5时 应该输出的三角形为 1 3 6 10 15 2 5 9 14 4 8 13 7 12 11 请注意本题含有多组样例输入 输入描述 输入正整数N N不大于10
  • vue中使用简单的回调函数

    使用场景 比如 多个新增接口一样 只是新增之后调用的列表接口不一致 this getTalkBy 列表接口的回调 调用 this getAddTalkLike this getTalkBy 新增接口 getAddTalkLike callb
  • 大神总结的图像处理学习路线

    图像处理 第一阶段 熟悉图像算法 推荐中科院研究生院刘定生老师的数字图像处理与分析 视频 配套的书籍 冈萨雷斯版数字图像处理 同时用matlab软件 仿真每一个图像算法案例 推荐 matlab宝典 第二阶段 认真学习C 推荐 C Prime
  • 基于Smack3.0.4+ Openfire3.10.2开发之Android 客户端之四

    我们在之前依次介绍openfire部署以及smack常用API的使用 这一节中我们着力介绍如何基于asmack开发一个Android的客户端 本篇的重点在实践 讲解和原理环节 大家可以参考前面我所发布的OpenFire和Smack的相关文章
  • 10.JavaWeb-logback日志

    1 日志的概念 日志是用于记录软件系统运行时状态和事件的重要工具 在软件开发中 日志是一种常用的调试和故障排查手段 同时也可以用于性能分析 用户行为追踪和系统监控等方面 1 1日志特点 灵活性 可以根据需要配置日志的级别和输出目标 方便在不
  • MCU和DSP区别

    1 概述 随着处理器技术的不断发展 目前来看CPU Central Processing Unit 逐渐出现三种分支 分别是DSP Digital Signal Processing Processor 数字信号处理 以及MCU Micro
  • 第四天笔记

    1 盒子模型 内边距 应用于所有边 padding 1em 上边下边 左边右边 padding 5 10 上边 左边右边 下边 padding 1em 2em 2em 上边 右边 下边 左边 padding 5px 1em 0 2em 全局
  • JavaScript给URL追加参数

    代码 appendQuery url key value gt var options key if typeof options string options options key value options param options
  • 傅里叶变换在图像处理中的应用

    目录 基本概念 超详细的图像中傅里叶理解及常用模板 请参考 https blog csdn net m0 37264397 article details 70186390 应用一 使用C opencv对图像进行傅里叶变换 再根据频谱图对原
  • STM32----IIC详解

    一 IIC简介 1 IIC总线概述 IIC总线是飞利浦公司研发的两线制串行通信总线 IIC两线制包括 串行时钟线 SCL 和串行数据线 SDA 串行时钟线 SCL 只能由主器件控制 串行数据线 SDA 实现双向数据传输 IIC通信属于同步