Tessel 2 - i2c.read не логирует буфер

Я пытаюсь использовать Tessel 2 для чтения данных с датчика CO2, но без особого успеха.

Из паспорта датчика:

Чтобы прочитать текущую концентрацию CO2 с датчика, нам нужно прочитать ячейки памяти 0x08 (старший байт) и 0x09 (младший байт).

Для этого нам нужно отправить последовательность из двух кадров I2C: сначала мы отправляем кадр записи I2C, содержащий адрес датчика, номер команды и количество байтов для чтения, адрес ОЗУ для чтения и контрольную сумму. Затем мы отправляем фрейм I2C для чтения состояния, данных и контрольной суммы.

В нашем случае мы хотим прочитать 2 байта, начиная с адреса 0x08. Это даст нам данные с адресов 0x08 и 0x09, которые содержат текущие показания CO2. Адрес датчика 0x68 (заводская настройка по умолчанию, настраивается в EEPROM).

Итак, первый кадр должен выглядеть так:

Начало | 0xD0 | 0x22 | 0x00 | 0x08 | 0x2A | Стоп

--a. 0xD0 - адрес датчика и бит чтения / записи. 0x68 сдвинуто на один бит влево, а бит R/W равен 0 (запись).

-В. 0x22 - это команда номер 2(ReadRAM) и 2 байта для чтения

-С. Контрольная сумма 0x2A рассчитывается как сумма байтов 2, 3 и 4.

Следующий кадр будет читать фактические данные:

Начало | 0xD1 | <4 байта считывается с датчика> | Стоп

-D,. 1-й байт от датчика будет содержать состояние операции, где бит 0 сообщает нам, была ли команда чтения успешно выполнена.

--e. 2-й и 3-й байты будут содержать Hi-байты значения CO2 и младшие байты значения 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 ответ

Решение

Я немного обманул, взглянув на эскиз Arduino, который дал мне некоторые идеи, которые в конечном итоге оправдались.

  1. i2C должен быть создан с использованием правильного адреса (0x68), а не смещен, как в документах, приведенных в таблице
  2. буфер для i2c.send не должен включать в себя адрес, поскольку i2c уже имеет адрес, добавленный в кадр при создании экземпляра. Таким образом, буфер должен выглядеть так:

    обратный вызов (ноль, новый буфер ([0x22, 0x00, 0x08, 0x2A]));

  3. добавить тайм-аут между отправкой чтения 1000 мс

Другие вопросы по тегам