历史上的今天
返回首页

历史上的今天

今天是:2025年04月19日(星期六)

2019年04月19日 | I2C 协议之软件模拟时序

2019-04-19 来源:eefocus

1.1 I2C 简介 

        I2C 总线时 PHILIPS 公司推出的一种串行总线,具备多主机系统所需的包括总线仲裁和高低速器件同步功能的高性能串行总线。它只需要两跟双向的信号线,一根数据线 SDA,一个是时钟线 SCL。在 I2C 总线上面,每个器件都有自己相应的 I2C 地址,所以在两个器件之间进行通信的时候,都要首先呼叫你想要通信的器件地址,然后等待相应的从器件进行应答之后才开始通信。首先我们来看一下,一个 I2C 信号传输的一个过程,如图: 



从图上我们可以看出在 I2C 上面一个完整信号的传输过程,一定要有一个始信号,还有一个结束信号,在每个字节传输结束的时候,从机还要提供一个应答信号。一个完整的信号传输就是这样子。接下来我们来看一下,I2C 总线上面对起始信号、应答信号、结束信号、还有高低电平的协定是怎么样的呢?这里有两个要注意的要点: 
1、在总线空闲的时候,SDA 和 SCL 都是高电平的。 
2、在 SCL 为高电平期间,SDA 必须保持稳定。所以 SDA 改变状态最好在 SCL 为低电
平的时候改变,如果在高电平改变的话回被认为是一种有效信号(如:起始信号或者结束信号) 


1. 起始信号 
起始信号简介 SCL 线为高电平期间,SDA 线由高电平向低电平的变化表示起始信号, 
信号时序如图: 

这里要注意的就是,在 I2C 总线上面,当总线空闲的时候,SCL 和 SDA 都是高电平
的。起始信号,它是需要有一定的保持时间的,在 SDA 从高电平向低电平跳变的时候,两
个先必须至少保持 4.7us 的时间,而跳变之后,也要保持 SCL 高电平和 SDA 低电平要至
少保持 4us 的时间(从这里我们看出 I2C 总高速率已经决定了) 。 

 

//IO 口模拟起始信号 //产生起始信号 void I2C_Start(void) { 
    I2C_SDA_OUT(); 
  
 I2C_SDA_H; 
 I2C_SCL_H; 
 delay_us(5); 
 I2C_SDA_L; 
 delay_us(6); 
 I2C_SCL_L; 
}

2. 结束信号 
结束信号简介 SCL 线为高电平期间,SDA 线由低电平向高电平的变化表示终止信号。 
信号时序如图: 
 
注意的就是这里保持时间也是有一定限制的。 

 

 

 

 

//IO 口模拟结束信号 //产生停止信号 void I2C_Stop(void) { 
   I2C_SDA_OUT(); 
 
   I2C_SCL_L; 
   I2C_SDA_L; 
   I2C_SCL_H; 
   delay_us(6); 
   I2C_SDA_H; 
   delay_us(6); 
}

3. 应答信号 
应答信号 
应答,也叫响应。数据的传输必须要带应答。在响应的时钟脉冲期间(也就是 SCL 在高电
平的时候) ,发送器释放 SDA 线(释放 SDA 意思就是将 SDA 拉为高电平,这里要注
意的是,不能在 SCL 为高电平的时候讲 SDA 从低电平拉到高电平,可以在在 SCL 在低
电平的时候,将 SDA 拉为高电平等待),然后等待应答,在应答时钟脉冲器件,接收器 
必须将 SDA 拉低,使它在这个时钟脉冲的高电平期间保持稳定的低电平。而一个字节传输
完毕之后,接收器没有应答则表示接收完毕。还有一种情况是,当主机作为接收器的时候,接收完最后一个字节之后,必须向从机发出一个结束传送的信号。这个信号是由对从机“非 应答”来实现的。(从上面的规则我们知道,当主机作为接收器的时候,如果是进行应答,那么在接收完一个字节的最后一位之后产生一个低电平的时钟,进行应答。而非应答呢,就是产生一个高电平的时钟,进行应答) 。如果大家不是很理解呢,大家可以参考我们例程里面 I2C 的 IO 模拟信号里面接收数据的函数,最后的应答和非应答。 

 

