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

Общий вызов I²C (general call)

Обычно ведущий I²C обращается к одному устройству по его адресу. Общий вызов — исключение: по адресу 0x00 его слышат все ведомые, а что делать, определяет следующий байт. Так можно одной командой сбросить все поддерживающие это микросхемы.

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

Общий вызов (general call) — обращение ведущего I²C сразу ко всем ведомым на шине. Ведущий посылает адрес 0000 000 с битом записи — байт 0x00, а смысл команды задаёт второй байт. По спецификации NXP UM10204 этот адрес входит в группу зарезервированных, о которых — в статье об адресе I²C.

Второй байтЗначение по UM10204
0x06сброс и загрузка программируемой части адреса
0x04загрузка программируемой части адреса без сброса
0x00запрещён

Поддержка общего вызова необязательна: ведомое может его не подтверждать. Производители, которые его поддерживают, иногда добавляют свои команды. ЦАП MCP4725 по даташиту Microchip:

  • по 06h выполняет внутренний сброс, как при включении питания, и загружает в регистр значение из EEPROM;
  • по 09h выходит из режима отключения: биты отключения сбрасываются, EEPROM не меняется.

Microchip советует посылать общий сброс после включения питания, если питание нарастает медленнее 1 В/мс и значение из EEPROM может не загрузиться. А DAC7571 от TI общий вызов не поддерживает — вместо него он отвечает на собственный широковещательный адрес 1001 0000 при любом уровне на выводе A0. Сравнение обоих ЦАП — в карточке MCP4725 и DAC7571, разбор байтов посылки — в калькуляторе транзакции I²C.

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

Что делает общий вызов 0x06?

По спецификации I²C (UM10204) — сброс: устройства, поддерживающие общий вызов, сбрасываются и загружают программируемую часть своего адреса. Например, MCP4725 по 06h выполняет внутренний сброс, как при включении питания, и загружает в регистр ЦАП значение из EEPROM.

Все ли микросхемы I²C отвечают на общий вызов?

Нет, поддержка общего вызова необязательна, и многие ведомые его просто не подтверждают. DAC7571 от TI, например, прямо указывает, что общий вызов не поддерживает, зато отвечает на собственный широковещательный адрес 1001 0000 независимо от вывода A0.

Можно ли использовать общий вызов для своих команд?

Второй байт общего вызова задаёт его смысл, и спецификация определяет только несколько значений: 0x06, 0x04, а 0x00 использовать запрещено. Производители добавляют свои: у MCP4725 09h — пробуждение из режима отключения. Посылать произвольные байты опасно — их может по-разному понять другое устройство на шине.

Источники

  1. NXP Semiconductors. UM10204: I2C-bus specification and user manual, Rev. 7.0, 1 October 2021 — табл. 4 и раздел об общем вызове — общий вызов по адресу 0000 000 с битом записи; второй байт задаёт смысл: 0x06 — сброс и загрузка программируемой части адреса, 0x04 — загрузка адреса без сброса, 0x00 запрещён; поддержка необязательна
  2. Microchip. MCP4725: 12-Bit Digital-to-Analog Converter with EEPROM Memory in SOT-23-6 (DS22039D, 2009) — разд. 7.3 — подтверждает общий вызов; 06h — внутренний сброс как при включении питания с загрузкой EEPROM, 09h — пробуждение: биты отключения сбрасываются, EEPROM не меняется; разд. 5.4.2 — после включения рекомендуется общий сброс
  3. Texas Instruments. DAC7571: +2.7 V to +5.5 V, I2C Interface (Receive Only), Voltage Output, 12-Bit Digital-to-Analog Converter (SLAS374D, revised January 2014) — общий вызов не поддерживается; на широковещательный адрес 1001 0000 отвечает независимо от вывода A0

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