【软件I2C】

[STM32]——软件模拟I2C 目录 软件模拟I2C概述 软件模拟I2C程序 I2C延时函数 I2C对应的GPIO配置和宏定义 I2C起始信号 I2C停止信号 I2C应答信号相关时序图 I2C等待应答信号 I2C应答信号 I2C非应答信号 I2C的GPIO初始化配置 I2C发送数据(根据数据有效性)​ I2C读取数据 检测I2C总线设备 I2C读写EEPROM实验 EEPROM宏定义 检测EEPROM外设是否正常 EEPROM读取数据 EEPROM写入数据 软件模拟I2C概述 很多人... 阅读详情

软件I2C
I2C_GPIO.h

#ifndef _I2C_GPIO_H
#define _I2C_GPIO_H

#include "stm32f10x_lib.h"
#include "bitband.h"
#include "sys.h"

#define TIME_OUT_COUNT     ((u32)72000)  

#define GPIO_PORT_I2C         GPIOB
#define RCC_I2C_PORT          RCC_APB2Periph_GPIOB
#define I2C_1

#ifdef I2C_1
#define I2C_SCL_PIN           GPIO_Pin_6
#define I2C_SDA_PIN           GPIO_Pin_7
#else 
#define I2C_SCL_PIN           GPIO_Pin_10
#define I2C_SDA_PIN           GPIO_Pin_11
#endif

#define I2C_SCL_1()  GPIO_PORT_I2C->BSRR |= I2C_SCL_PIN		/* SCL = 1 */
#define I2C_SCL_0()  GPIO_PORT_I2C->BRR  |= I2C_SCL_PIN		/* SCL = 0 */
	
#define I2C_SDA_1()  GPIO_PORT_I2C->BSRR |= I2C_SDA_PIN		/* SDA = 1 */
#define I2C_SDA_0()  GPIO_PORT_I2C->BRR  |= I2C_SDA_PIN		/* SDA = 0 */

#define I2C_SDA_READ()  ((GPIO_PORT_I2C->IDR & I2C_SDA_PIN)!=0)	


void I2C_GPIO_Config(void);
void I2c_Delay(u8 j);
void I2C_START(void);
void I2C_STOP(void);
void I2C_ACK(void);
void I2C_NACK(void);
u8 I2C_WAIT_ACK(void);

void I2C_SendByte(u8 data);
u8 I2C_ReadByte(void);

u8 I2C_CheckDevice(u8 Address);
u8 Checkok(u8 Addr_W);
u8 WaitStandby(u8 Addr_W);
u8 IfTimeout(void);
#endif 


I2C_GPIO.c

#include "I2C_GPIO.h"


void I2C_GPIO_Config(void)
{
	GPIO_InitTypeDef  GPIO_InitStructure;
	RCC_APB2PeriphClockCmd(RCC_I2C_PORT, ENABLE);
	
	GPIO_InitStructure.GPIO_Pin = I2C_SCL_PIN | I2C_SDA_PIN;
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_OD;
	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
	GPIO_Init(GPIO_PORT_I2C, &GPIO_InitStructure);
    I2C_STOP();
}

void I2c_Delay(u8 j)
{
  u8 i;
	for(i=0;i<j;i++)
	{
	}
}


void I2C_START(void)
{
	I2C_SCL_1();
	I2C_SDA_1();
	I2c_Delay(10);
	I2C_SDA_0();
	I2c_Delay(10);
	I2C_SCL_0();
	I2c_Delay(10);
}

void I2C_STOP(void)
{
    I2C_SDA_0();
	I2C_SCL_1();
	I2c_Delay(10);
	I2C_SDA_1();
	I2c_Delay(10);
}

void I2C_ACK(void)
{
	I2C_SCL_0();
	I2c_Delay(10);
	I2C_SDA_0();
	I2c_Delay(10);
	I2C_SCL_1();
	I2c_Delay(10);
	I2C_SCL_0();
	I2c_Delay(10);
	I2C_SDA_1();
	I2c_Delay(10);

}

void I2C_NACK(void)
{
	I2C_SDA_1();
	I2c_Delay(10);
	I2C_SCL_1();
	I2c_Delay(10);
	I2C_SCL_0();
	I2c_Delay(10);

}

u8 I2C_WAIT_ACK(void)
{
	u8 ret;
	I2C_SDA_1();
	I2C_SCL_1();
	I2c_Delay(10);
	if( I2C_SDA_READ() )
	{
		ret=1;       //非应答,从机忙
	}
	else
	{
		ret=0;       //应答
	}
	I2C_SCL_0();
	I2c_Delay(10);
  return ret;

}


