IIC协议简介

本文详细介绍了IIC总线的工作原理和技术细节,包括信号定义、数据传输方式、时钟频率限制及器件地址分配等。此外还对比了IIC与其他两种串行总线UART和SPI的不同之处。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >



原文地址:https://www.cnblogs.com/bixiaopengblog/p/7469536.html

总线信号 : 

  SDA :串行数据线

  SCL  :串行时钟

总线空闲状态 :

  SDA :高电平

  SCL :高电平

起始位:SCL为高电平期间    SDA出现下降沿

终止位:SCL为高电平期间 SDA出现上升沿

数据传输 :SDA的数据在SCL高电平期间被写入从机。所以SDA的数据变化要发生在SCL低电平期间。

IIC时钟频率:不高于400K

应答:当IIC主机(不一定是发送端还是接受端)将8位数据或命令传出后,会将SDA信号设置为输入,等待从机应答(等待SDA由高电平拉为低电平)

   若从机正确应答,表明数据或者命令传输成功,否则传输失败,注意,应答信号是数据接收方发送给数据发送方的。

IIC器件地址:每一个IIC器件都有一个器件地址,有的器件地址在出厂时地址就设定好了,用户不可以更改,比如OV7670的

      地址为0x42。有的器件例如EEPROM,前四个地址已经确定为1010,后三个地址是由硬件链接确定的,所以一

      个IIC总线最多能连8个EEPROM芯片。

    图上开始信号之后,七位地址代表器件地址,第八位代表读或者写,0为写,1代表读,然后跟着响应位。

 IIC器件单字节写时序:

IIC器件多字节地址写时序:多字节地址比单字节地址在时序上就多了一块写地址

 

单字节器件读时序:注意最后产生无应答信号,另外多字节地址读时序跟单字节类似,只不过是多了几个地址字节而已。

 三大串行总线:uart、spi、iic

同步    :spi    异步 :  iic,uart

同步和异步区别:采集数据是否用的是时钟的沿,如果是时钟沿采数据,同步传输,如果电平采集数据是异步

串口接受数据其实就是一个串转并的过程

### 一、IIC通信协议概述 IIC(Inter-Integrated Circuit),也称为I2C,是一种广泛应用于嵌入式系统中的同步串行通信协议。它通过两根信号线实现数据传输:**SDA**(Serial Data Line)用于数据传输,**SCL**(Serial Clock Line)用于同步时钟信号。I2C协议支持多主多从架构,允许在单一总线上连接多个主设备和从设备[^2]。 ### 二、IIC通信的工作原理 #### 1. 总线空闲状态 在IIC总线空闲状态下,SDA和SCL两条信号线均处于高电平状态。这种状态由外部上拉电阻维持,所有连接到总线的设备都处于释放状态,即它们的输出场效应管(FET)处于截止状态[^5]。 #### 2. 数据有效性与传输方向 IIC协议中,数据的传输是在SCL高电平时进行的,而SDA线上的数据变化只能发生在SCL低电平时。当SCL为高电平时,SDA线上的数据必须保持稳定,否则会被误认为是起始或结束信号[^1]。 #### 3. 起始信号与结束信号 - **起始信号(START)**:当SCL为高电平时,SDA线从高电平跳变为低电平,表示一次数据传输的开始。 - **结束信号(STOP)**:当SCL为高电平时,SDA线从低电平跳变为高电平,表示一次数据传输的结束。 #### 4. 地址与方向控制 IIC协议中,每个从设备都有一个唯一的7位地址。在数据传输开始时,主设备发送一个8位的地址字段,其中前7位是设备地址,最后1位表示数据传输方向(0表示写操作,1表示读操作)[^3]。 ### 三、IIC数据传输方式 #### 1. 写操作时序 在写操作中,主设备首先发送起始信号,接着发送从设备地址和写方向位(0),然后发送要写入的数据。每发送一个字节后,从设备会返回一个应答信号(ACK),表示数据已正确接收。若从设备未返回ACK,则表示非应答(NACK)[^1]。 #### 2. 读操作时序 读操作与写操作类似,不同之处在于主设备在发送地址时将方向位设置为1。从设备在接收到地址后开始发送数据,主设备在接收到每个字节后发送ACK信号,表示希望继续接收。当主设备发送NACK时,表示接收结束。 ### 四、IIC通信的应答机制 在IIC通信中,每次传输一个字节后,接收方必须发送一个应答信号(ACK)。ACK的定义是:在第9个SCL周期中,SDA为低电平。如果SDA为高电平,则表示非应答(NACK),通常用于指示数据接收失败或传输结束[^4]。 ### 五、IIC通信的时序图 IIC通信的典型时序图包括以下几个阶段: 1. **起始信号**:SCL高电平时SDA下降沿。 2. **地址传输**:发送7位从设备地址和1位方向位。 3. **应答信号**:接收方在第9个SCL周期返回ACK或NACK。 4. **数据传输**:每次传输一个字节,高位(MSB)先传。 5. **结束信号**:SCL高电平时SDA上升沿。 以下是一个简化的IIC写操作时序示例: ``` SCL: |‾‾| |‾‾| |‾‾| |‾‾| |‾‾| |‾‾| |‾‾| |‾‾| |‾‾| |‾‾| |‾‾| |‾‾| |‾‾| SDA: ↓ ↑ ↓ [START] 1 0 1 0 0 0 0 0 [ACK] D7 D6 D5 D4 D3 D2 D1 D0 [ACK] [STOP] ``` ### 六、IIC通信的实现示例 以下是一个基于STM32微控制器的IIC通信示例代码,用于读取AT24C02 EEPROM芯片的数据: ```c #include "stm32f10x.h" // 模拟IIC引脚定义 #define SDA_PIN GPIO_Pin_10 #define SCL_PIN GPIO_Pin_11 #define I2C_PORT GPIOB // IIC初始化 void I2C_Init(void) { GPIO_InitTypeDef GPIO_InitStruct; RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE); GPIO_InitStruct.GPIO_Pin = SDA_PIN | SCL_PIN; GPIO_InitStruct.GPIO_Mode = GPIO_Mode_Out_OD; GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz; GPIO_Init(I2C_PORT, &GPIO_InitStruct); // 初始化为空闲状态 SDA_H(); SCL_H(); } // 起始信号 void I2C_Start(void) { SDA_H(); SCL_H(); Delay_us(5); SDA_L(); Delay_us(5); SCL_L(); } // 结束信号 void I2C_Stop(void) { SCL_L(); SDA_L(); Delay_us(5); SCL_H(); Delay_us(5); SDA_H(); } // 发送一个字节 void I2C_WriteByte(uint8_t byte) { for (int i = 0; i < 8; i++) { if (byte & 0x80) SDA_H(); else SDA_L(); SCL_H(); Delay_us(5); SCL_L(); byte <<= 1; } // 读取ACK SDA_H(); SCL_H(); Delay_us(5); SCL_L(); } // 读取一个字节 uint8_t I2C_ReadByte(void) { uint8_t byte = 0; SDA_H(); for (int i = 0; i < 8; i++) { byte <<= 1; SCL_H(); if (GPIO_ReadInputDataBit(I2C_PORT, SDA_PIN)) byte |= 0x01; SCL_L(); } return byte; } int main(void) { uint8_t data; I2C_Init(); I2C_Start(); I2C_WriteByte(0xA0); // 写地址 I2C_WriteByte(0x00); // 内部地址 I2C_Start(); I2C_WriteByte(0xA1); // 读地址 data = I2C_ReadByte(); I2C_Stop(); while (1); } ``` ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值