//IO 口模拟应答信号 //主机产生应答信号 ACK void I2C_Ack(void) { 
   I2C_SCL_L; 
   I2C_SDA_OUT(); 
   I2C_SDA_L; 
   delay_us(2); 
   I2C_SCL_H; 
   delay_us(5); 
   I2C_SCL_L; 
} 
//主机不产生应答信号 NACK void I2C_NAck(void) { 
   I2C_SCL_L; 
   I2C_SDA_OUT(); 
   I2C_SDA_H; 
   delay_us(2); 
   I2C_SCL_H; 
   delay_us(5); 
   I2C_SCL_L; 
} 
//等待从机应答信号 //返回值:1 接收应答失败 //    0 接收应答成功 u8 I2C_Wait_Ack(void) { 
 u8 tempTime=0; 
 
 I2C_SDA_IN(); 
 
 I2C_SDA_H; 
 delay_us(1); 
 I2C_SCL_H; 
 delay_us(1); 
 
 while(GPIO_ReadInputDataBit(GPIO_I2C,I2C_SDA)) 
 { 
  tempTime++; 
  if(tempTime>250) 
  { 
   I2C_Stop(); 
   return 1; 
  }   
 } 
 
 I2C_SCL_L; 
 return 0; 
}


4. 逻辑“1”的表示 
要传输数据,那么肯定要分传输“1”和“0” ,而在 I2C 上面是怎么表示这两个逻辑变量
的呢?如图: 

  


一般 I2C 读取的时候,都是在 SCL 的为高电平的时候进行读取,所以在 SCL 为高电平
的时候,需要保持 SDA 稳定。而且注意的还有就是他们的保持时间要大于 4us。 

5. 逻辑“0”的表示 
逻辑“0”和逻辑“1”的表示其实差不多,只是 SDA 正好相反。如图: 

 


注意的事项跟逻辑“1”的表示差不多。 

6. IO 口模拟发送一个字节数据 

 

//I2C 发送一个字节 void I2C_Send_Byte(u8 txd) { 
 u8 i=0; 
 
 I2C_SDA_OUT(); 
 I2C_SCL_L;//拉低时钟开始数据传输 

 
 for(i=0;i0) //0x80  1000 0000 
   I2C_SDA_H; 
  else 
   I2C_SDA_L; 
 
  txd<<=1; 
  I2C_SCL_H; 
  delay_us(2); //发送数据 
  I2C_SCL_L; 
  delay_us(2); 
 } 
}


7. IO 口模拟接收一个字节数据 

 

//I2C 读取一个字节 
 u8 I2C_Read_Byte(u8 ack) { 
   u8 i=0,receive=0; 
 
   I2C_SDA_IN(); 
   for(i=0;i<8;i++) 
   { 
     I2C_SCL_L; 
  delay_us(2); 
  I2C_SCL_H; 
  receive<<=1; 
  if(GPIO_ReadInputDataBit(GPIO_I2C,I2C_SDA)) 
     receive++; 
  delay_us(1);  
   } 
 
    if(ack==0) 
     I2C_NAck(); 
 else 
  I2C_Ack(); 
 
 return receive; 
}

 


推荐阅读

史海拾趣

H&D Wireless公司的发展小趣事

高创深知不同行业对于运动控制解决方案的需求存在差异,因此始终关注行业应用的发展趋势。通过深入了解客户需求和行业工艺特点,高创能够为客户提供量身定制的解决方案。例如,在锂电行业,高创针对电池生产线的特殊需求开发了高性能伺服系统和运动控制器;在光伏行业,则提供了高精度、高稳定性的跟踪系统解决方案。这些定制化解决方案不仅满足了客户的实际需求,还帮助高创在行业中树立了良好的口碑。

蓝箭(BLUE ROCKET)公司的发展小趣事

蓝箭电子始终致力于技术创新和产品升级。随着科技的进步,公司不断引进先进的生产线和技术,推出了各种封装的双极型晶体管、晶闸管、集成电路等产品。这些产品广泛应用于家用电器、电源、IT数码、通信等多个领域,满足了市场的多样化需求。