u8 I2C_ReadByte(void)
{
	u8 value=0;
	u8 i;
	for(i=0;i<8;i++)
	{
		value=value<<1;
		I2C_SCL_1();
	I2c_Delay(10);
		if( I2C_SDA_READ() )
	  {
	 	  value++;
	  }
	  I2C_SCL_0();
	I2c_Delay(10);
	}
	return value;
}


//
void I2C_SendByte(u8 data)
{
	u8 i;
	for(i=0;i<8;i++)
	{
		if( data&0x80 )  //从高位开始发送
	 {
		  I2C_SDA_1();
	 }
	 else
	 {
		  I2C_SDA_0();
	 }
	I2c_Delay(10);
	I2C_SCL_1();
	I2c_Delay(10);
	 I2C_SCL_0();
	I2c_Delay(10);
	 if( i==7 )
	 {
		I2C_SDA_1();
  	I2c_Delay(10);
	 }
	 data=data<<1;
	}
	
}



u8 I2C_CheckDevice(u8 Address)
                             {
	u8 ucACK;
	I2C_GPIO_Config();
	I2C_START();
	I2C_SendByte(Address);
	ucACK=I2C_WAIT_ACK();
	I2C_STOP();
  return ucACK;	
}

//检查从机是否忙碌
u8 Checkok(u8 Addr_W)
{
	if(I2C_CheckDevice(Addr_W)==0)  // 表示从机空闲
	{
		return 1;//从机空闲
	}
	else
	{  
//		I2C_STOP();  
		return 0;//从机忙碌
 	}
}	

//检测写入数 完成
u8 WaitStandby(u8 Addr_W)
{
	u32 wait_count = 0;
	
	while(I2C_CheckDevice(Addr_W)) //表示从机忙碌
	{

		if((wait_count++)>0xFFFF)
		{

			return 1;   //超时
		}
	}

	return 0; //写入完成
}


//超时计时
u8 IfTimeout(void)
{
	  u32 timeout=TIME_OUT_COUNT;
	  while( (I2C_WAIT_ACK()==1)&timeout)   //I2C_WAIT_ACK()==1时,非应答
		{
			timeout--;
		}
		if(timeout==0 )
		{
	    return 1;  //应答超时
		}	
    else 
		{
			timeout = TIME_OUT_COUNT;
			return 0;
		}
}


一文说清STM32硬件I2C与软件模拟I2C的核心区别 深入剖析硬件I2C和软件模拟I2C在性能、稳定性和资源占用上的不同,帮助开发者根据项目需求合理选择通信方式,充分发挥硬件I2C的高效优势。 阅读详情

相关推荐

STM32硬件I2C与软件模拟I2C实战解析

本文深入解析STM32硬件I2C与软件模拟I2C的实现差异,通过EEPROM(24C02)和传感器(MPU6050)实战案例,详细对比两种方式的配置方法、读写操作及性能特点。硬件I2C效率高且稳定,适合高速通信;软件I2C灵活易调试,适合快速原型开发。为嵌入式开发者提供I2C协议应用的实用指南。

apple5的专栏 949

stm32.模拟iic.分析代码

iic模拟io口 最近用硬件iic发现oled一直不亮,经过测试可能是硬件的问题,于是想办法拿别人的代码来研究,仅供学习 原文章:软件模拟iic #define I2C_Speed 100000 #define I2C_EE I2C1 #define uStatus 0x80 #define dTime 5 #define I2C_EE_GPIO ...

yunddun的博客 640

黑苹果从入门到精通:最详细的VMware安装macOS教程

前言 不知为何,以前我发的两篇关于黑苹果的文章或没过审或被删除,最近SMZDM上有不少优质的黑苹果文章发出来,貌似禁令已开,前段时间在一篇写的很不错的黑果文章下吹牛说今年要写一个系列,故有了这篇文章作为系列的开头。 系列的名字起的有点俗,叫做xxx从入门到精通,但是我很喜欢,相信过半的黑果群众都是程序员,作为教程来说这个名字俗但是好用,我也希望这个系列能像其它入门到精通系列一样,让大家学到东西...

La victoria的博客 14万+

STM32 IO 模拟IIC I2C

#define I2C_Speed 100000 #define I2C_EE I2C1 #define uStatus 0x80 #define dTime 5 #define I2C_EE_GPIO GPIOB #define I2C_EE_SCL GPIO_Pin_5 #define I2C_EE_SDA

专注的力量 1万+

STM32MP157+AD7606BSTZ四通道IEPE传感器采集方案实战(附完整电路图)

本文详细介绍了基于STM32MP157和AD7606BSTZ的四通道IEPE传感器采集方案,涵盖硬件电路设计、软件驱动开发及系统性能优化。通过精确的恒流源设计和同步采样技术,实现高精度振动信号采集,适用于工业振动监测等应用场景。

