一个关于新手可以快速理解IIC的文档

概要

作为一个嵌入式菜鸟,在刚出学校的时候总是会对一堆通信协议傻傻分不清,而我在一次工作中突然发现一个可以帮助新手快速理解如下文IIC协议的方法,废话不多说现在开始正文。

例如:

在这里插入图片描述

引言

我这次使用VS 2022模仿IIC运行的时候,(前提是没有任何硬件)在只有一台电脑的情况下怎么快速理解IIC的实验,

iic介绍:
I2C(Inter-Integrated Circuit),即I²C,是一种串行通信协议,用于在电子设备之间进行通信。它由飞利浦半导体(现在的恩智浦半导体)在上世纪80年代开发,并被广泛用于连接微控制器、传感器、存储器和其他外围设备。I2C总线由两根线构成:

数据线(SDA):用于传输数据。
时钟线(SCL):用于同步数据传输。
I2C通信使用一个主设备(通常是微控制器或处理器)和一个或多个从设备之间的主从架构。通信的基本单元是数据字节,通过时钟脉冲进行传输。数据传输开始和结束由特定的起始和停止条件定义。总线上的设备通过其唯一的硬件地址进行识别。

I2C协议还定义了如何在总线上进行数据传输,包括如何发送地址、读/写位以及如何处理确认位等。

总的来说,I2C是一种灵活而可靠的通信协议,适用于连接各种类型的外围设备,因其简单性和可扩展性而被广泛采用。

IIC模拟具体实现

IIC_Start(void)::
此次实验使用的IIC芯片是PCF8591,在官方的DATASHEET里面可以看出他的起始逻辑如下;
在这里插入图片描述
据线和时钟线在总线空闲时都保持高电平。当时钟为高电平时,数据线的从高到低的转变被定义为开始条件(S)。当时钟为高电平时,数据线的从低到高的转变被定义为停止条件(P)。
所以我们就可以这样写;首先定义一个可以模拟IIC电平时许的变量来代替SDA和SCL的状态,

enum IIC_GPIO
{
	SDASET=1,    //SDA高电平
	SDARESET=0,  //SDA低电平
    SCLSET=1,    //SCL高电平
	SCLRESET=0   //SCL低电平
};

然后就是实现IIC的起始函数如下:

void IIC_Start(void)
{
	printf("SCLSET=%d\r\n", SCLSET);   //scl高电平期间sda由高到低跳变
	printf("SDASET=%d\r\n", SDASET);
	IIC_Delay(50);//稍微延时一下
	printf("SDARESET=%d\r\n", SDARESET);
	IIC_Delay(50);//稍微延时一下
	printf("SCLRESET=%d\r\n", SCLRESET);
}

接下来我们来看看IIC的起始打印效果模拟示波器之类的观察

int main()
{
    IIC_Start();
    while (1)
    {
        
    }
   
   
    return 0;
}

接下来运行一下
在这里插入图片描述
首先可以看出,SCL和SDA起始都拉高,接下来就是延时延时呢我是这样写的(延时可以理解为示波器里面看到的高电平或者低电平持续时间)

void IIC_Delay(int i)
{
	while (i--)
	{
		printf("i=%d\r\n", i);
	}
}

然后接下来就是拉低SDA
在这里插入图片描述
箭头1是开始拉高之后延时一段时间在箭头2的时候已经拉低了SDA然后在延时一段时间

总结

起始出来IICstart可以这么写IIC停止应答包括写入一个字节读一个字节都可以以这样的方式去实现。`

第一次写,先到此为止了,上班摸鱼写的,怕老板发现就先溜了下次再写详细一点的。

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值