IIC总线

IIC(Inter-Integrated Circuit)总线是一种两线式串行总线,用于微控制器与其外围设备间的通信。文章讨论了IIC的传输速率确定、软件模拟中的延迟设置,以及地址比较和总线协议的特性。IIC协议包括开始信号、结束信号和应答信号,并且是半双工通信,每次数据传输后需要主从设备进行应答。在模拟IIC时序时,应参考目标设备的数据手册,例如STM32与AT24C02之间的通信需遵循AT24C02的时序图。

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

问题:

  • IIC传输速率怎么确定?软件模拟中的延迟时间怎么确定?
  • 发送设备地址时,比较设备地址怎么理解
  • IIC好像并不是一个很严谨的协议

IIC(Inter-Integrated Circuit)总线是一种由 PHILIPS 公司开发的两线式串行总线,用于连接微控制器及其外围设备。它是由数据线 SDA 和时钟 SCL 构成的串行总线,可发送和接收数据。在 CPU 与被控 IC 之间、IC 与 IC 之间进行双向传送,高速 IIC 总线一般可达 400kbps 以上。
在这里插入图片描述
在这里插入图片描述

  1. IIC是两线式串行总线,包括SCL(时钟线)和SDA(数据线)。SCL进行时钟同步,SDA进行数据发送和接收。即SDA是双向的,所以软件模拟IIC时需要不停的对SDA的引脚进行配置
#define SDA_IN()  {GPIOB->CRL&=0X0FFFFFFF;GPIOB->CRL|=(u32)8<<28;}		//配置PB7为上拉/下拉输入模式
#define SDA_OUT() {GPIOB->CRL&=0X0FFFFFFF;GPIOB->CRL|=(u32)3<<28;}		//配置PB7为通用推挽输出模式(50MHz)
  1. I2C总线通过上拉电阻接正电源。即当总线空闲时,两根线均为高电平。如此,连在总线上的任一器件输出的低电平,都可以使得总线的信号变低,也就是说各器件的SDA和SCL都是线"与"关系。如下图 R34,R35所示。
    在这里插入图片描述
  2. I2C是同步串行总线,由SCL为所有设备提供统一的时钟信号。 即使多个节点发送时钟信号时,由于SCL"线与"的原因,SCL上为统一的时钟信号。为了时钟信号的统一,我们假定同一时刻只有一个设备发出时钟信号,该设备称为主机。其他IIC设备作为从机存在。
    IIC也是一主多从模式,不过没有固定的主从设备,每个设备都可以是主设备,但同一时刻只有一个主设备(发出时钟信号的)。
  3. 数据位(1\0)有效性规定:I2C总线进行数据传送时,时钟信号为高电平期间,SDA线上的数据必须保持稳定;只有在SCL线的信号为低电平器件,SDA线的才可进行高低电平状态变化。
    在这里插入图片描述
  4. I2C 总线在传送数据过程中共有三种类型信号, 它们分别是:开始信号、结束信号和应答信号。
    开始信号:SCL 为高电平时,SDA 由高电平向低电平跳变(下降沿),开始传送数据。
    结束信号:SCL 为高电平时,SDA 由低电平向高电平跳变(上升沿),结束传送数据。
    应答信号:接收数据的 IC 在接收到 8bit 数据后,向发送数据的 IC 发出特定的低电平脉冲,表示已收到数据。
    这些信号中,起始信号是必需的,结束信号和应答信号,都可以不要。
    在这里插入图片描述
信号 SCL SDA 注意
开始信号 由高到低 跳变前高电平持续时间要大于4.7us且SDA的低电平持续时间要大于4us
停止信号 由低到高 跳变前低电平持续时间要大于4us且SDA的高电平持续时间要大于4.7us
  1. 模拟IIC时序要以被操作对象的数据手册里时序图。STM32与AT24C02通过模拟IIC通信,延迟时间以AT24C02时序图为准。
    AT24C02 Bus Timing
    上图为AT24C02 IIC总线时序图。
    在这里插入图片描述
    在这里插入图片描述
t_LOW 脉冲低电平保持时间
t_HIGH 脉冲高电平保持时间
t_HD.STA 开始信号保持时间
t_SU.STA 开始信号建立时间
t_HD.DAT 数据保持时间
t_SU.DAT 数据建立时间
tSU.STO 停止信号建立时间
  1. IIC是半双工方式,所以每次数据传输完成后,需要主从设备进行数据应答。
    帧格式包括:起始信号+ACK+设备地址+ACK+字地址+ACK+DATA+ACK+停止信号
    在这里插入图片描述
    在这里插入图片描述
  2. IIC主机发送起始信号后发送的是"片选信号",即7位从机地址加1位方向(读写)控制。主机向从机发送地址,所有的从机都能接收到主机发出的地址,然后每个从机都将主机发出的地址与自己的地址比较,如果匹配上了,这个从机就会向主机发出一个响应信号。主机收到响应信号后,开始向总线上发送数据,与这个从机的通讯就建立起来了。如果主机没有收到响应信号,则表示寻址失败。
代码解析
#define SDA_IN()  {GPIOB->CRL&=0X0FFFFFFF;GPIOB->CRL|=(u32)8<<28;}		//配置PB7为上\下拉输入
#
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值