09 标准库软件模拟I2C时序

news2024/11/30 2:46:28

引言:

你需要的I2C知识这里都有, 本文涵盖了I2C的基本知识和在各个主流平台的开发实例, 总之, 你需要的,都在这里, 后续我也会继续更新在嵌入式开发中常见的通信协议。

一、I2C的基本知识


1. I2C介绍

         IIC总线是Philips公司在八十年代初推出的一种串行、半双工总线,主要用于近距离、低速的芯片之间的通信;IIC总线有两根双向的信号线,一根数据线SDA用于收发数据,一根时钟线SCL用于通信双方时钟的同步;IIC总线硬件结构简单,成本较低,因此在各个领域得到了广泛的应用

2 I2C的几种常见通信时序

主机向从机发送数据

从机向主机发送数据

主机先向从机发送数据,然后从机再向主机发送数据

   IIC总线是一种多主机总线,连接在IIC总线上的器件分为主机和从机 主机有权发起和结束一次通信,而从机只能被主机呼叫;当总线上有多个主机同时启用总线时,IIC也具备冲突检测和仲裁的功能来防止错误产生;

每个连接到IIC总线上的器件都有一个唯一的地址(7bit),且每个器件都可以作为主机也可以作为从机(同一时刻只能有一个主机),总线上的器件增加和删除不影响其他器件正常工作;IIC总线在通信时总线上发送数据的器件为发送器,接收数据的器件为接收器;

二、软件模拟I2C


#ifndef __MYI2C_H
#define __MYI2C_H

void MyI2C_Init(void);
void MyI2C_Start(void);
void MyI2C_Stop(void);
void MyI2C_SendByte(uint8_t Byte);
uint8_t MyI2C_ReceiveByte(void);
void MyI2C_SendAck(uint8_t AckBit);
uint8_t MyI2C_ReceiveAck(void);

#endif
#include "stm32f10x.h"                  // Device header
#include "Delay.h"

void MyI2C_W_SCL(uint8_t BitValue)
{
	GPIO_WriteBit(GPIOB, GPIO_Pin_10, (BitAction)BitValue);
	Delay_us(10);
}

void MyI2C_W_SDA(uint8_t BitValue)
{
	GPIO_WriteBit(GPIOB, GPIO_Pin_11, (BitAction)BitValue);
	Delay_us(10);
}

uint8_t MyI2C_R_SDA(void)
{
	uint8_t BitValue;
	BitValue = GPIO_ReadInputDataBit(GPIOB, GPIO_Pin_11);
	Delay_us(10);
	return BitValue;
}

void MyI2C_Init(void)
{
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);
	
	GPIO_InitTypeDef GPIO_InitStructure;
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_OD;         //开漏输出,,因为I2C总线默认是电阻弱上拉
	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);      //将模拟的两个引脚设置为默认高电平
}

//起始条件:在SCL为高电平的时候, 数据线由高变低
void MyI2C_Start(void)
{
	MyI2C_W_SDA(1);
	MyI2C_W_SCL(1);
	MyI2C_W_SDA(0);
	MyI2C_W_SCL(0);
}

//结束条件:在scl的高电平期间, SDA由低变高
void MyI2C_Stop(void)          
{
	MyI2C_W_SDA(0);
	MyI2C_W_SCL(1);
	MyI2C_W_SDA(1);
}

void MyI2C_SendByte(uint8_t Byte)
{
	uint8_t i;
	for (i = 0; i < 8; i ++)
	{
		MyI2C_W_SDA(Byte & (0x80 >> i));   //高位先行
		MyI2C_W_SCL(1);
		MyI2C_W_SCL(0);         //scl为低电平的时候往数据线上准备数据
	}
}

uint8_t MyI2C_ReceiveByte(void)
{
	uint8_t i, Byte = 0x00;
	MyI2C_W_SDA(1);
	for (i = 0; i < 8; i ++)
	{
		MyI2C_W_SCL(1);         //时钟线为高的时候读取数据,这个期间需要保持稳定
		if (MyI2C_R_SDA() == 1){            //对应的哪一位为1, 就将其置1
			Byte |= (0x80 >> i);
		}
		MyI2C_W_SCL(0);
	}
	return Byte;
}


//确认信号,在SCL的高电平期间, 将sda拉低
void MyI2C_SendAck(uint8_t AckBit)
{
	MyI2C_W_SDA(AckBit);
	MyI2C_W_SCL(1);
	MyI2C_W_SCL(0);
}

uint8_t MyI2C_ReceiveAck(void)
{
	uint8_t AckBit;
	MyI2C_W_SDA(1);
	MyI2C_W_SCL(1);
	AckBit = MyI2C_R_SDA();
	MyI2C_W_SCL(0);
	return AckBit;
}

