简单介绍IIC通信协议

一,简单介绍

​ IIC Bus是飞利浦公司推出的,在电子控制领域的通信协议典型的电压准位是3.3v和5v。**IIC 是串行,同步的半双工协议。**IIC的电路简单,连接线少,控制简单,通信速率高。

二,IIC物理层

  • IIC总线是一种主从结构(master/slave)的总线协议,一条总线上的每一个设备都可以作为主设备或从设备使用,但是一般一条总线上只有一个主设备,主设备通常是CPU,从设备通常是各种传感器,一般来讲,从设备只能被动的接收主设备的通信请求,也就是说,通信的开始往往是主设备主机发起的
  • IIC具有SCL时钟线和SDA数据线两条线来传输数据。
  • IIC寻址:每一个从设备都有自己一个独一无二的7bit地址(其实还有一位读写位组成一字节八位)物理识别,这个地址固化在芯片内部,从datasheet上就可以找到对应的IIC地址。全0是IIC的广播地址。除此之外,IIC还有一种10bit地址的寻址方式。
  • 具有三种传输模式,标准模式传输速率100kbit/s,快速模式400kbit/s,高速模式3.4Mbit/s,但是大部分的IIC设备目前不支持高速模式。
  • 连接到相同总线的IIC设备的数量收到总线最大电容400pF的限制。

IIC寻址:

# 7bit寻址:每一个从设备都有自己一个独一无二的7bit地址(其实还有一位读写位组成一字节八位)物理识别,这个地址固化在芯片内部,从datasheet上就可以找到对应的IIC地址。全0是IIC的广播地址。除此之外,IIC还有一种10bit地址的寻址方式。
# 10bit寻址:10bit寻址是和7bit寻址相兼容的这样就可以在一条线上兼容使用了,10bit地址传输时,总共占两个字节,前5bit用来选择寻址模式,剩下三位中,两位是地址高位ADDRESS9,和ADDRESS8,最后一位依旧是读写位置,剩下的第二个字节就是剩下的地址,即ADDRESS7~ADDRESS0。

三,IIC通信时序

1.起始位与停止位

​ 首先,一般情况下,IIC的SDA和SCL线是被上拉电阻拉高的,也就是说,默认情况下的SDA线和SCL线是高电平的。

  • 起始位s位:SCL时钟线保持高电平,SDA出现一个下降沿。
  • 停止位p位:SCL时钟线保持高电平,SDA出现一个上升沿。

在这里插入图片描述

2.IIC读写地址位信号

​ 在发出start起始位信号后,第二个时序应该立刻给出从机的目标物理地址(7bit或10bit地址),而站在主设备的角度来讲有读/写从设备两个功能。

  • 8bit时,高7位表示从机的地址,最低的一位表示读写方向。
  • 0为写操作,1为读操作。

3.IIC应答信号

​ 应答信号分为两种,一种是希望继续进行通信的ACK信号,一种是NACK的结束信号。主机在发送start信号和地址,读写信号后,主机将释放对SDA的限制权,SDA电平被上拉电阻拉高,由接收方(从机)控制。

  • ACK应答信号:希望继续通信,SCL低电平时,从机将把SDA改为低电平
  • NACK应答信号:不希望继续通信,SCL低电平时,从机将把SDA保持高电平

4.IIC数据位收发信号

​ IIC的数据收发时,每个字节必须是8个字节。同时是采用MSB字节序收发的。**高电平是1,低电平是0。**SCL高电平期间,SDA必须保持稳定,高低电平的跳变,必须在SCL低电平期间进行跳变,(因为SCL高电平期间,SDA的变化代表的是信号的起始位和终止位)。数据收发时,每个字节收发结束后必须跟一个ACKX信号或者NACK信号。

在这里插入图片描述

所以读取数据位时,应该在SCL为高电平时进行读取,因为这时候SDA线上的电平是保持稳定的。

四,总线速率

