零知开源接口篇1-IIC通信

本文主要讲解零知Lab开发板的IIC接口通信,由于I2C接口在软件上实现简单方便,因此我们直接使用软件方式的I2C接口,这样不仅可以满足我们需要多个I2C接口的需求,同时我们可以把I2C接口配置到不同的IO口,以方便我们在做自己的硬件时的PCB布线。

1、示例讲解

和上一篇一样我们在零知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;
	} 
						
						

2、分析讲解

在上面的代码示例中,一般一个完整的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地址给你带来的问题了。