以上便是软件模拟i2c的全部代码,说一下本质, 以及软件模拟i2c时序的优点, 本质就是控制GPIO引脚输出高低电平来模拟I2C通信的时序。

软件模拟I2C的优点: 因为在咱们的SOC内部虽然集成了I2C硬件控制器, 但是数量有限, 使用软件I2C就可以将具有GPIO功能的引脚改造成为i2c协议, 这也就是为什么这个协议如此强大和受欢迎。

这些代码, 我认为能看懂实在干嘛就行, 真正用的时候再来我这里复制过去, 改一下引脚, 哎呀, 忘记把引脚,时钟,封装成宏了, 算了, 大家在使用的时候全部替换一下, 替换成那么的引脚, 大家将这些经常发生变动的地方封装一下, 这样会很方便。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【JVM】一文掌握JVM垃圾回收机制

作为Java程序员,除了业务逻辑以外,随着更深入的了解,都无法避免的会接触到JVM以及垃圾回收相关知识。JVM调优是一个听起来很可怕,实际上很简单的事。 感到可怕,是因为垃圾回收相关机制都在JVM的C++层实现,我们在Java开发中看不见摸不着;而实际很简单,是因为它说到底,也…

新能源汽车冷却系统的水道管口类型有哪些?格雷希尔针对这些管口密封的快速接头有哪些?

对于新能源汽车&#xff0c;不仅电池&#xff0c;还有电机、电控、充电单元部件&#xff0c;都需要处于适宜的工作温度&#xff0c;才能维持整车的正常运行。而这些部件在运行过程中会产生大量的热量&#xff0c;如果不及时散热会对汽车的性能、寿命产生影响&#xff0c;甚至可…

如何协调建筑技术集成、互操作性和安全性

尽管进行了大量时间和精力的准备和执行&#xff0c;但建筑集成通常无法按预期或根据需要进行工作&#xff0c;无法满足日益常见的能源报告要求或组织可持续发展目标。 当谈到运营技术 (OT) 部署的最终状态时&#xff0c;“这不是我所要求的”这句话太常见了。在许多情况下&…

Codeforces Round 917 (Div. 2) A~F

A.Least Product(思维) 题意&#xff1a; 给出一个数组 a 1 , a 2 , . . . , a n a_1, a_2, ..., a_n a1​,a2​,...,an​&#xff0c;你可以进行若干次以下操作&#xff1a; 选择数组中的一个元素 a i a_i ai​&#xff0c;将这个数字修改为 0 ∼ a i 0 \sim a_i 0∼ai​之…

java servlet软件缺陷库管理系统Myeclipse开发mysql数据库web结构java编程计算机网页项目

一、源码特点 java servlet软件缺陷库管理系统是一套完善的java web信息管理系统 系统采用serlvetdaobean&#xff08;mvc模式)&#xff0c;对理解JSP java编程开发语言有帮助&#xff0c;系统具有完整的源代码和数据库&#xff0c;系统主要采用B/S模式开发。开发环境为TOM…

约翰瑟尔的故事

约翰瑟尔的故事 你即将看到的是“瑟尔效能机”创始者&#xff0c;约翰瑟尔的故事 据瑟尔原话&#xff0c;该装置会是通向自由能源的关键 “他”拥有“会飞”等不可思议的特性相关说法还有待证实&#xff0c;此记录篇仅为告知观者 制片方对瑟尔技术持中立态度 以下是我们所搜集…

【最优化】从图形理解单纯形法——不用单纯形表来解线性规划问题 / 单纯形表的本质与直觉

66ccff 单纯形法是解线性规划问题&#xff08;LP&#xff09;的最经典方法&#xff0c;很多人都了解单纯形法是用单纯形表来进行求解的&#xff0c;但是不了解背后的原理。 这篇博文介绍单纯型表的直觉。 需要的前置知识 你需要了解&#xff1a; 单纯形法实际上是在“爬山”…

劫持 PE 文件:新建节表并插入指定 DLL 文件

PE格式简介 PE(Portable Executable)格式&#xff0c;是微软Win32环境可移植可执行文件(如exe、dll、vxd、sys和vdm等)的标准文件格式。PE格式衍生于早期建立在VAX(R)VMS(R)上的COFF(Common Object File Format)文件格式。 Portable 是指对于不同的Windows版本和不同的CPU类型上…

构建高效数据流转的 ETL 系统:数据库 + Serverless 函数计算的最佳实践

作者&#xff1a;柳下 概述 随着企业规模和数据量的增长&#xff0c;数据的价值越来越受到重视。数据的变化和更新变得更加频繁和复杂&#xff0c;因此及时捕获和处理这些变化变得至关重要。为了满足这一需求&#xff0c;数据库 CDC&#xff08;Change Data Capture&#xff…

