【车载开发系列】IIC总线协议基础篇

【车载开发系列】IIC总线协议基础篇

【车载开发系列】IIC总线协议基础篇

  • 【车载开发系列】IIC总线协议基础篇
    • 一. 什么是I2C
    • 二. I2C使用场景
    • 三. I2C的特点
    • 四. 传输速度四种模式
    • 五. IIC基本通讯规则
      • 1)起始信号S
      • 2)停止信号P
      • 3)发送数据(一个字节)
      • 4)接收数据(一个字节)
      • 5)发送应答
      • 6)接收应答
      • 7)模式切换
    • 六. 什么是上拉电阻
    • 七. IIC通信步骤
      • 1)主机发出起始信号
      • 2)发送设备地址和读写控制位
      • 3)等待从机应答
      • 4)传输数据
      • 5)通信结束
    • 八. IIC注意事项
    • 九. IIC总线寻址
    • 十. IIC总线通讯协议与CAN对比

)

一. 什么是I2C

  • I2C(集成电路总线),它是Inter-Integrated Circuit的缩写。
  • 由Philips公司(2006年迁移到NXP)在1980年代初开发的一种简单、双线双向的同步串行总线,它利用一根时钟线SCL和一根数据线SDA在连接总线的两个器件之间进行信息的传递,为设备之间数据交换提供了一种简单高效的方法。每个连接到总线上的器件都有唯一的地址,任何器件既可以作为主机也可以作为从机,但同一时刻只允许有一个主机。

二. I2C使用场景

  • I2C总线协议标准是一个具有冲突检测机制和仲裁机制的真正意义上的多主机总线,它能在多个主机同时请求控制总线时利用仲裁机制避免数据冲突并保护数据。
  • 使用I2C总线通信的场景有很多,IIC主要方便连接各种低速外设,例如传感器,存储器时钟芯片,驱动FRAM和E2PROM等。

三. I2C的特点

  • 只需要SDA(串行数据总线)、SCL(串行时钟总线)两条总线;
  • 同步串行通信接口,半双工工作模式;
  • 没有严格的波特率要求;
  • 所有组件之间都存在简单的主/从关系,连接到总线的每个设备均可通过唯一地址进行软件寻址;
  • I2C是真正的多主设备总线,可提供仲裁和冲突检测;
  • 最大主设备数:无限制;最大从机数:理论上,1008个从节点,寻址模式的最大节点数为2的7次方或2的10次方,但有16个地址保留用于特殊用途。

四. 传输速度四种模式

  1. 标准模式(Standard Mode):100 Kbps
  2. 快速模式(Fast Mode):400 Kbps
  3. 高速模式(High speed mode):3.4 Mbps
  4. 超快速模式(Ultra fast mode):5 Mbps
  • IIC支持多种速度等级 能满足不同应用环境对数据传输速率的需求。
  • 如果使用硬件I2C接口,可以通过配置主设备控制器,选择速率模式。

五. IIC基本通讯规则

  1. 总线上的START和STOP停止信号必定是唯一的,另外IIC总线标准规定:SDA线的数据变化必须在SCL线的低电平期,SDA线上的数据是稳定的。
  2. 这里除了起始和终止条件,每个时序单元的SCL都是低电平开始,低电平结束。

1)起始信号S

  • 当SCL(serial Clock Line)为高电平的时候,SDA(Serial Data)从高电平变成了低电平。

2)停止信号P

  • 当SCL(serial Clock Line)为高电平的时候,SDA从低电平变为高电平。

3)发送数据(一个字节)

  • SCL低电平期间,主机将数据位依次放到SDA线上然后释放SCL,从机在SCL高电平期间读取数据位,所以SCL高电平期间SDA不允许有数据变化,依次循环8次,即可发送一个字节。

4)接收数据(一个字节)

  • 在SCL低电平期间,从机将数据位依次放到SDA上,然后释放SCL,主机将在SCL高电平期间读取数据位,所以SCL高电平期间SDA不允许有变化,依次循环上述过程8次,即可接收一个字节。

5)发送应答

  • 主机在接收完一个字节之后,在下一个时钟发送一位数据,数据0表示应答,数据1表示非应答。

6)接收应答

  • 主机在发送完一个字节之后,在下一个时钟接收一位数据,判断从机是否应答,数据0表示应答,1表示非应答。
  • 发送和应答机制和发送接收字节的原理是一样的,只是发送应答机制变成了发送一位数据。