weixin_42713608的博客 702

【小白指南】如何将deepseek引入WPS\Word\Excel中去?

如何将deepseek引入WPS\Word\Excel中去?纯小白都能看的懂,一步步操作就能行

2503_90498422的博客 1万+

硬件I2C和软件I2C的区别

硬件I2C(Inter-Integrated Circuit)是STM32等微控制器内置的串行通信接口,采用**同步、半双工**方式,通过**SCL(时钟线)**和**SDA(数据线)**两根信号线与外部设备通信。- **主模式(Master Mode)**:在这种模式下,STM32充当总线主机,负责发起通信并生成时钟信号(SCL),可以作为发送端或接收端。- **从设备地址固定**:通常由硬件引脚(A0~A2)设置,例如AT24C02的默认地址为**0xA0**(写)/ **0xA1**(读);

weixin_63207510的博客 2666

colmap+openMVS稠密重建

简要记录一下colmap+openMVS稠密重建相关使用。

weixin_41631106的博客 2243

软件I2C

实现软件I2C

cctv1324的博客 1342

大数据课程综合实验案例:网站用户行为分析

大数据课程综合实验案例1 案例简介1.1 案例目的1.2 适用对象1.3 时间安排1.4 预备知识1.5 硬件要求1.6 软件工具1.7 数据集1.8 案例任务1.9 实验步骤2 本地数据上传到数据仓库Hive2.1 实验数据集的下载2.2 数据集的预处理(1)删除文件第一行记录,即字段名称(2)对字段进行预处理(3)导入数据库3 Hive数据分析3.1 操作Hive3.2 简单查询分析3.3 查询条数统计分析3.4 关键字条件查询分析3.4.1 以关键字的存在区间为条件的查询3.4.2 关键字赋予给定值为

weixin_44616879的博客 1万+

MIKE11实战:平原河网水动力建模从入门到精通(附GIS数据处理技巧)

本文系统介绍了MIKE11软件在平原河网水动力建模中的完整实战流程。从GIS数据预处理、河网构建、参数率定到结果分析,详细阐述了构建可靠数字孪生模型的关键步骤与技巧,旨在帮助水利工程师高效解决平原地区复杂水流模拟的挑战,为防洪决策提供科学依据。

weixin_28419039的博客 689

I2C通信之软件I2C

前面学习了硬件I2C(使用芯片内部集成的I2C控制器电路自动处理时序),本文将介绍如何实现软件I2C(通过代码控制GPIO高低电平翻转,配合延时模拟时序)。理论部分参考B站UP “铁头山羊”,代码部分参考 “江科大本文介绍了软件I2C的使用,对比硬件I2C,便于移植,可以使用任意IIO口。但是大量使用了Delay函数,为阻塞式编程。后面我们继续学习SPI通信。

2401_82807263的博客 1233

Openclaw第4章:本地文件管理

OpenClaw本地文件管理功能摘要: OpenClaw提供强大的本地文件管理能力,主要功能包括: 智能文件搜索:支持内容搜索、自然语言描述、跨文件夹搜索和智能过滤排序,比传统文件名搜索效率提升10倍以上 批量文件处理:可自动整理发票、提取PDF内容、识别名片信息,批量处理数百文件仅需几分钟 文件自动整理:支持智能重命名、自动分类和文件夹优化,如将1000+照片按日期地点自动分类 典型应用场景: 30秒找到忘记名称的重要文件 5分钟完成原本需要1小时的发票整理工作 1句话指令完成数百文件的批量重命名 优势:

Maynor的博客 1707

STM32F1之I2C通信·软件I2C代码编写

SCL低电平期间,从机将数据位依次放到SDA线上(高位先行),然后释放SCL,主机将在SCL高电平期间读取数据位,所以SCL高电平期间SDA不允许有数据变化,依次循环上述过程8次,即可接收一个字节(主机在接收之前,需要释放SDA)。发送一个字节: SCL低电平期间,主机将数据位依次放到SDA线上(高位先行) ,然后释放SCL,从机将在SCL高电平期间读取数据位,所以SCL高电平期间SDA不允许有数据变化,依次循环上述过程8次,即可发送一个字节。终止条件下,SCL高电平期间,SDA从低电平切换到高电平。

时光の尘的博客 2206

Happycapy深度解析:AI智能体的“iPhone时刻“来了?

从理论到实践深度解析了融合OpenClaw和ClaudeCode优点的超强智能体工具Happycapy

program哲学 457

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

STM32硬件I2C与软件模拟I2C超详解

I2C协议时序详细解剖,硬件I2C的实现,已经软件模拟I2C的实现,以及EEPROM的详细介绍

k666499436的博客 8万+

pscad IEEE标准系统搭建说明

