1.前言
CSDN关于多路模拟I2C总线并行访问的资料很少,而且讲的我都没看明白,所以花时间研究了这个问题,算是实现了这方面的实现方案。
2.设计方案
假设有这样一个场景:你有6个传感器,它们的IIC地址相同,使用单片机实现6个传感器数据读取,要求IIC传输速率尽可能的快。
首先,硬件IIC数量无法满足,很少有单片机有六路硬件IIC总线。那一路挂载多个传感器呢?也不行,因为6个传感器的IIC地址相同。所以需要使用模拟IIC。这时,你会想到直接开6路模拟IIC,然后依次读取,这样实现起来很简单,但是传输速率会很慢。所以,为了最大程度提高传输速率,多个IIC总线并行传输是一个很好的方法,注意,这里的并行是指同一GPIO口的情况,比如A口从P0到P12,开6路I2C,实现6个SCL和SDA同时拉高拉低,这是真正意义上的并行,因为每个GPIO端口都有一组寄存器,通过直接操作这些寄存器,可以同时控制整个端口的所有IO口。
当然,在实际情况中,建议PA口开三路IIC,PB口开三路IIC。至于为什么不能在一个GPIO口同时开六路IIC,我也不清楚真正的原理,我所能理解并且解释的是单个GPIO口的负载能力无法实现,希望有知道不同原因的朋友能够分享。
3.代码实现
3.1 IIC.h
这是PA口实现三路并行模拟IIC总线,我先给出代码,再详细解释。这是IIC.h代码。
#ifndef __IIC_H__
#define __IIC_H__
#include "main.h"
#include "Delay.h"
#define SDA_GPIO_Port GPIOA
#define SCL_GPIO_Port GPIOA
//IIC总线1 SDA:PA11 SCL:PA12
#define SDA_Pin_1 GPIO_PIN_1
#define SCL_Pin_2 GPIO_PIN_2
//IIC总线2 SDA:PA3 SCL:PA4
#define S