7)模式切换

  • 如果主机发送完字节后,要确定从机是否接收到数据,那么就要将主机切换成输入模式。
  • 主机立即拉高SDA电平(释放控制权),从机立刻拉低SDA电平(获得控制权),所以主机接收到的是从机拉低后的低电平,这就是数据0表示应答的原因。

六. 什么是上拉电阻

  • 它是一种电阻器,当外部电路没有输入信号时,它可以将内部引脚的电平拉高到高电平,通常是3.3V或者5.0V。
  • 上拉电阻(Pull-up Resistor)主要功能就是在总线上没有信号的时候,提供一个固定的电平,以确保数据线上的电平稳定,从而保证数据传输的可靠性。
  • 对于标准模式的(100kHz)的IIC总线,上拉电阻可以选择4.7K欧姆或者10K欧姆,对于快速模式或者更高速率的IIC总线,可能需要更小的上拉电阻。

七. IIC通信步骤

1)主机发出起始信号

  • 主机首先需要发出起始信号来占用总线。这通常是在SCL为高电平的时候,将SDA从高电平拉低来完成。

2)发送设备地址和读写控制位

  • 主机发送一个字节的数据,其中高7位为设备的地址,最后一位是读写控制位(R/W位),读写控制位为0时,表示主机要向从设备发送数据(写操作),读写控制位为1时,表示主机要从从设备读取数据(读操作)。

3)等待从机应答

  • 主机发送完设备地址和读写控制位后,等待从机信号应答。如果从机的地址与主机发送的地址匹配,并且准备好就行通信,它会发送一个应答信号ACK给主机。这个应答信号是在SCL为高电平时,通过拉低SDA电平(从高电平变为低电平)来表示的。

4)传输数据

  • 一旦建立了连接,主机就可以通过SDA线向从机发送数据,数据在SCL的每个时钟周期内传输一位。
  • 数据发送的顺序是从最高位到最低位发送(MSB->LSB)。

5)通信结束

  • 通信结束后,主机发送停止信号来释放总线。

八. IIC注意事项

  1. 起始信号和终止信号都是由主机来发送。
  2. 在I2C总线进行数据传输时,SCL为高电平期间,SDA线上的数据必须保持稳定,只有在SCL为低电平的时候,SDA上面的高电平或低电平状态才允许变化。
  3. 数据传送格式:主机发送给从机;每一个字节必须保证是8个位的长度,数据传输时先传送最高位(MSB),每一个被传送的字节后面都必须跟随一位应答位(即一帧一共有9位)。
  4. 应答信号包括ACK和NACK两种。
  5. 作为数据接收端,在I2C传输中接收到一个字节数据或者地址后,若希望对方继续发送的话,需要向对方发送ACK信号;向对方发送非应答NACK信号的时候,发送方就会产生一个停止信号,结束信号传输。

九. IIC总线寻址

  • 主机发送地址时,总线上的每个从机都将这7位地址码与自己的地址进行比较,若相同则认为自己正在被主机寻址,根据RW位将自己确定为发送器还是接收器。
  • 每次数据传送总是由主机产生终止信号来结束。但是若主机希望继续占用总线进行新的数据传送,则可以不产生终止信号,马上再次发出起始信号对另一从机进行寻址。
  • 每个设备都必须有一个唯一的7位地址,其中最高位是固定的0,剩余7位由设备厂商指定。
    SDA和SCL两条总线同时在高电平下,那么IIC总线目前在空闲状态。