Deltrol Controls公司的发展小趣事

随着物联网技术的不断发展,电子设备对继电器的要求也越来越高。Deltrol Controls紧跟行业趋势,对继电器产品进行了智能化改造。通过集成传感器、控制器等智能元件,新型继电器能够实现对电路状态的实时监测和远程控制。这一创新产品不仅提高了电子设备的智能化水平,也为客户带来了更多的便利和价值。

E Connector Solutions公司的发展小趣事

E Connector Solutions公司自成立以来,一直注重技术创新。在早期阶段,公司研发团队通过深入的市场调研,发现电子连接器市场存在着对高速、高密度连接器日益增长的需求。公司投入大量研发资源,成功开发出一款新型连接器产品,其传输速度更快、密度更高,满足了市场的需求。随着产品的推出,E Connector Solutions公司逐渐在市场中树立了技术领先的形象,赢得了客户的信赖。

Don Connex Electronics Co Ltd公司的发展小趣事

Don Connex Electronics Co Ltd成立于上世纪90年代初,当时电子行业正处于快速发展阶段。公司的创始人李明凭借其在半导体领域的深厚技术背景,带领团队研发出了一款高性能的电源管理芯片,这款芯片在业界引起了广泛关注。该芯片以其低功耗、高效率的特性,迅速在市场上打开了局面,为公司的初创阶段奠定了坚实的基础。

C.K Magma公司的发展小趣事

C.K Magma公司始终坚持以创新为核心竞争力。他们不断推出具有创新性的电子产品,如高性能的集成电路、智能传感器等。这些产品凭借其卓越的性能和独特的功能,在市场上获得了广泛的认可。同时,公司还注重产品的用户体验和售后服务,赢得了客户的信赖和支持。

问答坊 | AI 解惑

菜鸟求救啊....关于m2716的用法...

以前从没接触过这类芯片。现在要用啊。但又不会。 谁能告诉下我m2716在Proteus中如何加载数据,还有在现实中用什么把数据烧到它里面去? 不甚感谢啊... …

查看全部问答>

mc55模块上电20秒后自动关机问题

将mc55模块/IGT引脚置低电平后,mc55模块上电开机,但20秒后mc55模块会自动关机.每次都是这样,找不到原因,请各位指教.谢谢…

查看全部问答>

我想请问KEYMAN工具是个什么?

当设备与 Visual Studio 机器没有 ActiveSync 连接,但有一个有效的 TCP 连接时,部署无效。 解决办法:使用单独提供的 Keyman 工具来执行初始的设备设置. 我想请问KEYMAN工具是什么,在哪里可以找到它,或者下到它? 谢谢~…

查看全部问答>

请问一下接近开关 常开加常闭是什么意思。

我就知道接近开关有常开,和常闭,怎么还有一个一开一闭的,这个一开一闭算起什么作用呢?…

查看全部问答>

【一起学习器件指标】你敢不敢说个大家不知道的电阻指标

几乎所有的电子设计中都会使用到电阻,我稍微提供问题,你知道的电阻有哪些参数指标呢?你敢不敢说个大家都不知道的指标?这个大家现在用的多了也许再过多少年后就看不到这位了…

查看全部问答>

关于定时器中断打断芯片驱动函数时序的问题???!!!

做了个东西用的DHT11温湿度传感器  显示是用的数码管动态扫描 由于执行驱动函数用的时间比较长就把显示函数放在了定时器中断里面  问题出来了 定时器中断把DHT11驱动函数的时序给打乱了 读出来的数据一直在跳动 乱 我在驱动函 ...…

查看全部问答>

求助~~急

哪位大哥知道51单片机中读秒指示电路的工作原理?求解答…

查看全部问答>

我的C2000无法仿真了.问题已解决。

Error connecting to the target: (Error -151 @ 0x0) One of the FTDI driver functions used during the connect returned bad status or an error. The cause may one or more of: invalid emulator serial number, blank emulator EEPROM, ...…

查看全部问答>