Stm32之I2C通信的使用(基于PCF8591)
I2C协议简介
I2C (Inter-Integrated Circuit),是一种串行通信总线,用于连接微控制器及其外围设备,达到主控制器和从器件间的主从双向通信,是一种同步半双工通信(两端时钟频次一致,双向通信,但不能同时进行数据收发)。
///插播一条:我自己在今年年初录制了一套还比较系统的入门单片机教程和毕业设计指导,想要的同学找我拿就行了免費的,私信我就可以哦~点我头像白色字体加我也能领取哦,记得口令一哥///
I2C通信属于串行通信,具有两根串行信号线:数据线(SDA),时钟线(SCL)。如下图所示,主控制器与从器件(一个或多个)都通过两根信号线连接,信号线上主机和从机都能够扮演发送器和接管器的角色。为确保传输过程的指向精确性,每个接到I2C总线上的器件都有唯一的地址(7位从器件专用地址码),可达到制定从机的定向传输与群发传输。
物理层
IIC物理层
其具有以下特性:
一个 I2C 总线只运用两条总线线路,一条双向串行数据线(SDA),一条串行时钟线(SCL)。数据线即拿来表示数据,时钟线用于数据收发同步。
每个连接到总线的设备都有一个独立的地址,主机能够利用这个地址进行不同设备之间的访问。
它是一个支持设备的总线。“总线”指多个设备共用的信号线。在一个 I2C 通讯总线中,可连接多个 I2C 通讯设备,支持多个通讯主机及多个通讯从机。
总线通过上拉电阻接到电源,当 I2C 设备空闲时,会输出高阻态,而当所有设备都空闲,都输出高阻态时,由上拉电阻把总线拉成高电平,能够参见GPIO的开漏输出模式。
协议层
IIC协议层
如图为I2C通信的流程,能够总结如下(概要,详细细节还得看手册):
主机(MCU)的I2C接口发出一个起始信号(S),告诉从机(SLAVE,奴隶,很形象哈哈)我要初始传输数据啦
此时所有从机都会收到这个信号,但是,到底是哪个从机要进行数据的读写呢?,这个时候主机就会广告从机地址(SLAVE ADDRESS,注意每个从机都有唯一的地址),告诉指定的从机要和你进行通信,以及是读数据还是写数据(1为读,0为写)
被选定的从机此时要给出一个应答信号,告诉主机到底要不要进行通信
0000四.假如从机容许的话就能够进行通信了,假如要停下,主时机发送一个停下信号(P),告诉从机到此完毕
STM32的I2C架构
架构就没什么好说的了,图里一看就明白。
基于PCF8591的I2C通讯程序分析