STM32通信模拟I2C
Posted studying~
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了STM32通信模拟I2C相关的知识,希望对你有一定的参考价值。
I2C:两线式串行总线,是一种是半双工通信方式,由飞利浦公司开发用于让主板、嵌入式系统或手机连接低速周边设备。如今在嵌入式领域是非常常见通信协议,常用于MPU/MCU与外部设备连接通信、数据传输。
I²C由两条线组成,一条双向串行数据线SDA,一条串行时钟线SCL。每个连接到总线的设备都有一个独立的地址,主机可以通过该地址来访问不同设备。因为I²C协议比较简单,常常用GPIO来模拟I²C时序,这种方法称为模拟I²C。如果使用MCU的I²C控制器,设置好I²C控制器, I²C控制器就自动实现协议时序,这种方式称为硬件I²C。因为I²C设备的速率比较低,通常两种方式都可以,模拟I²C方便移植,硬件I²C工作效率相对较高。
I2C协议
空闲状态
开始信号
停止信号
应答信号
数据的有效性
数据传输
1)空闲状态
I2C总线的SDA和SCL两条信号线同时处于高电平时,规定为总线的空闲状态。
2)开始信号与停止信号(是一种电平跳变时序信号,而不是一个电平信号)
起始信号:当SCL为高期间,SDA由高到低的跳变;
停止信号:当SCL为高期间,SDA由低到高的跳变;
3)应答信号ACK
主机每发送一个字节,就在时钟脉冲9期间释放数据线,由从机反馈一个应答信号。 应答信号为低电平时,规定为有效应答位(ACK简称应答位),表示从机已经成功地接收了该字节;应答信号为高电平时,规定为非应答位(NACK),一般表示从机接收该字节没有成功。
对于反馈有效应答位ACK的要求是,从机在第9个时钟脉冲之前的低电平期间将SDA线拉低,并且确保在该时钟的高电平期间为稳定的低电平。
4)数据有效性
I2C总线进行数据传送时,时钟信号为高电平期间,数据线上的数据必须保持稳定,只有在时钟线上的信号为低电平期间,数据线上的高电平或低电平状态才允许变化。
即:数据在SCL的上升沿到来之前就需准备好。并在在下降沿到来之前必须稳定。
5)数据的传送
在I2C总线上传送的每一"位"数据都有一个时钟脉冲相对应(或同步控制),即在SCL串行时钟的配合下,在SDA上逐位地"串行"传送每一位数据。
完整传输流程
I²C完整传输流程如下:
① SDA和SCL开始都为高,然后主机将SDA拉低,表示开始信号;
② 在接下来的8个时间周期(对应8个位)里,“主机控制SDA的高低,发送从机地址”。其中第8位如果为0,表示接下来是写操作,即主机传输数据给从机;如果为1,表示接下来是读操作,即从机传输数据给主机;另外,数据传输是从最高位到最低位,因此传输方式为MSB(Most Significant Bit)。
③ 总线中对应从机地址的设备,发出应答信号;
④ 在接下来的8个时间周期里,如果是写操作,则主机控制SDA的高低;如果是读操作,则从机控制SDA的高低;
⑤ 每次传输完成一个字节的数据,接收数据的设备,都发出应答信号;
⑥ 最后,在SCL为高时,主机由低拉高SDA,表示停止信号,整个传输结束;
EEPROM :是一种用于存放用户配置信息数据的”存储器“,比如在开发板首次运行时,需要屏幕校准,校准后的配置信息就可以保存在EEPROM里,开发板断电后配置信息不丢失,下次启动,开发板自动读取EEPROM的校准配置信息,就不需要重新校准。
EEPROM和Flash的本质上是一样的,但从功能上,Flash通常存放运行代码,运行过程中不会修改,而EEPROM存放用户数据,可能会反复修改。
EEPROM类型众多,本开发板上的EEPROM型号为AT24C02,其存储容量为2K Bit,2*1024=2048Bit=256Byte。
设备地址
每个连接到I2C总线的设备都有一个独立的地址,不同容量的AT24C02,设备地址定义会有所差异,由芯片数据手册《AT24Cxx.pdf》可知,如图 19.1.7 所示。
AT24C02的容量为2K,对应上图中的第一行,高四位固定为“1010”,中间三位由A2、A1、A0引脚的电平决定,比如A2~0引脚全接地,则值为“000”,最后的最低位为读写位,0代表写命令,1代表读命令。
写AT24Cxx
如图 19.1.8 所示,为AT24Cxx字节写模式的时序,在MCU发出开始信号(Start)后,发出8 Bit的设备地址信息(图中读写位为低电平,即写数据),待收到AT24Cxx应答信号后,再发出要写的数据地址,再次等待AT24Cxx应答,最后发出8 Bit数据写数据,待AT24Cxx应答后,发出停止信号(Stop),完成一次单字节写数据。
读AT24Cxx
在随机地址读模式下,需要先发送设备地址,待读的数据地址,接着再重新发出开始信号,设备地址,读出数据,时序如图 19.1.13 所示。
以上是关于STM32通信模拟I2C的主要内容,如果未能解决你的问题,请参考以下文章
STM32第七章: IIC(I2C Inter-Intergrated Circuit 集成电路总线) IIC时序图(IIC协议) I2C模拟时序STM32F4XX的IIC通信重载print
: IIC(I2C Inter-Intergrated Circuit 集成电路总线) IIC时序图(IIC协议) I2C模拟时序STM32F4XX的IIC通信重载print
: IIC(I2C Inter-Intergrated Circuit 集成电路总线) IIC时序图(IIC协议) I2C模拟时序STM32F4XX的IIC通信重载print
: IIC(I2C Inter-Intergrated Circuit 集成电路总线) IIC时序图(IIC协议) I2C模拟时序STM32F4XX的IIC通信重载print