嵌入式 IIC(I2C)协议

简介: 嵌入式 IIC(I2C)协议

一、IIC(I2C)的介绍

 IIC(I2C)总线:是Philips公司推出的串行总线标准(为二线制,不包括地线)。总线上扩展的外围器件以及外设接口通过总线寻址,是具备总线仲裁和高低速设备同步(时钟线)等功能的高性能多主机总线。

作用:

串口:STM32跟电脑进行通信;

IIC:两个器件之间进行相互通信。(STM32跟AT24C02之间通信,所以两个通信的器件必须具备IIC总线接口)。

二、工作原理

串行数据线SDA和串行时钟线SCL构成的,可发送和接收数据。IIC 是由数据线和时钟线组成的。

硬件连接图:

所有挂接在I2C总线上的器件和接口电路都应具有I2C总线接口,且所有的SDA/SCL同名端相连总线上所有器件要依靠SDA发送的地址信号寻址,不需要片选线。

特点:

组成系统结构简单,占用空间小,芯片管脚的数量少,无需片选信号,价格低。

允许若干兼容器件共享总线,应用比较广泛。

总线的长度可达7.6m,传送速度:快速IIC 400kbps ,标准IIC 100kbps,高速IIC 1M bps。

支持多个组件。支持多主控器件(某时刻只能有一个主控器件)。

I2C总线上所有设备的SDA, SCL引脚必须外接上拉电阻

开发板上的AT24C02 接了STM32 的硬件IIC接口,但是 STM32的IIC硬件接口存在BUG.所以我们不用

它的硬件IIC接口,直接用IO口模拟的方法。 IIC的的通信速并不快,用IO口模拟的方法完全可以达到它的通信速度。

IO口模拟:读 、写 数据的过程都是通信代码来完成的,所以速度会比较慢。

硬件接口:读 、写 数据的过程由硬件功能自主完成。速度会比较快。

三、IIC总线协议

时序图:

 

从时序图可以得到 :

1. MSB--> 高位先发(IIC)  ; LSB : --> 低位先发(串口)

2.起始信号:SCL为高电平期间,SDA由高电平向低电平跳变。

void IIC_Start(void)
{
SCL=1;
SDA=1;
delay_us(5);
SDA=0;
delay_us(5);
SCL=0;
}

3.停止信号:SCL为高电平器件,SDA由低电平向高电平跳变。

4.应答信号:每个字节(8bit)传输完成后的下一个时钟信号,在SCL为高电平器件,SDA为低电平,则表示一个应答信号;

IIC里面应答信号非常重要,IIC要求:接收方没接收一个数据都必须要给发送方一个应答;

应答: 主机给从机的应答, 从机给主机的应答! ! ! !

主机可以给 2 种应答:

1. 主机给应答-------继续给数据

2. 主机给非应答-------不需要再给数据了

应答信号的产生:

在主机发送数据完成后, 从机就会给出应答信号, 应答信号就是SDA 拉为低电平! ! !

主机可以读取SDA的电平状态来判断 从机是否给出应答信号

主机接收到数据后, 主机把 SDA 拉为低电平表示应答, 拉为高电平表示非应答! ! ! !

注意: IIC 里面应答信号也需要一个完整的时钟周期! ! ! ! !

同样这个应答信号也是在 SCL

  1. 非应答信号:每个字节( 8bit) 传输完成后的下一个时钟信号, 在 SCL 为高电平期间, SDA 为高, 则表示一个非应答信号(ack)。
  2. 空闲状态: SCL为高电平,SDA为高电平。

注意: 起始和停止信号总是由主设备发出。 应答信号和非应答信号是由接收数据方发出,发送数据方则是检测这个信号。 主机和从机都可以发生应答信号和非应答信号。

四、IIC数据的发送和接收

  1. 数据的发送过程

IIC 属于串行通信, 数据位也是一个位一个位的发送, IIC 里面固定是高位先发送! ! !

IIC 通信在 SCL 变为低电平后给出数据, 高电平采样数据! ! ! !

发送数据:

低电平主机给数据

高电平从机采样数据

记得: IIC 采用模拟时序的时候, 时钟采用: 低—高—低

 

void IIC_Send_byte(u8 data)
{
int i=8;
While(i--)
{
SCL=0;
if(data&0x80)
{
SDA=1
}
}
else
SDA=0;
data<<=1;
SCL=1;
}

2.数据的接收过程

IIC 通信在 SCL 变为低电平后给出数据, 高电平采样数据! ! ! !

接收数据:

低电平从机给数据

高电平主机采样数据

记得: IIC 采用模拟时序的时候, 时钟采用: 低

注意: SCL 的高电平的持续时间! ! ! ! !

高电平时间: 标准 IIC 4.0  us, 快速 IIC 0.6  us

低电平时间: 标准 IIC 4.7  us, 快速 IIC 1.3  us

u8 IIC_res_byte(void)
{
  u8 data=0;
  u8 i=8;
  while(i--)
{
  data<<=1;
  SCL=1;
  if(SDA)
    Data |= 0x01;
 }
}


相关文章
|
2天前
|
传感器 监控 芯片
嵌入式系统中MCU与SoC通信方式的选择与应用
嵌入式系统中MCU与SoC通信方式的选择与应用
86 3
|
2天前
|
网络协议 Linux
嵌入式单片机开源的串口示波器实现方法
嵌入式单片机开源的串口示波器实现方法
26 0
|
7月前
|
网络协议 算法 网络架构
嵌入式 STM32 通讯协议--MODBUS
嵌入式 STM32 通讯协议--MODBUS
|
7月前
嵌入式 串口通信
嵌入式 串口通信
|
7月前
|
数据格式
嵌入式 STM32 红外遥控
嵌入式 STM32 红外遥控
|
10月前
|
传感器 存储 芯片
STM32F407硬件I2C实现MPU6050通讯(CUBEIDE)
STM32F407硬件I2C实现MPU6050通讯(CUBEIDE)
191 0
|
12月前
|
Linux API 芯片
USB2S可编程USB转串口适配器开发原理的通讯协议
USB2S可编程USB转串口适配器基于FTDI FT2232H芯片设计,对多种通讯协议的支持,包括UART,I2C,SMBus,1-Wire,SPI,CAN和PWM等。
USB2S可编程USB转串口适配器开发原理的通讯协议
15 玩转STM32之IIC通信(芯片硬件篇)(上)
15 玩转STM32之IIC通信(芯片硬件篇)
15 玩转STM32之IIC通信(芯片硬件篇)(下)
15 玩转STM32之IIC通信(芯片硬件篇)
【嵌入式】STM32通讯方式
【嵌入式】STM32通讯方式
81 0