I2C协议小结

8 篇文章 0 订阅

I2C协议

  • 两线串行协议(SCL, SDA),主从模式,支持多主控,但在同一时刻只能有一个主控
  • 地址组成:7bit 地址数组+1bit读写位, 共8bit。地址范围0~127, 0地址为广播地址。
  • 一次发送8bit数据,数据格式为大端模式。
  • 速率:标准模式100Kbps, 快速模式400Kbps,高速模式3.4Mbps。

总线互连

注意SDA和SCL都需要上拉。
总线连接方式

总线时序图

  • SCL由master提供,只有master才能同时控制SCL和SDA
  • SCL为低电平时才能改变数据,SCL为高电平时,数据有效。
  • 起始条件: 当SCL为高电平时,master拉低SDA,总线进入start状态。
  • 结束条件: 当SCL为高电平时,master拉高SDA,总线进入stop状态。
  • 无论是发送地址还是数据,其后都紧跟着一个ACK/NACK。当master写数据里,ACK和NACK由slave提供。当master读数据里,ACK和NACK由master提供。下面为master写数据示例:
  • ACK:在第9个CLK周期,slave拉低SDA,发送一个ACK
  • NACK: 在第9个CLK周期,slave保持SDA为高,发送一个NACK
  • 一次可以传输多个字节,直到master发送start/stop。
  • 如果slave设备来不及处理data,它可以保持SCL为低,强制master进入等待状态。

总线时序

I2C Master示例代码(GPIO模拟)

可以参考:STM32下模拟I2C的C语言实现

I2C Slave示例

I2C Slave的实现应该要比I2C Master更为困难,在不同的单片机上实现I2C Slave需要硬件支持,因此具体的实现代码可能会不同,下面以Atmel单片机为例。

下面是TinyWireS库的interface design:
TinyWireS Class

TinyWireS类的使用代码如下:

#define I2C_SLAVE_ADDRESS 0x4 // Address of the slave
 
#include <TinyWireS.h>
 
int i=0;
 
void setup()
{
    TinyWireS.begin(I2C_SLAVE_ADDRESS); // join i2c network
    TinyWireS.onRequest(requestEvent);
    // Turn on LED when program starts
    pinMode(1, OUTPUT);
    digitalWrite(1, HIGH);
}
 
void loop()
{
    // This needs to be here
    TinyWireS_stop_check();
}
 
// Gets called when the ATtiny receives an i2c request
void requestEvent()
{
    TinyWireS.send(i);
    i++;
}

TinyWireS的状态机:
TinyWireS State Machine

代码地址:https://github.com/rambo/TinyWire.git

I2C与SMBus的区别

  • I2C的历史:I2C最早是由飞利浦公司在1980开发用于芯片间通信的低速总线。1982年,I2C原始版本,100KHz, 7位地址。1992年,发布第一个spec, 增加了400KHz的快速模式以及扩展的10位地址空间。1998年,通信速率提高到了3.4MHz。
  • SMBus: SMBus是英特尔在1995年推出的基于I2C的变种。SMBus与I2C最大的区别在于它将速度限制在了10KHz到100KHz之间,而I2C则支持0~5MHz的器件。SMBus存在timeout机制,而I2C则没有。

Clock Speed Comparison

ItemI2CSMBus
Minimumnone10 kHz
Maximum100 kHz (Standard mode)100KHz
400 KHz (Fast mode)
2 MHz (High Speed mode
Timeoutnone35 ms

Electrical Characteristics Comparison

ItemI2CSMBus
VHIGHFixed Voltage: 3.0 to VDD_max + 0.5V2.1V to VDD
VDD Relative: 0.7 to VDD_max + 0.5V
VLOWFixed Voltage: -0.5V to 1.5Vto 0.8V
VDD Relative: -0.5 to 0.3VDD
Max Current3 mA350 µA
  • 0
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值