十. IIC总线通讯协议与CAN对比

  1. CAN和IIC都具备总线仲裁和冲突检测,都是半双工,都是串行两线的总线,都是多主机总线(多个设备之间通信)。
  2. CAN是异步通信,而IIC因为有ACK的报文存在,所以算是同步通信。
  3. I2C使用了上拉电阻,抗干扰能力比不上CAN,一般只能用于同一块板上的通信。
  4. I2C的报文中包含有地址信息,CAN报文中没有地址信息,所以在系统柔软性上,在CAN总线上添加单元时,其他单元的软硬件和应用层都不需要进行改变。
  5. CAN总线采用多主结构,不分主从;IIC总线支持一主多从和多主多从。
  • 19
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
### 回答1: 首先,你需要明确I2C总线协议的功能要求,并确定技术细节。其次,使用C语言编写I2C总线协议,可以使用标准的I2C库函数,以及特定于处理器的I2C驱动程序。最后,使用模拟或调试工具来验证I2C总线协议的正确性。 ### 回答2: I²C(Inter-Integrated Circuit)总线协议是一种用于在集成电路之间进行通信的串行总线协议。下面是使用C语言编写I²C总线协议的步骤: 首先,我们需要定义I²C总线的相关参数,包括时钟频率、数据位数和I²C地址等。可以使用宏定义或者全局变量来定义这些参数。 接下来,我们需要实现I²C总线的初始化函数,用于初始化I²C控制器和相关硬件。在初始化函数中,我们需要配置相关引脚的输入输出模式、上下拉电阻等。 然后,我们需要实现发送数据的函数。发送数据的过程包括发送起始位、I²C地址、数据、应答等步骤。通常情况下,我们可以使用位运算来控制每个步骤的时序和数据传输。 接着,我们需要实现接收数据的函数。接收数据的过程与发送类似,只是在发送结束后需要切换为接收模式,并且在接收数据时需要发送应答或非应答信号。 最后,我们可以实现其他辅助函数,例如读写寄存器、发送和接收多个字节的数据等。 在编写以上函数时,我们需要参考相关的I²C总线协议规范和硬件手册,以确保代码的正确性和可靠性。另外,为了提高代码的可读性和可维护性,可以使用适当的注释和模块化设计。 需要注意的是,具体的代码实现可能因硬件平台和具体需求而有所不同。以上只是基本的编写步骤和思路,实际编写过程中还需根据实际情况进行相应的优化和调整。 编写I²C总线协议的代码是一项复杂而精细的任务,需要对硬件和通信协议有深入的理解。因此,在实际应用中建议使用已经存在的I²C库或者驱动程序进行开发,以减少开发时间和复杂度。 ### 回答3: I2C(Inter-Integrated Circuit)总线协议是一种用于连接低速外设的串行通信协议,通过两根传输线SCL(时钟线)和SDA(数据线)进行通信。以下是使用C语言编写I2C总线协议的示例代码。 ```c #include <stdio.h> #include <stdint.h> #define I2C_ACK 0 #define I2C_NACK 1 // 初始化I2C总线 void i2c_init() { // TODO: 设置SCL和SDA引脚和配置相关寄存器 } // 发送一个起始信号 void i2c_start() { // TODO: 设置SDA和SCL引脚状态,产生起始信号 } // 发送一个停止信号 void i2c_stop() { // TODO: 设置SDA和SCL引脚状态,产生停止信号 } // 等待应答信号 int i2c_wait_ack() { // TODO: 读取SDA引脚状态,判断是否接收到应答信号 // 如果接收到应答信号,返回 I2C_ACK // 如果没有接收到应答信号,返回 I2C_NACK } // 发送一个字节 void i2c_write_byte(uint8_t data) { // TODO: 依次发送数据的每一位,同时检测应答信号 } // 读取一个字节 uint8_t i2c_read_byte() { // TODO: 依次读取数据的每一位,同时发送应答信号 // 返回读取的字节数据 } int main() { i2c_init(); // 初始化I2C总线 // 示例: 使用I2C总线向某个设备写入数据 i2c_start(); // 发送起始信号 i2c_write_byte(0xA0); // 发送设备地址和写入标志 i2c_wait_ack(); // 等待应答信号 i2c_write_byte(0x01); // 发送数据 i2c_wait_ack(); // 等待应答信号 i2c_write_byte(0x23); // 发送数据 i2c_wait_ack(); // 等待应答信号 i2c_stop(); // 发送停止信号 // 示例: 使用I2C总线从某个设备读取数据 i2c_start(); // 发送起始信号 i2c_write_byte(0xA1); // 发送设备地址和读取标志 i2c_wait_ack(); // 等待应答信号 uint8_t data = i2c_read_byte(); // 读取数据 i2c_send_ack(I2C_NACK); // 发送非应答信号 i2c_stop(); // 发送停止信号 printf("读取的数据是 %d\n", data); return 0; } ``` 以上示例是一个简单的I2C总线协议的实现。具体的操作需要根据硬件平台和具体的I2C总线驱动进行相应的设置和配置。可以根据实际需求对上述代码进行修改和扩展。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

进击的横打

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值