pscad IEEE标准系统搭建说明,包含典型的IEEE 9节点、14节点、30节点、39节点和118节点系统。内含标准测试系统的原始数据和潮流结果。

硬件I2C和软件I2C(模拟I2C)的区别

硬件I2C和软件I2C(模拟I2C)是两种不同的实现I2C(Inter-Integrated Circuit,集成电路间)通信协议的方式,它们在实现方式、性能特点以及应用场景上存在显著差异。

qq_65582400的博客 7352

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

STM32 软件I2C读写

/ SDA 和 SCL 引脚定义// 引脚初始化函数// SCL 引脚初始化// SDA 引脚初始化// 初始状态 SCL 和 SDA 都为高电平。

duierrorshuobu的博客 1299

软件I2C与硬件I2C对比优劣:认知型解析

深入探讨软件i2c实现机制及其灵活性优势,对比硬件i2c在性能与资源占用上的差异,帮助开发者根据实际场景选择更合适的通信方案,掌握软件i2c的调试技巧与应用场景。

weixin_36289813的博客 974

软件I2C与硬件I2C的区别

I2C(Inter-Integrated Circuit)是一种串行通信协议,用于在集成电路之间进行短距离的数据传输。

weixin_45615278的博客 3702

I2C学习笔记---基于手册一步步实现软件I2C

I2C学习笔记 文章目录I2C学习笔记一、学习《I2C总线规范》I2C总线特征:重要知识点数据传输二、实现软件I2C实现1. 预处理2. `i2c_init()`3. `i2c_start()`4.`i2c_stop()``5.i2c_ack() i2c_nack()`6. `i2c_waitACK()`7.`i2c_writeByte()`8.`i2c_readByte()`测试总结 一、学习《I2C总线规范》 I2C总线特征: 两条总线:一条串行数据线(SDA);一条串行时钟线(SCL) 传输速率:

ApexYuan 6891

Arduino下ESP32同时使用硬件I2C和软件I2C总线(软件I2C驱动VL53L0X为例)

由于ESP32-C3只有一条硬件I2C总线,然而我的程序中需要同时要使用硬件I2C和软件I2C,硬件I2C作为Slave用于与上位机通信,比较简单,本篇不做详细介绍。本篇重点介绍软件I2C方式驱动VL53L0X,其他I2C设备可参考。前面有篇文章写到了I2C总线驱动VL53L0X,这篇我们再深入点。本文的I2C均是Wire模式使用。本人水平有限,以下骚操作仅做参考。

f4t0x的博客 4175

STM32 I2C通信:硬件I2C与软件模拟I2C的区别

如果应用场景对通信速度要求不高,但需要更高的灵活性或需要实现多路通信,那么软件模拟I2C可能是一个更好的选择。其次,软件模拟I2C的实现相对复杂,需要编写更多的代码来模拟I2C协议的时序和数据传输过程。硬件I2C是通过STM32内部的I2C控制器实现的,它利用CPU的时钟信号来控制数据传输和时序。由于直接使用硬件资源,硬件I2C的通信速度较快,可以达到几十MHz的速度,适用于需要高速数据传输的应用场景。硬件I2C通常只能实现单路通信,而软件模拟I2C则可以通过软件控制,轻松实现多路I2C通信。

u013050118的专栏 1204

STM32/软件I2C和硬件I2C

本文深入探讨了STM32微控制器中软件I2C和硬件I2C的实现方法。I2C协议是一种两线串行总线协议,适用于短距离低速设备间通信,具有主从设备结构和独特的仲裁机制。软件I2C通过GPIO模拟时序,灵活性高但速度慢,占用CPU资源多。硬件I2C则利用内置外设自动生成时序,速度快,时序精度稳定,但引脚固定,资源有限。文章提供了详细的初始化和操作示例,包括设置时钟速度、占空比、应答使能等参数,以及如何生成起始/停止信号、发送和接收数据。

2502_91794894的博客 1597

硬件I2C vs 软件I2C对比分析 | 以MPU6050为例

本文以STM32驱动MPU6050为例,深入对比硬件I2C与软件I2C在性能、稳定性、CPU占用和抗干扰能力等方面的差异,强调硬件I2C在产品化阶段的必要性,并提供初始化配置、超时处理和工程实践建议。

weixin_35950531的博客 427

软件I2C和硬件I2C

3.SCK:L,准备数据,为下一次接收做准备,sck:H,只能读取数据,无法写数据。2.I2C停止条件SCK:H SDA:上升沿。1.I2C起始条件 SCK:H SDA:下降沿。5.硬件I2C代码示例。

2301_79065154的博客 298
上一篇: 【设置ui文件默认打开方式为Designer.exe】
下一篇: 【GPIO配置】
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值