STM32单片机初学者常用函数--I2C配置

2023-10-27

I2C的配置必须要按照其时序逻辑,首先先来了解I2C常见的几种工作情况:
A、主机向从机发送数据,数据传输方向在整个传输过程中不变:
在这里插入图片描述
B、主机在第一个字节后,立即从从机读数据:
在这里插入图片描述
C、在传输过程中,当需要改变传输方向时,起始信号和从机地址都被重复产生一次,但两次读/写方向位正好相反:
在这里插入图片描述
此外,I2C的时序如下图所示:
在这里插入图片描述
接下来正式开始进入I2C程序阶段(I2C管脚配置、宏定义等假设已完成):
(1)I2C起始函数(严格按照上图中起始信号的时序逻辑):
void IIC_Start(void)
{
IIC_SDA_OUT();//这里是I2C中数据信号输出的配置模式,一般配置为推挽输出

IIC_SDA_SET;//数据拉高
IIC_SCL_SET;//时钟拉高
IIC_DelayUs(5);	//延时5us,满足起始信号刚开始时的大于4.7us的时序

IIC_SDA_CLR;	//START: when CLK is high,DATA change form high to low;数据拉低
IIC_DelayUs(5);	//保证满足至少大于4us的时序

IIC_SCL_CLR;    //钳住I2C总线,准备发送或者接收数据;时钟拉低			

}

(2)I2C终止函数(严格按照上图中终止信号的时序逻辑):
void IIC_Stop(void)
{
IIC_SDA_OUT();//同理,配置为推挽输出

IIC_SCL_CLR;//时钟拉低
IIC_SDA_CLR;	//数据拉低;SCL在低电平期间,SDA变化无效

IIC_SCL_SET;//时钟拉高
IIC_DelayUs(5);	//保持时间>4us

IIC_SDA_SET;    //STOP:when CLK is high DATA change form low to high
IIC_DelayUs(5);	//保持时间>4.7us

}

(3)I2C发送函数:
void IIC_SendData(uint8_t dat)
{
uint8_t i;

IIC_SDA_OUT();
IIC_SCL_CLR;

for(i=0; i<8; i++) //要发送8位,从最高位开始
{
	if((dat & 0x80) == 0x80)
	{
		IIC_SDA_SET;
	}
	else
	{
		IIC_SDA_CLR;
	}
	dat <<= 1;
	IIC_DelayUs(2);

	IIC_SCL_SET;
	IIC_DelayUs(5);  //保持时间>4.7us
	IIC_SCL_CLR;
	IIC_DelayUs(2);
}	

}

(4)I2C接收函数:
uint8_t IIC_ReceiveData(uint8_t ack)
{
uint8_t i, readValue;

IIC_SDA_OUT();
IIC_SDA_SET;	
IIC_SDA_IN();
IIC_SCL_CLR;

for(i=0; i<8; i++)	 //接收8个字节,从高到低
{
	IIC_SCL_SET;
	IIC_DelayUs(2);
	readValue <<= 1;
	if(IIC_SDA != 0)
	{
		readValue |= 0x01;
	}		
	IIC_DelayUs(1);
	
	IIC_SCL_CLR;
	IIC_DelayUs(5);			
}

if(ack)		 //是否应答,1:产生应答;0:非应答
{
	IIC_SendAck();
}
else
{
	IIC_NoAck();
}

return readValue;//这里返回值即是读取到的数据

}

(5)I2C等待应答函数:
int8_t IIC_WaitAck(void)
{
uint32_t i;

IIC_SDA_IN();
IIC_SDA_SET;
IIC_DelayUs(1);
IIC_SCL_SET;


while(IIC_SDA)//在SCL高电平的情况下,SDA产生一个下降沿
{
	 i++;
	 if(i > 0xFFFF)
	 {
	 	return 0xFF;
	 }
}

IIC_SCL_CLR;
IIC_DelayUs(2);

return 0;	//返回值为1:应答成功;0:应答失败

}

(6)I2C发送应答函数:
static void IIC_SendAck(void)
{
IIC_SCL_CLR;
IIC_SDA_OUT();

IIC_SDA_CLR;
IIC_DelayUs(2);
IIC_SCL_SET;
IIC_DelayUs(2);
IIC_SCL_CLR;		

}

(7)I2C无应答函数:
static void IIC_NoAck(void)
{
IIC_SCL_CLR;
IIC_SDA_OUT();

IIC_SDA_SET;
IIC_DelayUs(2);
IIC_SCL_SET;
IIC_DelayUs(2);
IIC_SCL_CLR;		

}

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

STM32单片机初学者常用函数--I2C配置 的相关文章

  • Java 中的 JDK 介绍

    Java 开发工具包 JDK 是一个跨平台的软件开发环境 它提供了开发基于 Java 的软件应用程序和小程序所需的工具和库的集合 它是Java中使用的核心包 与JVM Java虚拟机 和JRE Java运行时环境 一起 初学者经常对 JRE
  • vscode的sql开发插件

    vscode的sql开发插件 Better Comments Error Lens SQLTools MySQL MariaDB SQL Formatter VSCODE连接数据库 执行sql Better Comments 注释美化插件
  • 2018年计算机专业考研,2018年计算机专业考研大纲解析

    2017年暑期几十年不遇的高温炙烤着紧张复习的同学 早早发布的2018年计算机考研大纲给大家带来一丝秋的凉意 考研大纲从考试目的到考试形式 再到四门课程的每一个知识点都没有任何变化 这符合文都老师们预测 也是广大同学们的福音 暑期奋战没有浪
  • IOS消息推送之APNS

    转自 http blog csdn net jiajiayouba article details 39926017 一 背景概述 1 环境配置 APNS Apple Push Notification Service 本文对推送相关概念不

