Tessel 2 - i2c.read没有记录缓冲区

时间:2017-08-18 03:16:03

标签: javascript embedded i2c tessel

我试图使用Tessel 2从CO2传感器读取数据,但没有取得多大成功。

来自传感器的数据表:

  

要从传感器读取当前的CO2浓度,我们需要阅读   存储单元0x08(高字节)和0x09(低字节)。

     

要做到这一点,我们   需要发送一个两个I2C帧的序列:首先我们发送一个I2C写   包含传感器地址,命令编号和多少字节的帧   读取,读取RAM地址和校验和。然后我们发送一个I2C   读取帧以读取状态,数据和校验和。

     

在我们的例子中,我们想从地址开始读取2个字节   0x08的。这将为我们提供地址0x08和0x09的数据   包含当前的CO2读数。传感器地址为0x68(默认值   出厂设置,可在EEPROM中配置)。

     

所以,第一帧应该是这样的:

     

开始| 0xD0 | 0x22 | 0x00 | 0x08 | 0x2A |停止

     

- 一个。 0xD0是传感器地址和读/写位。 0x68向左移一位,R / W位为0(写入)。

     

- B。 0x22是命令编号2(读取RAM),读取2个字节

     

- ℃。校验和0x2A计算为字节2,3和4的总和。

     

下一帧将读取实际数据:

     

开始| 0xD1 | <从传感器读取的4个字节> |停止

     

- d。传感器的1:st字节将包含操作状态,其中位0告诉我们读命令是否成功执行。

     

- 即2:nd和3:rd字节将包含CO2值hi字节和CO2值低字节。

     

- F。第4个字节包含校验和

所以,我的代码看起来像这样:

'use strict';

// Require
var async   = require('async');
var tessel  = require('tessel');
var port    = tessel.port.B;

// Vars
var i2c;

// Process
async.waterfall([
  function(callback) {
    i2c = new port.I2C(0xD0);
    callback(null,new Buffer([0xD0, 0x22, 0x00, 0x08, 0x2A]));
  },
  function(data, callback) {
    i2c.send(data, function (error) {
        console.log("Done sending the data");
        callback(null,null);
    })
  },
  function(data, callback) {
    i2c = new port.I2C(0xD1);
    callback(null,null);
  }
], function (err, result) {
    i2c.read(4, function (error, buffer) {
        console.log(`I2C Slave (0x${address.toString(16)} response: `, buffer);
    });    
});

代码一直执行,直到i2c.read代码块,并且从未从传感器接收到缓冲区。

我决定不使用传输方法,因为地址会改变。

我做错了什么?

1 个答案:

答案 0 :(得分:0)

我看了一眼Arduino草图,给了我一些最终消失的想法,这让我有点作弊。

  1. i2C应该使用正确的地址(0x68)进行实例化,而不是像数据表中提供的文档那样进行移位
  2. i2c.send的Buffer不应该包含地址,因为i2c已经在实例化时在帧中添加了地址。所以缓冲区应该如下所示:

    回调(null,new Buffer([0x22,0x00,0x08,0x2A]));

  3. 在发送1000ms的读数之间添加超时