GPIO模拟I2C(附实例)
谷子
|
2019.12.24
|
0
+关注

I2C总线是一种简单、双向二线制同步串行总线。它只需要两根线即可在连接于总线上的器件之间传送信息。这两根线分别是:SDA(串行数据线)和SCL(串行时钟线)。按照约定,一般把数据传送到总线上的器件定义为发送器,接收数据的器件为接收器。控制总线的称为主机,主机为所有操作产生时钟,所有在总线上被控制的称为从机。

二线制协议即是总线上的所有的操作都是由SDA和SCL两个脚位的状态来确定的,共有四个状态:开始、停止、数据以及应答。在I2C总线不工作的情况下,SDA(数据线)和SCL(时钟线)上的信号均为高电平。

开始:当主机把SDA从高电平拉为低电平,同时SCL为高电平时被认定是开始信号,所有的读写操作均由开始信号开始。

停止:当主机把SDA从低电平拉为高电平,同时SCL信号为高电平时被认定是停止信号,从机所进行的所有操作都必须以此信号结束。如果一个操作还未完成而此时出现了一个停止信号,那么这个操作将被终止。

数据/地址传送:所有数据传送(包括地址)都发生在SCL为高电平的时候,除了以上两种情况外,SDA信号在SCL为高电平时不能改变。I2C总线的数据通信是以字节(8位)作为基本单位在SDA上进行串行传输的。一个字节的传输需要9个时钟周期。其中,字节中每一位的传输都需要一个时钟周期,当新的SCL到来时,SCL为低电平,此时数据发送方根据当前传输的数据位控制SDA的电平信号。如果传输的数据位为"1",就将SDA电平拉高;如果传输的数据位为"0",就将SDA的电平拉低。当SDA上的数据准备好之后,SCL由低变高,此时数据接收方将会在下一次SCL信号变低之前完成数据的接收。当8位数据发送完成后,数据接收方需要一个时钟周期以使用SDA发送ACK信号,表明数据是否接收成功。

应答:在任何传送中,应答信号出现在第8位数据位被传送之后,在这个状态下,发送方应释放SDA信号以便由接收方驱动。接收方驱动SDA为低电平,以应答收到一个字节数据。如果接收方没有发出应答信号,那么这是一个无应答状态,操作将被终止。

本例中使用微控制器的GPIO口模拟I2C来实现数据的传输。下图红框中为两个模拟I2C的GPIO端口。

对GPIO端口做出如下配置:

为了方便使用,定义如下宏:

下面截图为实现I2C四个状态的源码:

精选留言
延伸阅读
2020.04.03
4749阅读
更多报告干货
写留言
2351
阅读
收藏
回到顶部