随机推荐

  • 光线追踪渲染实战(三):OpenGL 光线追踪,用 GPU 加速计算!

    项目代码仓库 GitHub https github com AKGWSB EzRT gitee https gitee com AKGWSB EzRT 目录 前言 0 前置知识 1 布置画布 2 三角形数据传送到 shader 3 在 s
  • SVN添加报错处理

    文章目录 SVN添加报错处理 svn E200009 svn E195023 SVN添加报错处理 svn E200009 svn warning W150002 Users dry Documents xxx xxx xcodeproj p
  • 新板子晶振不起振

    问题描述 1 新焊接的电路板晶振未成功起振 2 起振后晶振两端波形不一致 正常情况下8MHZ晶振两端对地波形都一样 波形规整 光滑无毛刺 如下图 晶振部分原理图如图 解决过程 先检查电路焊接情况 排除焊接问题 再给板子烧录程序 灌入程序后晶
  • Linux——会话、守护进程创建模型及代码实现

    会话 概念 多个进程组的集合 创建一个会话需要注意以下6点 调用进程不能是进程组组长 创建会话的创始人不能是进程组组长 该进程变成新会话首进程 session headler 该进程成为一个新进程组的组长进程 需有root权限 ubuntu
  • Ceph:ceph修复osd为down的情况

    ceph修复osd为down的情况 今天巡检发现ceph集群有一个osds Down了 通过dashboard 查看 ceph修复osd为down的情况 点击查看详情 可以看到是哪个节点Osds Down 了 通过命令查看Osds状态 查看
  • 高德地图key设置

    调试key 找到 keytool exe所在目录 在当前目录运行命令行工具 keytool exe list v keystore C Users 用户名 android debug keystore
  • [ C++ ] template 模板进阶 (特化,分离编译)

    本篇内容包括C 非典型模板参数 类模板的特化 模板的分离编译 C 模板简单概念及其使用大家可点击此链接 C C 之模板template 目录 1 数组模板示例和非类型模板参数 2 模板的特化 2 1什么是模板的特化 2 2 函数模板特化 2
  • nginx配置详解

    nginx进程 一般设置为和cpu核数一样 worker processes 4 错误日志存放目录 error log data1 logs error log crit 运行用户 默认即是nginx 可不设置 user nginx 进程p
  • 计算机专业毕业论文python毕业设计题目推荐基于Python实现的数据分析系统[包运行成功]

    文末获取联系 目录 一 项目介绍 二 文档截图 三 运行截图 四 源码获取 一 项目介绍 基于Python的数据分析系统的设计和实现 该项目采用技术Python的django框架 mysql数据库 项目含有源码 论文 PPT 配套开发软件
  • SQL DEFAULT约束

    SQL DEFAULT约束 一 说明 本文主要讲SQL 中的DEFAULT约束 插入默认值 二 所用工具 SQL 数据库 三 内容 1 DEFAULT约束说明 DEFAULT 约束用于向列中插入默认值 如果列中没有规定其他的值 那么会将默认
  • JavaScript使用技巧精萃

    一 确认删除用法 1 BtnDel Attributes Add onclick return confirm 确认删除 2 linktempDelete Attributes onclick javascript return confi
  • cuda的cublas库

    cublas库是在NVIDIA CUDA上实现blas 基本线性代数子程序 该库是已经封装好的 可以利用该库进行向量和矩阵的多种操作 cuBLAS包含了三部分 cuBLAS API 从cuda6 0开始 CUBLASXT API 从cuda
  • Unity:角色控制器(CharacterController)

    角色控制器是unity中专门用来控制角色的组件 主要是运动相关 区别于直接用Transform或者RigidBody CharacterController有着更好的效果 它拥有RigidBody的一些重要特性 但是又去掉了很多物理效果 这
  • matlab练习程序(白平衡<灰度世界算法>)

    clear all close all clc img imread Lena cai jpg imshow img mean1 mean mean img 1 mean2 mean mean img 2 mean3 mean mean i
  • C++---异常处理

    异常处理 异常处理 try语句块和throw表达式 异常的抛出和捕获 异常的抛出和匹配原则 异常安全 异常规范 标准异常 异常处理 异常是指存在于运行时的反常行为 这些行为超出了函数正常功能的范围 当程序的某部分检测到一个他无法处理的问题时
  • AcWing 3719. 畅通工程(并查集)(天津大学考研上机)

    输入样例 4 2 1 3 4 3 输出样例 1 include
  • 装jdk

    首先从官网上下载jdk安装包 如果后缀 i586 则是32位的 大部分电脑不要选 我们要选后缀X64的 这才是64位电脑应该选的 双击jdk 一路next 装好之后 还会弹出让你安装jre 因为jdk自带jre 所以这个jre装不装都行 装
  • 【经典】SpringBoot常用基本配置

    SpringBoot支持properties文件和yml文件 两个文件同时存在 优先以properties为准 通过properties文件配置 1 基本设置 server port 80 debug true server servlet
  • 超频到3200最佳时序_如何榨取更多CPU性能:CPU BIOS超频简单教程

    你为什么要超频 以前超频是可以换来性能的大幅度提升 但是近些年来超频带来的收益其实已经大幅降低 因为不论Intel还是AMD都已经把CPU的频率拉到接近极限 留给玩家的可超频空间其实不多 性能提升已经远没有以前明显 但是依然有不少人追求超频
  • STM32单片机初学者常用函数--I2C配置

    I2C的配置必须要按照其时序逻辑 首先先来了解I2C常见的几种工作情况 A 主机向从机发送数据 数据传输方向在整个传输过程中不变 B 主机在第一个字节后 立即从从机读数据 C 在传输过程中 当需要改变传输方向时 起始信号和从机地址都被重复产