关注分享主机优惠活动
国内外VPS云服务器

I2C协议代码详解

总结:相应的代码读取端口线的状态,并通过将总线拉低来发送信号。 根据上面的时序图,我们可以看到在高电平期间有数据发送,并且有数据发送。 数据被拉高和拉低。 数据被拉下来了。

I2C 协议 I2C 概述

I2C 总线(I2C 总线、Inter-IC 总线)是一种双向、两线连续总线,提供集成电路 (IC) 之间的通信线路。 I2C总线是飞利浦公司首先推出的串行扩展技术,广泛应用于电视、录像机、音响等设备中。 I2C总线含义:“完成集成电路或功能单元之间信息交换的规范或协议”。 飞利浦推出的I2C总线采用数据线(SDA)和时钟线(SCL)来完成数据传输和外围设备扩展。 各节点的寻址均为软寻址,节省片选线。 标准寻址字节SLAM为7位,可寻址127个单元。

1、延迟信号 static void i2c_Delay(void){uint8_t i;for (i = 0; i < 10; i++);}

逻辑分析测试

p >

条件:CPU主频72MHZ,MDK编译,一级优化

周期数10,SCL频率=205KHZ

周期数7,SCL频率=347 KHZ ,SCL高电平时间1.5us,SCL低电平时间2.87us

周期数5,SCL频率=421KHZ,SCL高电平时间1.25us,SCL低电平时间2.37us

2、启动信号

从上面的时序图可以看出

I2C启动信号:当SCL为高电平时,SDA上会出现下降沿,表示I2C总线启动信号

p>

对应的代码为:

void i2c_Start(void){OLED_I2C_SDA_1();//设置SDA总线为1OLED_I2C_SCL_1();//设置SCL总线为1i2c_Delay() Set;//设置延迟信号 OLED_I2C_SDA_0();//设置 0 i2c_Delay();OLED_I2C_SCL_0();//SCL 设置为 0i2c_Delay();}

3、停止信号 从上面的时序图可以知道

I2C终止信号:当SCL为高电平时,SDA的上升沿表示I2C总线停止信号。

对应的代码为:

void i2c_Stop(void){ OLED_I2C_SDA_0();OLED_I2C_SCL_1();i2c_Delay() ;OLED_I2C_SDA_1();}

4. 等待响应信号

从上面的时序图中可以看到

I2C 正在等待响应信号。 当SDA为高电平时,SCL也为高电平,是此时SDA返回的数据。 1 表示设备无响应,0 表示设备响应正确。

对应的代码为:

uint8_t i2c_WaitAck(void){uint8_t re;OLED_I2C_SDA_1();i2c_Delay();OLED_I2C_SCL_1();i2c_Delay();if (OLED_I2C_SDA_READ() )//读获取SDA端口线状态 {re = 1;}else{re = 0;}OLED_I2C_SCL_0();//拉低SCL总线 i2c_Delay();return re;}

5、信号传输

从上面的时序图可以看出

SCL为高电平时数据传输。 数据发送8次。 数据为1,SDA拉高,SDA为低,数据为0,SDA拉低。

void i2c_SendByte(uint8_t _ucByte){uint8_t i; //先发送高位7for (i = 0; i < 8; i++){if (_ucByte & 0x80) //判断高位 {OLED_I2C_SDA_1( ) ; //设置SDA发送数据}else{OLED_I2C_SDA_0();}i2c_Delay();OLED_I2C_SCL_1();//拉高SCL,发送数据 i2c_Delay();OLED_I2C_SCL_0();//拉低SCL,改变SDA数据,左移_ucByte,重新确定高位6,以此类推 if (i == 7){ OLED_I2C_SDA_1(); //发送完成,将SDA改为1}_ucByte设置

未经允许不得转载:主机频道 » I2C协议代码详解

评论 抢沙发

评论前必须登录!