I2C 总线是一种同步、半双工、采用电平信号收发的串行总线,其速率支持:

  • 标准模式(Standard-mode):速率高达 100kbit/s。
  • 快速模式(Fast-mode):速率高达 400kbit/s。
  • 快速模式+(Fast-mode Plus):速率高达 1Mbit/s。
  • 高速模式(High-speed mode):速率高达 3.4Mbit/s
  • 超快速模式(Ultra Fast-mode):速率高达 5Mbit/s (单向传输时支持)

五,主机发送数据流程

  1. 主机检测到总线是空闲的,发送s信号(即起始位)。开始通信。(r/w=0)
  2. 紧接着主机发送目标从机的地址以及读写位。
  3. 对应的从机返回ACK信号。(SDA低电平0)
  4. 主机发送8bit一字节的数据。
  5. 从机接收数据后返还ACK应答信号。
  6. 主机收到ACK数据后继续发送下一个数据字节。
  7. 主机发送完最后一个字节并收到ACK信号后,发送P停止位信号,结束本次通信并且释放总线。
  8. 从机收到P信号后退出通信。

在这里插入图片描述

六,主机接收数据流程

  1. 主机发送s信号(即起始位)。开始通信。(r/w=1)
  2. 紧接着发送要从哪一个从机接收地址,和读写位。
  3. 从机返回应答信号后向主机发送数据。
  4. 主机收到数据后向从机发送ACK信号。
  5. 从机接收到应答信号后继续发送数据。反复循环。
  6. 当主机发现接收数据后,向从机发送NACK信号,从机收到非应答信号后停止发送。
  7. 主机发送非应答信号后,发送P停止信号,主机和从机停止通信。

在这里插入图片描述

七,IIC的时钟延展(clock strectching)

​ 首先,什么是时钟延展呢?一般情况下来说,IIC的时钟是由主机cpu提供的,但是有的时候从设备的速率跟不上主设备的速率。例如,一个从机温湿度传感器的速率比较慢,没采集到温度的时候怎么办呢?总不能发空数据回去给主机吧,这个时候支持时钟延展的设备会“等待”,即从机主动拉低时钟信号,等采样结束后,从机再给主机一个ACK信号告诉主机可以继续通信。

  • 26
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
IIC(Inter-Integrated Circuit)通信协议是一种串行通信协议,也被称为I2C(Inter-IC)协议。它是由飞利浦(Philips)公司在1982年开发的,用于在集成电路之间进行通信。 在Keil软件中,可以使用C语言编写IIC通信协议的代码。下面是一个简单的示例代码,用于在Keil中实现IIC通信协议: ```c #include <reg51.h> // 定义IIC通信相关的引脚 sbit SDA = P1^0; sbit SCL = P1^1; // IIC起始信号 void IIC_Start() { SDA = 1; SCL = 1; delay(); // 延时一段时间 SDA = 0; delay(); SCL = 0; } // IIC停止信号 void IIC_Stop() { SDA = 0; SCL = 1; delay(); SDA = 1; delay(); } // IIC发送一个字节的数据 void IIC_SendByte(unsigned char dat) { unsigned char i; for (i = 0; i < 8; i++) { SDA = (dat & 0x80) >> 7; // 发送数据的最高位 dat <<= 1; SCL = 1; delay(); SCL = 0; delay(); } } // IIC接收一个字节的数据 unsigned char IIC_ReceiveByte() { unsigned char i, dat = 0; SDA = 1; for (i = 0; i < 8; i++) { dat <<= 1; SCL = 1; delay(); dat |= SDA; // 接收数据的最高位 SCL = 0; delay(); } return dat; } // 延时函数 void delay() { unsigned int i, j; for (i = 0; i < 100; i++) for (j = 0; j < 100; j++); } int main() { // 主控制器初始化 SDA = 1; SCL = 1; // 发送数据 IIC_Start(); IIC_SendByte(0x50); // 发送设备地址 IIC_SendByte(0x01); // 发送数据 IIC_Stop(); // 接收数据 IIC_Start(); IIC_SendByte(0x51); // 发送设备地址 unsigned char data = IIC_ReceiveByte(); // 接收数据 IIC_Stop(); while (1); } ``` 这段代码实现了IIC通信协议的基本功能,包括发送起始信号、停止信号、发送数据和接收数据等操作。你可以根据具体的需求进行修改和扩展。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值