概要
作为一个嵌入式菜鸟,在刚出学校的时候总是会对一堆通信协议傻傻分不清,而我在一次工作中突然发现一个可以帮助新手快速理解如下文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停止应答包括写入一个字节读一个字节都可以以这样的方式去实现。`
第一次写,先到此为止了,上班摸鱼写的,怕老板发现就先溜了下次再写详细一点的。