Как прочитать адрес двухбайтового регистра с помощью wire библиотеки arduino

i2c

Я хочу прочитать регистр 0x012A с адреса I2C устройства 0x0A, значение, хранящееся в регистре, равно двум байтам, если адрес регистра равен одному байту, я могу использовать Wire.requestFrom и указать адрес регистра и сколько байтов я хочу прочитать, поскольку здесь адрес самого регистра 2 байта, я бит сбит с толку . может ли кто-нибудь помочь в этом отношении.

, 👍1

Обсуждение

Взгляните на https://github.com/rodan/ds3231/blob/master/ds3231.cpp#L409-L413 . Насколько я могу судить. Вы начинаете передачу на устройство; вы записываете два своих байта адреса реестра; затем завершаете передачу. После этого вы используете requestFrom для чтения любого количества байтов (в вашем случае их тоже бывает два)., @Gerben


1 ответ


3

я могу использовать Wire.requestFrom и указать адрес регистра и количество байтов, которые я хочу прочитать

Итак, вы даете ему 2, чтобы запросить 2 байта.

Затем вы объединяете их. Как вы это сделаете, зависит от того, что представляют собой байты. Если первый - это верхний байт, а второй - младший байт 16-битного значения, то вы должны:

uint8_t b1 = Wire.read();
uint8_t b2 = Wire.read();

uint16_t val = (b1 << 8) | b2;

Если все наоборот, то просто поменяйте местами переменные в разделе объединения.

Однако, если значения имеют какое-то другое расположение (недавно я видел что-то, что имело два регистра с 12-битным значением с перекрывающимися битами), вам придется объединить его так, как требуется для этого конкретного расположения.

,