本文主要讲解零知Lab开发板的IIC接口通信,由于I2C接口在软件上实现简单方便,因此我们直接使用软件方式的I2C接口,这样不仅可以满足我们需要多个I2C接口的需求,同时我们可以把I2C接口配置到不同的IO口,以方便我们在做自己的硬件时的PCB布线。
和上一篇一样我们在零知Lab中【新建工程】,工程名字为IIC-testing。建立工程后,输入以下测试代码:【新建工程】,工程名字为IIC-testing。
建好工程后输入以下代码:
/**
* 文件: IIC-testing.ino
* 作者: roc
* 时间: 2018/05/24 14:12
* 说明:
**/
#include <SoftWire.h>
SoftWire i2c_port; //定义I2C接口
#define LED LED_BUILTIN
#define I2C_ADDR 0x10 //I2C 从机地址
char led_flag = 0;
void setup() {
pinMode(LED, OUTPUT);
// 初始化I2C接口,如设置i2c的引脚
i2c_port.begin();
}
void loop() {
//写
i2c_port.beginTransmission(I2C_ADDR);
i2c_port.write(0x48);
i2c_port.endTransmission();
//读
i2c_port.requestFrom(I2C_ADDR,2);
byte data_msb = i2c_port.read();
byte data_lsb = i2c_port.read();
delay(200);
digitalWrite(LED, led_flag);
led_flag = 1-led_flag;
}
在上面的代码示例中,一般一个完整的I2C通信就如上面示例的流程中那样:先初始化I2C接口,再进行I2C的写操作和读操作。 上面代码中首先定义一个i2c接口 SoftWire i2c_port; 然后调用i2c_port.begin() 来初始化I2C接口,这里使用的i2c接口为软件方式,引脚为默认的一组引脚,如果需要使用自定义的I2C引脚可以这样做:定义SoftWire i2c_port(scl, sda, freq); 这里scl 和 sda 脚可以任意一个脚,freq可以选择 SOFT_STANDARD (100KHz) 和 SOFT_FAST (400KHz)。
下面是我用逻辑分析仪抓取的这个过程的波形:
这里由于没有连接I2C的从机,因此没有应答,在发送i2c地址给 从机后没有应答,后面写数据就不再进行了,因此这里没有看到写数据0x48的波形。在请求读取后,一般是把I2C地址加一发送给从机(这个过程在i2c的库中已经自动操作了),这时就可以从i2c从机读取数据,上面代码中requestFrom()函数就是请求读取多少个字节的数据。
需要注意的是I2C地址的表示:一般I2C地址有7位和10位两种,我们大多数用的还是7位的地址。当我们使用7位地址模式时,一般需要把这个7位地址左移一位数字,再使用i2c的SDA线一位一位的传输到从机,不过这一个过程在i2c库中已解自动写好了,因此我们不需要移位操作。但是有少许的文档会给出已解左移一位后的地址,这时候就需要注意了,我们需要把这样的地址右移一位还原后再放到这里的代码中进行i2c操作。如果你实在无法确定这个地址的正确性,可以参考这篇文章(使用I2C接口与模块相连时调试分析),来快速确定你的i2c从机地址,这样你就能够排除i2c地址给你带来的问题了。