(Помощь необходима) Использование устройств с адресом I2C больше 127

Такшак
Вт 21 июля 2015 г. 15:04
У меня есть датчик температуры и влажности AM2320 (таблица данных http: // akizukidenshi.com/download/ds/aosong/am2320.PDF)

Он имеет адрес 0xb8 (декабрь-184) > 127

Попытка со следующим кодом, каждая напечатанная строка равен нулю... :(
#include #define I2CADDR 0xb8 #define READCMD 0x03 #define REGSTADDR 0x00 #define REGCOUNT 4 #define REGADDR 0x0B void setup() { Wire.begin(); // wake up I2C bus Serial.begin(9600); } void loop() { byte buf[10]; // // Read Command // Wire.beginTransmission(I2CADDR); Wire.write(READCMD); Wire.write(REGSTADDR); Wire.write(REGCOUNT); Wire.endTransmission(); // // Waiting // delay(2); //>1.5ms // // Read // Wire.requestFrom(I2CADDR, 2 + REGCOUNT + 2); // COMMAND + DATA + REGCOUNT + CRCLSB + CRCMSB int i = 0; for (; i < 2 + REGCOUNT + 2; i++) buf[i] = Wire.read(); for (i=0; i < 2 + REGCOUNT + 2; i++) Serial.println(buf[i]); delay(3000); }

Martinayotte
Вт 21 июля 2015 г. 15:56
Определенно, адрес 0xb8 уже смещен, поэтому, как вы упоминали, вам нужен «(#define i2caddr (0xb8 >> 1)) "
Кроме того, я не вижу, где он терпит неудачу, так как у меня нет такого модуля, чтобы попробовать его.
У вас есть надлежащие резисторы с подтягиванием на автобусе ?

Такшак
Вт 21 июля 2015 г., 19:13
Martinayotte написал:Определенно, адрес 0xb8 уже смещен, поэтому, как вы упоминали, вам нужен «(#define i2caddr (0xb8 >> 1)) "
Кроме того, я не вижу, где он терпит неудачу, так как у меня нет такого модуля, чтобы попробовать его.
У вас есть надлежащие резисторы с подтягиванием на автобусе ?

Mrburnette
Чт 23 июля 2015 г. 1:23
Тхакшак написал:У меня есть датчик температуры и влажности AM2320 (таблица данных http: // akizukidenshi.com/download/ds/aosong/am2320.PDF)

Он имеет адрес 0xb8 (декабрь-184) > 127

Martinayotte
Чт 23 июля 2015 г. 13:55
@Ray, это потому, что их реализация I2C не меняет адрес:
I2C_Write(AM2320_address + I2C_write_cmd);

Такшак
Сб 25 июля 2015 г., 20:23
Martinayotte написал:Определенно, адрес 0xb8 уже смещен, поэтому, как вы упоминали, вам нужен «(#define i2caddr (0xb8 >> 1)) "
Кроме того, я не вижу, где он терпит неудачу, так как у меня нет такого модуля, чтобы попробовать его.
У вас есть надлежащие резисторы с подтягиванием на автобусе ?

Rogerclark
Сб 25 июля 2015 г. 22:05
Какова максимальная скорость i2c для этого модуля?

Скорость по умолчанию на STM32 установлена ​​на 250 кбит / с вместо 100 Кбит / с на AVR.
Однако большинство модулей работают до 400 кб / с / сб / с / сб, так что обычно это не проблема, но это то, что нужно иметь в виду.

Такшак
Солнце 26 июля 2015 г. 11:09
Rogerclark написал:Какова максимальная скорость i2c для этого модуля?

Скорость по умолчанию на STM32 установлена ​​на 250 кбит / с вместо 100 Кбит / с на AVR.
Однако большинство модулей работают до 400 кб / с / сб / с / сб, так что обычно это не проблема, но это то, что нужно иметь в виду.

Rogerclark
Солнце 26 июля 2015 г. 12:09
Просто чтобы проверить это

Перейти в/stm32f1/библиотеки/проволоки.CPP и внизу изменения
TwoWire Wire(PB6, PB7, SOFT_FAST);

Такшак
Солнце 26 июля 2015 г. 13:39
Rogerclark написал:Просто чтобы проверить это

Перейти в/stm32f1/библиотеки/проволоки.CPP и внизу изменения
TwoWire Wire(PB6, PB7, SOFT_FAST);

Rogerclark
Солнце 26 июля 2015 г., 21:33
К сожалению, похоже, что API ARDUINO / WRING не имеет способа установить скорость.

Я думаю, что теперь это главное упущение, когда новые доски способны на более высокие скорости, а некоторые устройства e.глин. Accelermoeters выигрывает, если вы можете прочитать их данные как можно быстрее.

Когда я экстрагирую, некоторые библиотеки могут иметь жесткие ссылки на проволоку в них, было бы смысл добавить новую функцию в провод SetSpeed ​​(int speedinkhz)

Или, возможно, добавить необязательный аргумент для подключения.начинать (int address, int speedinkhz)


У вас есть другие идеи ?

Кенджуцу
Пн 27 июля 2015 г. 8:58 утра
Rogerclark написал: Было бы иметь смысл добавить новую функцию в провод SetSpeed ​​(int speedinkhz)

Или, возможно, добавить необязательный аргумент для подключения.начинать (int address, int speedinkhz)