IIC协议详解
IIC由Philips公司开发的一种通用数据总线,只需两根通信线:SCL、SDA,特点:同步通信、半双工(可以双向传输但不能同时)通信模式可为一主多从、多主多从;
IIC介绍
IIC(Inter IC Bus)由Philips公司开发的一种通用数据总线,
只需两根通信线:SCL、SDA,
特点:同步通信、半双工(可以双向传输但不能同时)
通信模式可为一主多从、多主多从;
IIC的硬件电路---上拉电阻与开漏输出
IIC的SCL和SDA均采用上拉电阻连接至VDD,并采用开漏输出模式控制引脚,使通信时序中的高电平由VDD上拉实现,低电平由引脚输出下拉至GND实现。
总线上的多个设备通过 "线与" 逻辑共享总线:当任何一个设备将总线拉低(输出低电平)时,总线整体为低电平;只有所有设备都释放总线(处于高阻态)时,总线才能恢复高电平。

为什么要使用上拉电阻?
因为SCL、SDA引脚被多个设备所控制(SCL在多主机模式下也是被多设备控制),为了避免形成短路的VDD直连GND,故引脚均采用开漏输出模式,而IIC规定引脚空闲状态均为高电平,因此需要用上拉电阻实现;
上拉电阻的核心作用是配合开漏输出,既避免多设备同时驱动时的短路风险,又能实现总线空闲时的高电平定义,同时保证电平切换速度和支持多设备通信的仲裁机制(当多个主设备竞争总线时,只要有一个设备输出低电平,总线就为低电平)
IIC时序单元
IIC的起始和终止

起始条件:SCL为高时,SDA出现下降沿
终止条件:SCL为高时,SDA出现上升沿
在正常的IIC时序中,SDA只允许在SCL的低电平期间切换电平,只有在起始和终止时,是在SCL保持高电平时切换SDA电平
IIC的字节发送过程
注意IIC与SPI都是先发送高位,UART先发送低位

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

主机接收一个字节:SCL低电平期间,从机将数据位依次放到SDA线上(高位先行),然后释放SCL,主机将在SCL高电平期间读取数据位,所以SCL高电平期间SDA不允许有数据变化,依次循环上述过程8次,即可接收一个字节(主机在接收之前,需要释放SDA)虚线代表从机操作
主机到从机的SDA切换过程:主机先释放(拉高)SDA,然后从机立即接管(拉低),开始写入

发送应答:主机在接收完一个字节之后,在下一个时钟发送一位数据,数据0表示应答,数据1表示非应答
接收应答:主机在发送完一个字节之后,在下一个时钟接收一位数据,判断从机是否应答,数据0表示应答,数据1表示非应答(主机在接收之前,需要释放SDA)
主机或从机应答即为拉低SDA,在此之前另一方需要释放SDA即恢复到上拉。
IIC设备读写
IIC设备具有7位(常)或10位的设备地址,且在访问设备时还需指定设备的寄存器地址
IIC通信的第一个字节常为7位地址加1位读写控制,读为1写为0,第二个字节为要操作的寄存器地址,第三个字节为主机写入的数据或是从机写出(主机读取)的数据
指定地址写
对于指定设备(Slave Address),在指定地址(Reg Address)下,写入指定数据(Data)

当主机要连续写时,只需在接收到从机应答后,去掉最后的终止操作,继续写入下一字节数据即可
当前地址读
对于指定设备(Slave Address),在当前地址指针指示的地址下,读取从机数据(Data)

此模式下,先写设备地址+读指令,然后自动读取从机的当前寄存器地址数据
指定地址读
对于指定设备(Slave Address),在指定地址(Reg Address)下,读取从机数据(Data)
过程:假写指令+设备地址+假写寄存器地址,用于将从机设备的地址指向待读取地址,然后进行当前地址读操作
当主机要连续读时,只需在最后进行发送应答即拉低SDA,然后再释放(拉高)SDA给从机
当停止时,主机发送非应答拉高SDA,再进行终止操作(如图最后两部分)
STM32F103C8T6的IIC外设
STM32内部集成了硬件I2C收发电路,可以由硬件自动执行时钟生成、起始终止条件生成、应答位收发、数据收发等功能,减轻CPU的负担
支持多主机模型
支持7位/10位地址模式
支持不同的通讯速度,标准速度(高达100 kHz),快速(高达400 kHz)
支持DMA
兼容SMBus协议
STM32F103C8T6 硬件I2C资源:I2C1、I2C2

更多推荐



所有评论(0)