Перейти к содержанию

Автоинкремент адреса регистра (auto-increment)

Чтобы прочитать шесть байт данных акселерометра, не нужно шесть раз передавать адрес регистра. Большинство датчиков и периферийных микросхем после каждого байта сами увеличивают внутренний адрес. Это автоинкремент, и у него есть важное следствие: целостность данных при пакетном чтении.

Обновлено Редакция GAW

Автоинкремент адреса регистра — свойство периферийной микросхемы: после каждого прочитанного или записанного байта её внутренний указатель регистра сам увеличивается на единицу. Благодаря этому несколько соседних регистров читают или пишут одной транзакцией I²C или SPI: адрес первого регистра передаётся один раз, дальше идут только данные.

Пакетное чтение по I²C

Типичная транзакция: START, адрес устройства с битом записи, адрес первого регистра, повторный START, адрес с битом чтения, затем N байтов. Ведущий подтверждает каждый байт, кроме последнего, — на последний он отвечает NACK и выдаёт STOP. InvenSense описывает это для MPU-6050: если ведущий продолжает передачу после ACK, датчик сам переходит к следующему регистру. Проверить последовательность байтов можно в конструкторе транзакций I²C.

Целостность данных

Результат измерения часто занимает несколько регистров, а датчик обновляет их независимо от интерфейса. Bosch для BMP280 прямо рекомендует пакетное чтение регистров 0xF7–0xFC:

  • при чтении по одному регистру между байтами может закончиться новое измерение, и старший байт окажется от одного отсчёта, а младший — от другого;
  • при пакетном чтении работают теневые регистры: новый результат ждёт до конца пакета (фронт CSB в SPI или STOP в I²C) и копируется в регистры данных разом.

Когда автоинкремент выключен

Не у всех микросхем он работает по умолчанию. У PCA9685 бит AI в регистре MODE1 после сброса равен нулю, и все байты пишутся в один регистр. Правила автоинкремента у разных микросхем разные, поэтому раздел даташита об интерфейсе читают до написания драйвера.

Частые вопросы

Почему BMP280 советуют читать одним пакетом?

Из-за целостности данных. Давление и температура занимают несколько регистров, и если читать их по одному, между чтениями может закончиться новое измерение — получится смесь байтов двух отсчётов. Bosch гарантирует согласованность только при чтении всех регистров данных одним пакетом: на это время новый результат ждёт в теневых регистрах.

Почему PCA9685 записывает все байты в один регистр?

Потому что у PCA9685 автоинкремент по умолчанию выключен: бит AI в регистре MODE1 после сброса равен нулю. Пока он не установлен, каждый следующий байт пишется в тот же регистр. Перед записью нескольких регистров подряд устанавливают AI = 1.

Как выглядит пакетное чтение регистров по I²C?

Ведущий передаёт адрес устройства с битом записи и адрес первого регистра, затем повторный START, адрес устройства с битом чтения и читает нужное число байтов. После каждого байта, кроме последнего, ведущий отвечает ACK, после последнего — NACK и STOP. Внутренний адрес регистра после каждого байта увеличивается сам.

Источники

  1. Bosch Sensortec. BMP280 Digital Pressure Sensor, Data sheet BST-BMP280-DS001-26, Revision 1.26 (October 2021) — разд. 3.9: данные после измерения настоятельно рекомендуется читать пакетом, а не по одному регистру — это исключает смешение байтов разных измерений и сокращает обмен; пакет с 0xF7 по 0xFC; разд. 3.10: теневые регистры гарантируют согласованность, только если все регистры данных прочитаны одним пакетом; новый результат, пришедший во время чтения, ждёт в теневых регистрах до конца пакета — по фронту CSB в SPI или по STOP в I²C; разд. 5: чтение нескольких байтов с одним адресом регистра, который автоматически увеличивается
  2. InvenSense. MPU-6000 and MPU-6050 Product Specification, PS-MPU-6000A-00, Revision 3.4 (08/19/2013) — разд. 9.3: если вместо STOP ведущий продолжает передачу после ACK, MPU-60X0 автоматически увеличивает адрес регистра и записывает данные в следующий регистр; последовательности одиночной и пакетной записи и чтения; чтение заканчивается NACK и STOP от ведущего
  3. NXP. PCA9685 16-channel, 12-bit PWM Fm+ I2C-bus LED controller, Product data sheet Rev. 4 (16 April 2015) — разд. 7.3.1, регистр MODE1: бит 5 AI — 0 автоинкремент выключен (по умолчанию), 1 включён; при AI = 1 управляющий регистр автоматически увеличивается после чтения или записи, что позволяет программировать регистры последовательно; рис. 21–22: запись и чтение всех регистров с автоинкрементом

Нашли ошибку?