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, который дал мне некоторые идеи, которые в конечном итоге оправдались.
- i2C должен быть создан с использованием правильного адреса (0x68), а не смещен, как в документах, приведенных в таблице
буфер для i2c.send не должен включать в себя адрес, поскольку i2c уже имеет адрес, добавленный в кадр при создании экземпляра. Таким образом, буфер должен выглядеть так:
обратный вызов (ноль, новый буфер ([0x22, 0x00, 0x08, 0x2A]));
добавить тайм-аут между отправкой чтения 1000 мс