对于不同地址的模块就不用多说叻直接分别对其地址进行通信即可。那么若拿到相同地址的模块或者直接是相同的多个模块怎么办呢?
方法一:(内置了两种地址的模块)
方法二:(具有使能端的模块)
如果以上都不行那就只能方法三了。
万能方法三:(什么都没有仅有一种地址的模块)
用到的工具是模拟开关楼主以CD4053为例,这货非常便宜几元钱可以买一大把。
简单来说模拟开关相当於多个单刀双掷开关可以通过IO口输出高低电平控制某两路连通。
这样只需将A置高B、C置低,即可与模块1通信
故同理将B置高,A、C置低即可与模块2通信
故同理,将C置高A、B置低,即可与模块3通信
I2C总线的通信过程(见图4-8)主要包含三個主要阶段:起始阶段、数据传输阶段和终止阶段
在I2C总线不工作的情况下,SDA(数据线)和SCL(时钟线)上的信号均为高电平如果此时主机需要发起新的通信请求,那么需要首先通过SDA和SCL发出起始标志当SCL为高电平时,SDA电平从高变低这一变化表示完成了通信的起始条件。
在起始条件囷数据通信之间通常会有延时要求,具体的指标会在设备厂商的规格说明书中给出
I2C总线的数据通信是以字节(8位)作为基本单位在SDA上进行串行传输的。一个字节的传输需要9个时钟周期其中,字节中每一位的传输都需要一个时钟周期当新的SCL到来时,SCL为低电平此时数据发送方根据当前传输的数据位控制SDA的电平信号。如果传输的数据位为"1"就将SDA电平拉高;如果传输的数据位为"0",就将SDA的电平拉低当SDA上的数据准备好之后,SCL由低变高此时数据接收方将会在下一次SCL信号变低之前完成数据的接收。当8位数据发送完成后数据接收方需要一个时钟周期以使用SDA发送ACK信号,表明数据是否接收成功当ACK信号为"0"时,说明接收成功;为"1"时说明接收失败。每个字节的传输都是由高位(MSB)到低位(LSB)依次進行传输
I2C总线协议中规定,数据通信的第一个字节必须由主机发出内容为此次通信的目标设备地址和数据通信的方向(读/写)。在这个字節中第1~7位为目标设备地址,第0位为通信方向当第0位为"1"时表示读,即后续的数据由目标设备发出主机进行接收;当第0位为"0"时表示写即后续的数据由主机发出目标设备进行接收。在数据通信过程中总是由数据接收方发出ACK信号。
当主机完成数据通信并终止本次传输时會发出终止信号。当SCL 是高电平时SDA电平由低变高,这个变化意味着传输终止
下面给出了模拟I2C总线进行读写的伪代码,用以说明如何使用GPIO實现I2C通信: