i2c из нескольких регистров / устройств

Я только что завершил успешное считывание с акселерометра ADXL345 с микроконтроллера PIC (dsPIC33) с использованием i2c. Все, чего я добился до сих пор, - это правильное чтение идентификатора устройства, который представляет собой один байт.

Любой, кто раньше использовал ADXL345, знает, что чтение данных с любой оси, X, Y или Z, разбито на два байта, например, «DATAX0» и «DATAX1». В таблице данных также прямо говорится: «Для обеспечения согласованности данных рекомендуется использовать многобайтовые операции чтения для извлечения данных из ADXL345», поэтому два байта на каждую ось должны собираться вместе.

Мой вопрос: с i2c, как мне это сделать, когда два байта на ось представлены двумя разными регистрами?

процесс i2c

На изображении выше показан процесс, необходимый для передачи i2c. Чтобы считывать данные с акселерометра, мы смотрим на два нижних графика, и цитата из таблицы, которую я вставил выше, предполагает, что я использовал нижний график (многобайтовый), но, как я уже сказал, два байта имеют два разных регистра значения (0x32 и 0x33 для DATAX0 и DATAX1 соответственно).

Как получить данные с одной оси за один прием? Единственный способ, которым я вижу это, - это однобайтовое чтение с одним адресом регистра, затем повторение этого со вторым адресом регистра, а затем объединение двух вместе, чтобы получить данные по одной оси.

Этот вопрос также относится к сбору данных с множества разных устройств на одной шине i2c, которые также будут иметь разные регистры.

Ваше здоровье!


person ritchie888    schedule 14.03.2013    source источник


Ответы (1)


Вы просто выполняете 2-байтовое чтение по адресу 0x32, и устройство помещает значения из 0x32 и 0x33 в свой ответ.

person TJD    schedule 14.03.2013
comment
Спасибо за ваш ответ. Итак, вы говорите, что если я ввожу в адрес регистра значение 0x32 (DATA0X), затем перезапускаю i2c, после чего выполняется чтение ведомого и захват 6 байтов, он захватит байты из 0x32, 33, 34, 35, 36 , и 37 (т.е. все байты для всех трех осей?). Я исходил из предположения, что, выполняя многобайтовое чтение с использованием регистра 0x32, он просто дважды захватит байт DATA0X. - person ritchie888; 14.03.2013
comment
Правильно, будет читать последовательно. Вы можете легко написать тестовый драйвер, который выполняет однобайтовое чтение и многобайтовое чтение, чтобы убедиться, что это одно и то же. - person TJD; 15.03.2013
comment
Большой. Спасибо большое, сейчас нахожусь в процессе тестирования. - person ritchie888; 15.03.2013