深入解析 可空值类型

前言&#xff1a; 问&#xff1a;为什么会有可空值类型的诞生&#xff1f; 答&#xff1a;应对在某些特定场景中获取的信息可能是不完整的。 C# 1中的可空值类型 在C#1中没有对应的表示Null值的方法。当时普遍都是采用其他方式。第一种在数据缺失的情况下给其一个默认值。第…

论文阅读: AAAI 2022行人重识别方向论文-PFD_Net

本篇博客用于记录一篇行人重识别方向的论文所提出的优化方法《Pose-Guided Feature Disentangling for Occluded Person Re-identification Based on Transformer》&#xff0c;论文中提出的PDF_Net模型的backbone是采用《TransReID: Transformer-based Object Re-Identificati…

【JavaWeb学习笔记】17 - ThreadLocal

项目代码 https://github.com/yinhai1114/JavaWeb_LearningCode/tree/main/threadlocal/src/com/yinhai/thread 目录 项目代码 一、什么是ThreadLocal? 二、ThreadLocal快速入门 三、源码解读 一、什么是ThreadLocal? 1. ThreadLocal的作用&#xff0c;可以实现在同一个线…

打破成本壁垒,免费SSL证书为中小企业保驾护航

HTTPS&#xff0c;这个曾经看似遥远的技术词汇&#xff0c;如今已与我们每个人的网络生活息息相关。而实现HTTPS加密传输的关键一环——SSL证书&#xff0c;正以其独特的安全性能&#xff0c;为网站筑起一道坚实的防护墙。更令人惊喜的是&#xff0c;免费SSL证书服务已经到来&a…

SpringBoot+MyBatis+MySQL增删改查(一)(IDEA创建SpringBoot项目)

使用IDEA创建SpringBootMyBatisMySQL进行项目搭建 1.创建项目 文件 --> 新建 --> 项目 填写项目基本信息 项目名称、存放位置、项目语言、项目类型、JDK版本、打包 Web选项选择Spring Web SQL选项中勾选JDBC API、MyBatis Framework、MySQl Driver选项 至此一个空项目…

【深度学习:LSTM Networks】了解 LSTM 网络

【深度学习&#xff1a;LSTM Networks】了解 LSTM 网络 循环神经网络长期依赖问题 相关知识传送门&#xff1a; LSTM 网络LSTM 背后的核心理念LSTM 分步演练长短期记忆的变体Conclusion 循环神经网络 人类在思考时并不是每时每刻都从头开始。当你阅读这篇文章时&#xff0c;你…

单点登录的三种模式

介绍 单点登录存在的意义在于&#xff0c;比如公司里有多个系统&#xff0c;我只想登录一次&#xff0c;便可以访问公司的多个子系统 单点登录有很多模式&#xff0c;目前已知三种模式 1、cookie session模式 2、token模式 3、token refresh_token模式 Cookie Session模式…

基于OpenCv的车道检测

项目背景和步骤 车道检测是自动驾驶领域不可或缺的一环 具体步骤如下&#xff1a; 一、将图像灰度化&#xff0c;并进行适度的高斯滤波&#xff0c;剔除干扰 二、利用Canny边缘检测&#xff0c;检测出车道和其它物体的边缘 三、使用ROI区域截取&#xff0c;截取需要的部分&a…

1.1 FMEA目的

文章目录 1.1 目的和说明 潜在失效模式和影响分析&#xff08;FMEA&#xff09;是美国汽车工业行动集团&#xff08;AIAG&#xff09;和德国汽车工业联合会&#xff08;VDA&#xff09;的整车厂&#xff08;OEM&#xff09;和一级供应商成员合作逾三年的成果。FMEA手册已进行改…

看懂基本的电路原理图(入门)

文章目录 前言一、二极管二、电容三、接地一般符号四、晶体振荡器五、各种符号的含义六、查看原理图的顺序总结 前言 电子入门&#xff0c;怎么看原理图&#xff0c;各个图标都代表什么含义&#xff0c;今天好好来汇总一下。 就比如这个电路原理图来说&#xff0c;各个符号都…

10万蜜蜂同屏作战 UnityECS蜜蜂大战项目实践(附实现前后对比)

本文禁止转载 本项目是Unity官方推荐的ECS入门训练中的蜜蜂大战项目 知乎文章同步链接 浅谈ECS工作栈 提到ECS就不得不提JobSystem和Burst编译器&#xff0c;三者共同组成了Unity面向数据的DOTS&#xff08;Data-Oriented Technology Stack&#xff09;框架。 ECS&#xf…