I²C

I²C,是 Inter-Integrated Circuit(集成电路总线)的缩写,它是一种常见的串行总线结构,用以连接整体电路,实现高低速设备同步和通信。

如果想更多的了解 I²C,可以到这里

前提条件

使用 I²C

请根据外设的数据手册,确定外设的接口类型为 I²C。

配置 driver.json

确定自己的硬件接口是 I²C 后,需要声明硬件接口类型为 I²C。 在 driver.json 文件里的 inputs,指定接口的类型(type)为 I²C。

{
...
"inputs": {
"i2c": {
"type": "i2c",
"args": {
"address": -1
}
}
}
}

接口属性

I²C 接口可以配置以下属性:

  • address 定义 I²C 接口的地址,需要用户从器件的数据手册中获得。

编写驱动

读取功能

驱动程序可以从总线上读取数据,下面是一个例子,根据数据手册,需要设置指令为0x01,然后,读取的值在回调函数中返回:

function read(callback) {
i2c.readBytes(0x01, function (error, value) {
if (error) {
callback(error);
return;
}

callback(undefined, 0xff - value);
});
}

写入功能

驱动程序可以向总线上写入数据,下面是一个向总线上写入一个字节的例子:

var data = 0;
...

i2c.writeByte(-1, data);

如果想了解更多细节,请参考其 API 文档

应用

光照传感器(GY-30)

光照传感器是一个可以获取亮度的传感器,根据数据手册,它需要配置一个地址为35的 I²C 接口。我们在driver.json 文件中声明一个类型为 I²C 的接口,设定接口地址为 35。

{
"models": [
"GY-30"
],
"inputs": {
"i2c": {
"i2c": {
"type": "i2c",
"args": {
"address": 35
}
}
}
}
}

我们为光照传感器提供得到当前光强(getIlluminance)的接口,其具体实现方式如下:

  • getIlluminance,先向 I²C 接口写入设置字节(0x20),延迟一段时间后,从 I²C 接口读取两个字节数据,返回经过计算的光照强度。
'use strict';

var driver = require('ruff-driver');

module.exports = driver({
attach: function (inputs, context) {
this._i2c = inputs['i2c'];
},

exports: {
getIlluminance: function(callback) {
var i2c = this._i2c;

i2c.writeByte(-1, 0x20, function(error) {
if (error) {
callback(error);
return;
}

setTimeout(function() {
i2c.readBytes(-1, 2, function (error, values) {
if (error) {
callback(error);
return;
}
var value = Math.floor((values[0] << 8 | values[1]) / 1.2);
callback(undefined, value);
});
}, 180);
};
}
}
});