stringtranslate.com

I²C

I 2 C ( межинтегральная схема ; произносится как « глаз-квадрат » или « глаз-два-видеть »), также известная как I2C или IIC , представляет собой синхронную систему с несколькими главными и несколькими подчиненными устройствами (контроллер/цель). ), несимметричная последовательная шина связи , изобретенная в 1982 году компанией Philips Semiconductors . Он широко используется для подключения низкоскоростных периферийных микросхем к процессорам и микроконтроллерам при внутриплатной связи на небольших расстояниях.

Несколько конкурентов, таких как Siemens , NEC , Texas Instruments , STMicroelectronics , Motorola , [1] Nordic Semiconductor и Intersil , представили на рынке совместимые продукты I2C с середины 1990-х годов.

Шину I 2 C можно найти в широком спектре электронных приложений, где простота и низкая стоимость производства важнее скорости. Компоненты и системы ПК, которые используют I 2 C, — это EEPROM последовательного обнаружения присутствия (SPD) на модулях памяти с двойным расположением вывода (DIMM), расширенные идентификационные данные дисплея (EDID) для мониторов через разъемы VGA , DVI и HDMI , доступ к чипам NVRAM и т. д. Наиболее известными приложениями I2C на микроконтроллерах являются чтение аппаратных мониторов, датчиков, часов реального времени , управление исполнительными механизмами, доступ к низкоскоростным ЦАП и АЦП , управление небольшими (например, обычными телефонами ) ЖК- или OLED- дисплеями, изменение подсветки, контрастности, оттенка, цвета. настройки баланса и т. д. на мониторах (через канал данных дисплея ), изменение громкости звука в интеллектуальных динамиках и т. д.

Особой силой I 2 C является способность микроконтроллера управлять сетью микросхем устройств с помощью всего двух выводов ввода -вывода общего назначения и программного обеспечения. Многие другие технологии шин, используемые в аналогичных приложениях, такие как шина последовательного периферийного интерфейса (SPI), требуют большего количества контактов и сигналов для подключения нескольких устройств.

Шина системного управления (SMBus), определенная Intel в 1995 году, представляет собой подмножество I 2 C, определяющее более строгое использование. Одной из целей SMBus является повышение надежности и совместимости. Соответственно, современные системы I 2 C включают в себя некоторые политики и правила SMBus, иногда поддерживая как I 2 C, так и SMBus, требуя лишь минимальной реконфигурации либо путем подачи команд, либо с использованием выходных контактов. Для управления системой ПК используется шина SMBus , контакты которой расположены как в обычных разъемах PCI , так и в разъемах PCI Express .

Микрочип MCP23008 8-битный расширитель ввода-вывода I 2 C в корпусе DIP-18 [2]

Дизайн

Пример схемы с одним контроллером (микроконтроллером ) , тремя целевыми узлами ( АЦП , ЦАП и микроконтроллером) и подтягивающими резисторами R p.

I 2 C использует только две двунаправленные линии с открытым коллектором или открытым стоком : последовательную линию данных ( SDA) и последовательную линию синхронизации (SCL), подтянутые резисторами . [3] Типичное используемое напряжение составляет +5 В или +3,3 В, хотя допускаются системы с другим напряжением.

Эталонный проект I 2 C имеет 7-битное адресное пространство с редко используемым 10-битным расширением. [4] Общие скорости шины I 2 C — это стандартный режим 100  кбит/с и быстрый режим 400 кбит/с . Также существует низкоскоростной режим 10 Кбит/с , но допускаются и сколь угодно низкие тактовые частоты. Более поздние версии I 2 C могут содержать больше узлов и работать на более высоких скоростях ( быстрый режим 400 кбит/с , быстрый режим плюс 1 Мбит/с , высокоскоростной режим 3,4  Мбит/с и  сверхбыстрый режим 5 Мбит/с ). . Эти скорости более широко используются во встроенных системах, чем на ПК.

Обратите внимание, что скорости передачи данных указаны для передачи между контроллером (главным) и целевым устройством (подчиненным) без расширения тактовой частоты или других аппаратных издержек. Заголовки протокола включают целевой адрес и, возможно, адрес регистра внутри целевого устройства, а также побайтовые биты ACK/NACK. Таким образом, фактическая скорость передачи пользовательских данных ниже, чем можно было бы предположить из этих пиковых скоростей передачи данных. Например, если каждое взаимодействие с целью неэффективно позволяет передать только 1 байт данных, скорость передачи данных будет меньше половины пиковой скорости передачи данных.

Количество узлов, которые могут существовать на данной шине I 2 C, ограничено адресным пространством, а также общей емкостью шины 400  пФ , что ограничивает практические расстояния связи несколькими метрами. Относительно высокий импеданс и низкая помехоустойчивость требуют наличия общего потенциала земли, что снова ограничивает практическое использование связью внутри одной печатной платы или небольшой системы плат.

Эталонный дизайн

Вышеупомянутый эталонный дизайн представляет собой шину с линиями синхронизации (SCL) и данных (SDA) с 7-битной адресацией. Шина имеет две роли для узлов: контроллер (главный) или целевой (подчиненный):

Шина является многоконтроллерной, что означает, что может присутствовать любое количество узлов контроллера. Кроме того, роли контроллера и цели могут быть изменены между сообщениями (после отправки STOP).

Для данного устройства шины может существовать четыре потенциальных режима работы, хотя большинство устройств используют только одну роль и два ее режима:

В дополнение к битам данных 0 и 1 шина I 2 C допускает специальные сигналы START и STOP, которые действуют как разделители сообщений и отличаются от битов данных. (Это отличие от стартовых и стоповых битов , используемых в асинхронной последовательной связи , которые отличаются от битов данных только своей синхронизацией.)

Первоначально контроллер находится в режиме передачи контроллера, отправляя START, за которым следует 7-битный адрес цели, с которой он желает связаться, за которым, наконец, следует один бит, указывающий, желает ли он записывать (0) или читать (1). ) от цели.

Если цель существует на шине, она ответит битом ACK (активный низкий уровень для подтверждения) для этого адреса. Затем контроллер продолжает работать либо в режиме передачи, либо в режиме приема (в зависимости от отправленного им бита чтения/записи), а цель продолжает работать в дополнительном режиме (прием или передача соответственно).

Байты адреса и данных передаются первым старшим битом . Состояние запуска обозначается переходом SDA от высокого к низкому уровню с высоким уровнем SCL; состояние остановки обозначается переходом SDA с низкого уровня на высокий с высоким уровнем SCL. Все остальные переходы SDA происходят при низком уровне SCL.

Если контроллер желает выполнить запись в цель, он повторно отправляет байт, а цель отправляет бит ACK. (В этой ситуации контроллер находится в режиме передачи контроллера, а цель находится в режиме приема цели.)

Если контроллер желает прочитать данные из цели, он повторно получает байт от цели, при этом контроллер отправляет бит ACK после каждого байта, кроме последнего. (В этой ситуации контроллер находится в режиме приема контроллера, а цель находится в режиме передачи цели.)

Транзакция I2C может состоять из нескольких сообщений . Контроллер завершает сообщение с условием STOP, если это конец транзакции, или он может отправить другое условие START, чтобы сохранить контроль над шиной для другого сообщения (транзакция «комбинированного формата»).

Протоколы сообщений

I 2 C определяет основные типы транзакций, каждая из которых начинается со СТАРТа и заканчивается СТОПом:

В комбинированной транзакции каждое чтение или запись начинается со START и целевого адреса. Условия START после первого также называются повторяющимися битами START . Повторяющимся START не предшествуют условия STOP, благодаря чему цели узнают, что следующее сообщение является частью той же транзакции.

Любая конкретная цель будет отвечать только на определенные сообщения, как указано в документации по продукту.

Системы Pure I 2 C поддерживают произвольные структуры сообщений. SMBus ограничен девятью из этих структур, такими как слово чтения N и слово записи N , включающие одну цель. PMBus расширяет SMBus групповым протоколом , позволяя отправлять несколько таких транзакций SMBus в одном объединенном сообщении. Завершающий СТОП указывает, когда эти сгруппированные действия должны вступить в силу. Например, одна операция PMBus может переконфигурировать три источника питания (с использованием трех разных целевых адресов I 2 C), и их новые конфигурации вступят в силу одновременно: когда они получат этот STOP.

За некоторыми исключениями, ни I 2 C, ни SMBus не определяют семантику сообщений, например, значение байтов данных в сообщениях. В остальном семантика сообщения зависит от продукта. Эти исключения включают сообщения, адресованные по общему адресу вызова I 2 C (0x00) или по адресу ответа на предупреждение SMBus ; и сообщения, участвующие в протоколе разрешения адресов SMBus (ARP) для динамического выделения адресов и управления ими.

На практике большинство целей используют модели управления запрос-ответ, в которых один или несколько байтов, следующих за командой записи, обрабатываются как команда или адрес. Эти байты определяют, как обрабатываются последующие записанные байты или как цель реагирует на последующие чтения. Большинство операций SMBus включают однобайтовые команды.

Пример сообщения: 24C32 EEPROM.

STMicroelectronics M24C08-BN6: последовательная EEPROM с шиной I 2 C [5]

Одним из конкретных примеров является EEPROM типа 24C32 , который использует два байта запроса, которые называются High Address и Low Address. (Соответственно, эти EEPROM не могут использоваться хостами, использующими чистый SMBus, которые поддерживают только однобайтовые команды или адреса.) Эти байты используются для адресации байтов в  адресном пространстве EEPROM размером 32 кбит (или 4  КБ ). Та же самая двухбайтовая адресация используется и в более крупных EEPROM, таких как 24C512, который хранит 512 кбит (или 64 КБ). Запись данных в эти EEPROM и чтение из них использует простой протокол: записывается адрес, а затем данные передаются до конца сообщения. Часть протокола, связанная с передачей данных, может вызвать проблемы в SMBus, поскольку байтам данных не предшествует счетчик, и за один раз можно передать более 32 байтов. I 2 C EEPROM размером менее 32 кбит, например 2 кбит 24C02, часто используются в SMBus с неэффективной передачей однобайтовых данных для решения этой проблемы.

В EEPROM записывается одно сообщение. После START контроллер отправляет адрес шины чипа с очищенным битом направления ( запись ), затем отправляет двухбайтовый адрес данных в EEPROM, а затем отправляет байты данных для записи, начиная с этого адреса, после чего следует STOP. При записи нескольких байтов все байты должны находиться на одной и той же 32-байтовой странице. Пока EEPROM занят сохранением этих байтов в памяти, он не будет отвечать на дальнейшие запросы I 2 C. (Это еще одна несовместимость с SMBus: устройства SMBus всегда должны отвечать на свои адреса шины.)

Для чтения, начиная с определенного адреса в EEPROM, используется комбинированное сообщение. После START контроллер сначала записывает адрес шины этого чипа с очищенным битом направления ( запись ), а затем два байта адреса данных EEPROM. Затем он отправляет (повторяющийся) START и адрес шины EEPROM с установленным битом направления ( чтение ). Затем EEPROM ответит байтами данных, начиная с указанного адреса данных EEPROM — комбинированное сообщение: сначала запись, затем чтение. Контроллер выдает ACK после каждого прочитанного байта, кроме последнего, а затем выдает STOP. EEPROM увеличивает адрес после передачи каждого байта данных; Многобайтовое чтение может получить все содержимое EEPROM, используя одно комбинированное сообщение.

Физический слой

Шина I 2 C: R p — подтягивающие резисторы, R s — дополнительные последовательные резисторы. [3]

На физическом уровне линии SCL и SDA имеют конструкцию шины с открытым стоком ( MOSFET ) или открытым коллектором ( BJT ), поэтому для каждой линии необходим подтягивающий резистор . Логический «0» выводится при подтягивании линии к земле, а логическая «1» выводится при разрешении линии плавать (выходной высокий импеданс ), так что подтягивающий резистор подтягивает ее к высокому уровню. Линия никогда не поднимается активно. Такая проводка позволяет нескольким узлам подключаться к шине без коротких замыканий из-за конфликта сигналов. Высокоскоростные системы (и некоторые другие) могут использовать источник тока вместо резистора для подтягивания только SCL или обоих SCL и SDA, чтобы обеспечить более высокую емкость шины и обеспечить более быстрое время нарастания.

Важным следствием этого является то, что несколько узлов могут одновременно управлять линиями. Если какой-либо узел устанавливает низкий уровень линии, он будет низким. Узлы, которые пытаются передать логическое значение (т. е. позволяют линии плавать на высоком уровне), могут обнаружить это и сделать вывод, что в это же время активен другой узел.

При использовании на SCL это называется растяжением тактовой частоты и представляет собой механизм управления потоком для целей. При использовании в SDA это называется арбитражем и гарантирует, что одновременно будет только один передатчик.

В режиме ожидания обе линии имеют высокий уровень. Чтобы начать транзакцию, SDA устанавливается на низкий уровень, а SCL остается на высоком уровне. Незаконно [3] : 14  передавать маркер остановки путем отпускания SDA для повторного перехода на высокий уровень (хотя такое «пустое сообщение» обычно безвредно), поэтому следующим шагом будет понижение SCL до низкого уровня.

За исключением сигналов запуска и остановки, линия SDA изменяется только при низком тактовом сигнале; Передача бита данных состоит из подачи высокого уровня на линию тактовых импульсов при постоянном удержании линии данных на желаемом уровне.

Пока SCL имеет низкий уровень, передатчик (первоначально контроллер) устанавливает SDA на желаемое значение и (после небольшой задержки, позволяющей значению распространиться) позволяет SCL оставаться на высоком уровне. Затем контроллер ожидает, пока SCL действительно поднимется до высокого уровня; это будет задержано конечным временем нарастания сигнала SCL ( постоянная времени RC подтягивающего резистора и паразитной емкостью шины) и может быть дополнительно задержано растяжением тактового сигнала цели.

Как только SCL становится высоким, контроллер ждет минимальное время (4 мкс для стандартной скорости I 2 C), чтобы убедиться, что приемник увидел бит, а затем снова переводит его на низкий уровень. На этом передача одного бита завершается.

После каждых 8 бит данных в одном направлении бит подтверждения передается в другом направлении. Передатчик и приемник меняются ролями на один бит, а исходный приемник передает обратно один бит «0» (ACK). Если вместо этого передатчик видит бит «1» (NACK), он узнает, что:

Только линия SDA меняет направление во время битов подтверждения; SCL всегда контролируется контроллером.

После бита подтверждения на линии тактовой частоты устанавливается низкий уровень, и контроллер может выполнить одно из трех действий:

Растяжение часов с использованием SCL

Одной из наиболее важных особенностей протокола I 2 C является растяжение тактовой частоты. Адресованное целевое устройство может удерживать низкий уровень тактовой линии (SCL) после получения (или отправки) байта, указывая, что оно еще не готово обрабатывать дополнительные данные. Контроллер, который обменивается данными с целью, может не завершить передачу текущего бита, но должен дождаться, пока на линии тактовой частоты фактически не появится высокий уровень. Если целью является увеличение тактовой частоты, линия тактовой частоты все равно будет низкой (поскольку соединения являются открытыми стоками ). То же самое происходит, если второй, более медленный контроллер пытается одновременно управлять часами. (Если существует более одного контролера, все, кроме одного, обычно проигрывают арбитраж.)

Контроллер должен подождать, пока он не заметит, что линия тактовой частоты переходит в высокий уровень, и дополнительное минимальное время (4 мкс для стандартных 100 кбит/с I 2 C), прежде чем снова понизить тактовый сигнал.

Хотя контроллер также может удерживать низкий уровень линии SCL столько, сколько пожелает (это не разрешено, начиная с версии 6 протокола – подраздел 3.1.1), термин «растяжение тактовой частоты» обычно используется только тогда, когда это делают цели. Хотя теоретически любой тактовый импульс может быть растянут, обычно используются интервалы до или после бита подтверждения. Например, если целью является микроконтроллер , его интерфейс I2C может растягивать тактовую частоту после каждого байта, пока программное обеспечение не решит, отправлять ли положительное подтверждение или NACK.

Растягивание тактового сигнала — единственный момент в I 2 C, когда цель управляет SCL. Многим целям не требуется растяжение тактовой частоты, и поэтому они рассматривают SCL строго как вход без схемы для его управления. Некоторые контроллеры, например те, которые находятся внутри пользовательских ASIC, могут не поддерживать растяжение тактовой частоты; часто эти устройства обозначаются как «двухпроводной интерфейс», а не I 2 C.

Чтобы обеспечить минимальную пропускную способность шины , SMBus накладывает ограничения на максимальное увеличение тактовой частоты. Хосты и цели, придерживающиеся этих ограничений, не могут блокировать доступ к шине более чем на короткое время, что не является гарантией, предоставляемой чистыми системами I2C .

Арбитраж с использованием SDA

Каждый контроллер контролирует шину на наличие стартовых и стоповых битов и не отправляет сообщение, пока другой контроллер держит шину занятой. Однако два контроллера могут начать передачу примерно в одно и то же время; в этом случае происходит арбитраж. Целевой режим передачи также может быть арбитражным, когда контроллер обращается к нескольким целям, но это встречается реже. В отличие от протоколов (таких как Ethernet ), которые используют случайные задержки перед повторной попыткой, I2C имеет детерминированную политику арбитража. Каждый передатчик проверяет уровень линии передачи данных (SDA) и сравнивает его с ожидаемыми уровнями; если они не совпадают, этот передатчик теряет арбитраж и выходит из этого протокольного взаимодействия.

Если один передатчик устанавливает SDA на 1 (не передает сигнал), а второй передатчик устанавливает его на 0 (притягивает к земле), в результате линия имеет низкий уровень. Затем первый передатчик обнаруживает, что уровень линии отличается от ожидаемого, и приходит к выводу, что передает другой узел. Первым узлом, заметившим такую ​​разницу, становится тот, который проигрывает арбитраж: он перестает управлять SDA. Если это контроллер, он также прекращает управление SCL и ожидает STOP; тогда он может попытаться перевыпустить все свое сообщение. Тем временем другой узел не заметил никакой разницы между ожидаемым и фактическим уровнями SDA и поэтому продолжает передачу. Он может сделать это без проблем, поскольку до сих пор сигнал был именно таким, как он ожидал; ни один другой передатчик не нарушил его сообщение.

Если два контроллера отправляют сообщение двум разным целям, тот, кто отправляет меньший целевой адрес, всегда «выигрывает» арбитраж на этапе адреса. Поскольку два контроллера могут отправлять сообщения на один и тот же целевой адрес, а адреса иногда относятся к нескольким целям, арбитраж иногда должен продолжаться и на этапах данных.

Арбитраж происходит очень редко, но он необходим для правильной поддержки нескольких контроллеров. Как и в случае с растяжением тактовой частоты, не все устройства поддерживают арбитраж. Те, кто это делает, обычно называют себя сторонниками «многоконтроллерной» связи.

Одним из случаев, который необходимо тщательно обрабатывать в реализациях I2C с несколькими контроллерами, является ситуация, когда контроллеры общаются друг с другом. Один контроллер может проиграть арбитраж в отношении входящего сообщения и должен вовремя сменить свою роль с контроллера на цель, чтобы подтвердить свой собственный адрес.

В чрезвычайно редком случае, когда два контроллера одновременно отправляют одинаковые сообщения, оба считают связь успешной, но цель увидит только одно сообщение. По этой причине, когда к цели могут получить доступ несколько контроллеров, каждая команда, распознаваемая целью, либо должна быть идемпотентной , либо должна быть гарантирована возможность никогда не выполняться двумя контроллерами одновременно. (Например, команда, которая выдается только одним контроллером, не обязательно должна быть идемпотентной, как и не обязательно, чтобы конкретная команда была идемпотентной, когда некоторый механизм взаимного исключения гарантирует, что только один контроллер может быть вынужден выдать эту команду в любой момент времени. .)

Арбитраж в SMBus

В то время как I 2 C осуществляет арбитраж только между контроллерами, SMBus использует арбитраж в трех дополнительных контекстах, когда несколько целей отвечают контроллеру, а одно передает свое сообщение.

Арбитраж в PMBus

PMBus версии 1.3 расширяет протокол ответа на оповещения SMBus протоколом «чтения зоны». [6] Цели могут быть сгруппированы в «зоны», и все цели в зоне могут быть адресованы для ответа, при этом их ответы замаскированы (исключая нежелательную информацию), инвертированы (поэтому нужная информация отправляется в виде 0 битов, что выигрывает в арбитраже), или переупорядочены (поэтому наиболее важная информация отправляется первой). Арбитраж гарантирует, что ответ с наивысшим приоритетом будет возвращен контроллеру первым.

PMBus резервирует адреса I 2 C 0x28 и 0x37 для чтения и записи зоны соответственно.

Различия между режимами

Существует несколько возможных режимов работы связи I 2 C. Все они совместимы в том смысле, что всегда можно использовать стандартный режим 100 Кбит/с , но объединение устройств с разными возможностями на одной шине может вызвать следующие проблемы:

Некоторые производители предоставляют так называемый нестандартный режим Turbo со скоростью до 1,4 Мбит/с.

Во всех режимах тактовая частота контролируется контроллером(ами), а шина с большей длиной, чем обычно, может работать на скорости ниже номинальной за счет понижения тактовой частоты .

Соединения цепей

Плата 16-битного АЦП с интерфейсом I2C .

I2C популярен для сопряжения периферийных схем с системами прототипирования, такими как Arduino и Raspberry Pi . I 2 C не использует стандартизированный разъем, однако разработчики плат создали различные схемы подключения I 2 C. Чтобы свести к минимуму возможный ущерб из-за подключения 0,1-дюймовых разъемов наоборот, некоторые разработчики предложили использовать попеременные сигнальные и силовые соединения следующих схем подключения: (GND, SCL, VCC, SDA) или (VCC, SDA, GND, SCL). . [7]

Подавляющее большинство приложений используют I 2 C в том виде, в котором он был изначально разработан — периферийные микросхемы напрямую подключены к процессору на одной и той же печатной плате и, следовательно, на относительно коротких расстояниях менее 1 фута (30 см) без разъема. . Однако при использовании дифференциального драйвера альтернативная версия I 2 C может передавать данные на расстояние до 20 метров (возможно, более 100 метров) по CAT5 или другому кабелю. [8] [9]

Несколько стандартных разъемов передают сигналы I 2 C. Например, разъем UEXT несет I 2 C; 10-контактный разъем iPack несет I 2 C; [10] разъем Lego Mindstorms NXT 6P6C несет I 2 C; [11] [12] [13] [14] некоторые люди используют разъемы 8P8C и кабель CAT5, обычно используемые для физического уровня Ethernet , для передачи дифференциально-кодированных сигналов I 2 C [15] или усиленных несимметричных сигналов I 2 C. ; [16] и каждый разъем HDMI , а также большинство разъемов DVI и VGA передают данные DDC2 по I 2 C.

Буферизация и мультиплексирование

Когда в системе много устройств I 2 C, может возникнуть необходимость включить шинные буферы или мультиплексоры для разделения больших сегментов шины на более мелкие. Это может быть необходимо для поддержания емкости сегмента шины ниже допустимого значения или для разделения нескольких устройств с одинаковым адресом с помощью мультиплексора. Существует множество типов мультиплексоров и буферов, и все они должны учитывать тот факт, что линии I 2 C определены как двунаправленные. Мультиплексоры могут быть реализованы с помощью аналоговых коммутаторов, которые могут связывать один сегмент с другим. Аналоговые переключатели поддерживают двунаправленную природу линий, но не изолируют емкость одного сегмента от другого и не обеспечивают возможности буферизации.

Буферы могут использоваться для изоляции емкости одного сегмента от другого и/или позволяют передавать I 2 C по более длинным кабелям или дорожкам. Буферы для двунаправленных линий, таких как I 2 C, должны использовать одну из нескольких схем предотвращения блокировки. I 2 C имеет открытый сток, поэтому буферы должны устанавливать низкий уровень на одной стороне, когда они видят низкий уровень на другой. Один из методов предотвращения блокировки состоит в том, чтобы буфер имел тщательно выбранные входные и выходные уровни так, чтобы выходной уровень его драйвера был выше его входного порога, что предотвращает его самозапуск. Например, буфер может иметь входной порог 0,4 В для обнаружения низкого уровня, а выходной низкий уровень — 0,5 В. Этот метод требует, чтобы все другие устройства на шине имели совместимые пороговые значения, и часто это означает, что несколько буферов реализуют эту функцию. схемы нельзя соединить последовательно друг с другом.

В качестве альтернативы существуют другие типы буферов, которые реализуют усилители тока или отслеживают состояние (т. е. какая сторона поставила шину на низкий уровень), чтобы предотвратить фиксацию. Метод состояния обычно означает, что непреднамеренный импульс создается во время переключения, когда одна сторона подает шину на низкий уровень, затем другая подает ее на низкий уровень, а затем первая сторона отпускает (это обычное явление во время подтверждения I 2 C ).

Совместное использование SCL между несколькими шинами

При наличии одного контроллера можно использовать несколько шин I 2 C, использующих одну и ту же линию SCL. [17] [18] Пакеты на каждой шине отправляются либо один за другим, либо одновременно. Это возможно, поскольку связь на каждой шине может быть разделена на чередующиеся короткие периоды с высоким уровнем вероятности нежелательной почты, за которыми следуют короткие периоды с низким уровнем вероятности нежелательной почты. И часы можно растянуть, если одному автобусу потребуется больше времени в одном штате.

Преимущества заключаются в одновременном использовании целевых устройств с одним и тем же адресом и экономии соединений или более высокой пропускной способности за счет одновременного использования нескольких линий передачи данных.

Таблица состояний линий

В этих таблицах показаны различные атомарные состояния и битовые операции, которые могут произойти во время сообщения I 2 C.

Структура адресации

7-битная адресация

10-битная адресация

Зарезервированные адреса в 7-битном адресном пространстве

Две группы адресов зарезервированы для специальных функций:

SMBus резервирует некоторые дополнительные адреса. В частности, 0001 000для хоста SMBus зарезервирован адрес, который может использоваться устройствами с поддержкой контроллера. 0001 100Это «адрес ответа на предупреждение SMBus», который опрашивается хостом после внеполосного прерывания, и 1100 001это адрес по умолчанию, который первоначально использовался устройствами, способными к динамическому назначению адреса.

В результате остается всего 107 незарезервированных 7-битных адресов, общих для I 2 C, SMBus и PMBus.


Незарезервированные адреса в 7-битном адресном пространстве

Хотя старший бит 1111 зарезервирован для идентификатора устройства и 10-битной целевой (ведомой) адресации, он также используется устройствами, зависящими от дисплея VESA DDC , такими как указывающие устройства . [22]

Формат транзакции

Транзакция I2C состоит из одного или нескольких сообщений . Каждое сообщение начинается со стартового символа, а транзакция заканчивается стоп-символом. Стартовые символы после первого, которые начинают сообщение, но не транзакцию, называются повторяющимися стартовыми символами.

Каждое сообщение доступно для чтения или записи. Транзакция, состоящая из одного сообщения, называется транзакцией чтения или записи. Транзакция, состоящая из нескольких сообщений, называется комбинированной транзакцией. Наиболее распространенной формой последнего является сообщение записи, предоставляющее информацию об адресе внутри устройства, за которым следует сообщение чтения.

Многие устройства I2C не различают объединенную транзакцию и одни и те же сообщения, отправленные как отдельные транзакции, но не все. Протокол идентификации устройства требует одной транзакции; целям запрещено отвечать, если они видят символ остановки. Режимы конфигурации, калибровки или самотестирования, вызывающие необычную реакцию цели, также часто автоматически завершаются в конце транзакции.

Временная диаграмма

Последовательность передачи данных
Последовательность передачи данных
  1. Передача данных инициируется с условием запуска (S), сигнализируемым тем, что SDA устанавливается на низкий уровень, в то время как SCL остается на высоком уровне.
  2. Уровень SCL устанавливается на низкий уровень, а SDA устанавливает уровень первого бита данных, сохраняя при этом низкий уровень SCL (во время синей полосы).
  3. Данные выбираются (принимаются), когда уровень SCL возрастает для первого бита (B1). Чтобы бит был действительным, SDA не должен меняться между нарастающим фронтом SCL и последующим спадающим фронтом (все время зеленой полосы).
  4. Этот процесс повторяется: переход SDA осуществляется, пока уровень SCL низкий, а данные считываются, пока уровень SCL высокий (от B2 до Bn).
  5. За последним битом следует тактовый импульс, во время которого SDA устанавливается на низкий уровень для подготовки к стоп- биту.
  6. Условие остановки (P) сигнализируется, когда SCL возрастает, за которым следует повышение SDA .

Чтобы избежать ложного обнаружения маркера, существует минимальная задержка между спадающим фронтом SCL и изменением SDA, а также между изменением SDA и нарастающим фронтом SCL. Обратите внимание, что сообщение I 2 C, содержащее n битов данных (включая подтверждения), содержит n + 1 тактовый импульс.

Проектирование программного обеспечения

I 2 C подходит для разработки программного обеспечения «драйвера шины». Программное обеспечение для подключенных устройств написано для вызова «драйвера шины», который обрабатывает фактическое оборудование I 2 C низкого уровня. Это позволяет коду драйвера подключенных устройств легко переносить на другое оборудование, включая революционную конструкцию.

Пример бит-бэнга протокола I 2 C

Ниже приведен пример битовой обработки протокола I 2 C в качестве контроллера I 2 C (ведущего). Пример написан на псевдоC . Он иллюстрирует все функции I 2 C, описанные ранее (расширение тактового сигнала, арбитраж, стартовый/стоповый бит, подтверждение/отсутствие подтверждения). [24]

// Функции поддержки, специфичные для оборудования, которые НЕОБХОДИМО настроить:#define I2CSPEED 100недействительный I2C_delay ( недействительный ); bool read_SCL ( недействительный ); // Возвращаем текущий уровень линии SCL, 0 или 1  bool read_SDA ( недействительно ); // Возвращаем текущий уровень линии SDA, 0 или 1  недействительный set_SCL ( недействительный ); // Не управлять SCL (установить высокий импеданс на выводе)  недействительный Clear_SCL ( недействительный ); // Активно снижаем уровень сигнала SCL  недействительный set_SDA ( недействительный ); // Не управлять SDA (установить высокоомный вывод)  недействительный Clear_SDA ( недействительный ); // Активно снижаем уровень сигнала SDA  недействительный арбитраж_потеря ( недействительный ); Bool начал = ложь ; // глобальные данные    недействительный i2c_start_cond ( недействительный ) { если ( началось ) {    // если запущено, выполняем условие перезапуска // устанавливаем SDA в 1 set_SDA (); I2C_задержка (); set_SCL (); while ( read_SCL () == 0 ) { // Растягивание часов      // Вам следует добавить таймаут в этот цикл } // Время повторного запуска, минимум 4,7 мкс I2C_задержка (); } если ( read_SDA () == 0 ) {     арбитраж_проиграл (); } // Уровень SCL высокий, установите SDA с 1 на 0. очистить_SDA (); I2C_задержка (); очистить_SCL (); началось = правда ;  }недействительный i2c_stop_cond ( недействительный ) { // устанавливаем SDA на 0 очистить_SDA (); I2C_задержка (); set_SCL (); // Растягивание часов в то время как ( read_SCL () == 0 ) {     // добавляем таймаут в этот цикл. } // Время установки стоп-бита, минимум 4 мкс I2C_задержка (); // SCL высокий, устанавливаем SDA от 0 до 1 set_SDA (); I2C_задержка (); если ( read_SDA () == 0 ) {     арбитраж_проиграл (); } началось = ложь ;  }// Записываем немного в шину I2Cvoid i2c_write_bit ( логический бит )  { если ( бит ) {   set_SDA (); } еще {   очистить_SDA (); } // Задержка распространения изменения SDA I2C_задержка (); // Устанавливаем высокий уровень SCL, чтобы указать, что доступно новое допустимое значение SDA set_SCL (); // Подождите, пока значение SDA будет прочитано целью, минимум 4 мкс для стандартного режима I2C_задержка (); while ( read_SCL () == 0 ) { // Растягивание часов      // Вам следует добавить таймаут в этот цикл } // Уровень вероятности нежелательной почты высокий, теперь данные действительны // Если SDA высокий, проверяем, что никто больше не управляет SDA if ( бит && ( read_SDA () == 0 )) {       арбитраж_проиграл (); } // Очистим SCL до низкого уровня для подготовки к следующему изменению очистить_SCL ();}// Читаем немного из шины I2Cbool i2c_read_bit ( недействительный ) { логический бит ;  // Пусть данные целевого диска set_SDA (); // Подождите, пока значение SDA будет записано целью, минимум 4 мкс для стандартного режима I2C_задержка (); // Устанавливаем высокий уровень SCL, чтобы указать, что доступно новое допустимое значение SDA set_SCL (); while ( read_SCL () == 0 ) { // Растягивание часов      // Вам следует добавить таймаут в этот цикл } // Подождите, пока значение SDA будет записано целью, минимум 4 мкс для стандартного режима I2C_задержка (); // SCL высокий, бит считывания бит = read_SDA ();   // Устанавливаем низкий уровень SCL для подготовки к следующей операции очистить_SCL (); вернуть бит ; }// Записываем байт в шину I2C. Возвращает 0, если цель подтверждена.bool i2c_write_byte ( bool send_start ,   логический send_stop ,  беззнаковый символьный байт )  { беззнаковый бит ;  бул нэк ;  если ( send_start ) {   i2c_start_cond (); } for ( бит = 0 ; бит < 8 ; ++ бит ) {         i2c_write_bit (( байт & 0x80 ) != 0 );     байт <<= 1 ;   } Nack = i2c_read_bit ();   если ( send_stop ) {   i2c_stop_cond (); } вернуть нак ; }// Читаем байт из шины I2Cбеззнаковый символ i2c_read_byte ( bool nack , bool send_stop )     { беззнаковый символьный байт = 0 ;     бит беззнакового символа ;   for ( бит = 0 ; бит < 8 ; ++ бит ) {         байт = ( байт << 1 ) | i2c_read_bit ();       } i2c_write_bit ( нет ); если ( send_stop ) {   i2c_stop_cond (); } вернуть байт ; }недействительный I2C_delay ( недействительный ) {  летучий int v ;   интервал я ;  для ( я знак равно 0 ; я < I2CSPEED / 2 ; ++ я ) {           в ; }}

Поддержка операционной системы

Инструменты разработки

При разработке или устранении неполадок систем, использующих I 2 C, прозрачность на уровне аппаратных сигналов может быть важна.

Хост-адаптеры

Существует ряд аппаратных решений хост-адаптера I 2 C для создания контроллера I 2 C или целевого соединения с хост-компьютерами под управлением Linux , Mac или Windows . Большинство вариантов представляют собой адаптеры USB -to-I 2 C. Не всем из них требуются проприетарные драйверы или API .

Анализаторы протоколов

Анализаторы протоколов I 2 C — это инструменты, которые выполняют выборку шины I 2 C и декодируют электрические сигналы для обеспечения более высокого уровня представления данных, передаваемых по шине.

Логические анализаторы

При разработке и/или устранении неисправностей шины I 2 C проверка аппаратных сигналов может быть очень важной. Логические анализаторы — это инструменты, которые собирают, анализируют, декодируют и сохраняют сигналы, поэтому люди могут просматривать высокоскоростные сигналы в свободное время. Логические анализаторы отображают временные метки каждого изменения уровня сигнала, что может помочь обнаружить проблемы протокола. Большинство логических анализаторов имеют возможность декодировать сигналы шины в данные протокола высокого уровня и отображать данные ASCII.

Ограничения

В маломощных системах подтягивающие резисторы могут потреблять больше энергии, чем вся остальная конструкция вместе взятая. В них резисторы часто питаются от переключаемого источника напряжения, например, от DIO микроконтроллера. Подтягивания также ограничивают скорость автобуса и требуют небольших дополнительных затрат. Поэтому некоторые разработчики обращаются к другим последовательным шинам, например I3C или SPI , которым не нужны подтяжки.

Назначение целевых адресов является слабостью I 2 C. Семь битов слишком мало, чтобы предотвратить конфликты адресов между многими тысячами доступных устройств. Что облегчает проблему конфликтов адресов между разными поставщиками, а также позволяет подключаться к нескольким идентичным устройствам, так это то, что производители выделяют контакты, которые можно использовать для установки целевого адреса в один из нескольких вариантов адреса для каждого устройства. Обычно используются два или три контакта, а во многих устройствах на каждый адресный контакт имеется три или более вариантов подключения. [29] [30] [31]

10-битные адреса I 2 C еще не получили широкого распространения, и многие операционные системы их не поддерживают. [32] Также не используется сложная схема SMBus «ARP» для динамического назначения адресов (кроме карт PCI с наличием SMBus, для которых она необходима).

Автоматическая конфигурация шины является смежной проблемой. Данный адрес может использоваться рядом различных устройств, несовместимых с протоколом, в различных системах, и вряд ли какие-либо типы устройств могут быть обнаружены во время выполнения. Например, 0x51может использоваться EEPROM 24LC02 или 24C32 с несовместимой адресацией; или по RTC PCF8563 , который нельзя надежно отличить ни от того, ни от другого (без изменения состояния устройства, что может быть запрещено). Единственные надежные механизмы настройки, доступные хостам, включают внеполосные механизмы, такие как таблицы, предоставляемые системной прошивкой, в которых перечислены доступные устройства. Опять же, эту проблему можно частично решить с помощью ARP в системах SMBus, особенно когда используются идентификаторы поставщиков и продуктов; но это не прижилось. Версия спецификации I 2 C версии 3 добавляет механизм идентификации устройства.

I 2 C поддерживает ограниченный диапазон скоростей. Хосты, поддерживающие мультимегабитные скорости, встречаются редко. Поддержка скорости Fm+ 1 Мбит/с более распространена, поскольку ее электроника представляет собой простые варианты того, что используется на более низких скоростях. Многие устройства не поддерживают скорость 400 Кбит/с (отчасти потому, что SMBus ее еще не поддерживает). Узлы I 2 C, реализованные программно (вместо выделенного оборудования), могут даже не поддерживать скорость 100 Кбит/с; поэтому весь диапазон, определенный в спецификации, редко можно использовать. Все устройства должны хотя бы частично поддерживать максимальную используемую скорость, иначе они могут ошибочно определить адрес своего устройства.

Устройствам разрешено растягивать тактовые циклы в соответствии с их конкретными потребностями, что может привести к ограничению полосы пропускания, необходимой для более быстрых устройств, и увеличению задержек при обмене данными с адресами других устройств. Емкость шины также ограничивает скорость передачи данных, особенно когда источники тока не используются для уменьшения времени нарастания сигнала.

Поскольку I 2 C является общей шиной, существует вероятность того, что любое устройство выйдет из строя и приведет к зависанию всей шины. Например, если какое-либо устройство удерживает на линии SDA или SCL низкий уровень, это не позволяет контроллеру отправлять команды START или STOP для сброса шины. Таким образом, конструкции обычно включают в себя сигнал сброса, который обеспечивает внешний метод сброса устройств шины. Однако многие устройства не имеют специального контакта сброса, что вынуждает разработчика включать схему, позволяющую включать и выключать устройства, если их необходимо перезагрузить.

Из-за этих ограничений (управление адресами, конфигурация шины, потенциальные неисправности, скорость) лишь немногие сегменты шины I 2 C имеют даже дюжину устройств. Системы обычно имеют несколько таких сегментов. Один из них может быть предназначен для использования с высокоскоростными устройствами для управления питанием с малой задержкой. Другой можно использовать для управления несколькими устройствами, для которых задержка и пропускная способность не являются важными проблемами; еще один сегмент может использоваться только для чтения микросхем EEPROM, описывающих дополнительные карты (например, стандарт SPD , используемый с планками DRAM).

Производные технологии

I 2 C является основой для ACCESS.bus , интерфейса канала данных дисплея VESA (DDC), шины управления системой (SMBus), шины управления питанием (PMBus) и шины управления интеллектуальной платформой (IPMB, одного из протоколов ИПМИ ). Эти варианты имеют различия в диапазонах напряжения и тактовой частоты, а также могут иметь линии прерываний .

Системы высокой доступности ( AdvancedTCA , MicroTCA ) используют двусторонний резервный интерфейс I2C для управления полками. Возможность использования нескольких контроллеров I 2 C является обязательным требованием в этих системах.

TWI (двухпроводной интерфейс) или TWSI (двухпроводный последовательный интерфейс) — это, по сути, одна и та же шина, реализованная на различных внутрикристальных процессорах от Atmel и других производителей. [33] Продавцы используют название TWI, хотя по состоянию на 7 ноября 2014 г. I 2 C не является зарегистрированным товарным знаком. [34] Защита товарных знаков существует только для соответствующего логотипа (см. верхний правый угол), а срок действия патентов на I 2 C истек. [ нужна цитация ] Согласно Microchip Technology , TWI и I2C имеют несколько различий. Одна из них заключается в том, что TWI не поддерживает СТАРТ-байт. [35]

В некоторых случаях использование термина «двухпроводной интерфейс» указывает на неполную реализацию спецификации I 2 C. Отсутствие поддержки арбитража или расширения тактовой частоты является одним из распространенных ограничений, которое по-прежнему полезно для одного контроллера, взаимодействующего с простыми целями, которые никогда не растягивают тактовую частоту.

Стандарт интерфейса датчика MIPI I3C (I3C) является развитием I 2 C и находится в стадии разработки в 2017 году. [36]

Редакции

Смотрите также

Рекомендации

  1. ^ "Финансовые пресс-релизы-NXP" . инвесторы.nxp.com . Проверено 29 апреля 2018 г.
  2. ^ "MCP23008". Микрочип . 26 мая 2021 г. Архивировано из оригинала 26 мая 2021 г.
  3. ^ abcde «Спецификация шины I2C, версия 7» (PDF) . НХП Полупроводники . 1 октября 2021 г. Архивировано из оригинала (PDF) 6 октября 2022 г.
  4. ^ «7-битная, 8-битная и 10-битная адресация подчиненного устройства I2C» . Общая фаза . Архивировано из оригинала 1 июня 2013 г. Проверено 29 апреля 2018 г.
  5. ^ «8-кибитная последовательная шина I2C EEPROM (PDF)» (PDF) . СТМикроэлектроника . Октябрь 2017 г. Архивировано (PDF) из оригинала 18 октября 2019 г. Проверено 19 ноября 2019 г.
  6. ^ Использование протоколов ZONE_READ и ZONE_WRITE (PDF) (Примечания по применению). Версия 1.0.1. Форум по интерфейсу управления системой. 07.01.2016. АН001. Архивировано (PDF) из оригинала 22 сентября 2017 г.
  7. ^ «Есть ли какое-либо четкое руководство по распиновке I2C? Не ищите «СТАНДАРТ»» . СтекExchange.
  8. ^ Примечание по применению NXP AN11075: Передача сигналов шины I2C по витой паре с помощью PCA9605 (PDF) , 16 августа 2017 г., заархивировано из оригинала (PDF) 16 августа 2017 г.
  9. ^ Васкес, Джошуа (16 августа 2017 г.), Прыжок с борта: введение в I2C по длинным проводам, заархивировано из оригинала 16 августа 2017 г.
  10. ^ Формат стекируемой платы iPack, 19 августа 2017 г., заархивировано из оригинала 19 августа 2017 г.
  11. ^ Феррари, Марио; Феррари, Джулио (29 апреля 2018 г.). Строим роботов с помощью LEGO Mindstorms NXT. Сингресс. стр. 63–64. ISBN 9780080554334. Архивировано из оригинала 29 апреля 2018 г.
  12. ^ Гаспери, Майкл; Хурбен, Филипп (2010), «Глава 13: Связь по шине I2C», Extreme NXT: Расширение LEGO MINDSTORMS NXT до следующего уровня , ISBN 9781430224549
  13. ^ Филон. «Разъем разъема NXT». Архивировано 20 августа 2017 г. на Wayback Machine.
  14. ^ Сиван Толедо. «Интерфейс I2C, часть 1: Добавление цифровых портов ввода-вывода». Архивировано 12 августа 2017 г. на Wayback Machine . 2006 г.
  15. ^ «Надежная отправка I2C по кабелям Cat5». Архивировано 18 августа 2017 г. на Wayback Machine.
  16. ^ «Разъемы и кабели шины I2C». Архивировано 18 августа 2017 г. на Wayback Machine.
  17. ^ «Несколько шин I2C · Testato/SoftwareWire Wiki» . Гитхаб .
  18. ^ «Совместное использование шины I2C | Микрочип» .
  19. ^ «Таблица распределения адресов I2C» (PDF) (Руководство по выбору). Филипс Полупроводники . 24 августа 1999 г. Архивировано из оригинала (PDF) 16 октября 2017 г. Проверено 1 октября 2017 г.
  20. ^ Справочник данных IC12: Периферийные устройства I2C, код заказа Philips 9397 750 00306.
  21. ^ «Спецификация шины управления системой (SMBus)» (PDF) . Версия 3.0. Форум по интерфейсу управления системой. 20 декабря 2014 г. стр. 81–82. Архивировано (PDF) из оригинала 29 января 2016 г. Проверено 1 декабря 2017 г.
  22. ^ ab «Стандарт командного интерфейса канала данных дисплея VESA (DDC/CI)» (PDF) . Версия 1.1. ВЕСА . 29 октября 2004 г. стр. 15–16. Архивировано (PDF) из оригинала 9 сентября 2016 г. Проверено 1 декабря 2017 г.
  23. ^ «Спецификация интерфейса управления интеллектуальной платформой, второе поколение V2.0» (PDF) . Версия документа 1.1. Intel, NEC, Hewlett-Packard и Dell. 01.10.2013. п. 563. Архивировано (PDF) из оригинала 27 марта 2016 г. Проверено 1 декабря 2017 г. 7-битная часть подчиненного адреса BMC — 0010_000b.
  24. ^ Драйвер TWI Master Bit Band; Атмел; Июль 2012 г. Архивировано 29 марта 2017 г. в Wayback Machine .
  25. ^ Компонент i2c.resource. Архивировано 24 июля 2011 г. на Wayback Machine для AmigaOS 4.x.
  26. ^ Тео де Раадт (29 мая 2015 г.). "/sys/dev/i2c/i2c_scan.c#probe_val". Перекрестная ссылка BSD суперпользователя . OpenBSD . Проверено 4 марта 2019 г.static u_int8_t probe_val[256];
  27. ^ Константин А. Муренин (21 мая 2010 г.). «5.2. Сканирование шины I 2 C через i2c_scan.c». Аппаратные датчики OpenBSD — мониторинг окружающей среды и управление вентиляторами ( диссертация на степень магистра математики ). Университет Ватерлоо : UWSpace. hdl : 10012/5234. Идентификатор документа: ab71498b6b1a60ff817b29d56997a418.
  28. ^ Введение в HID через I2C
  29. ^ LTC4151 компании Linear Technology, архивировано 9 августа 2017 г. на Wayback Machine , имеет два контакта для выбора адреса, каждый из которых можно подключить к высокому или низкому уровню или оставить неподключенным, предлагая 9 различных адресов.
  30. ^ MAX7314 Максима, архивировано 13 июля 2017 г. на Wayback Machine, имеет один контакт для выбора адреса, который может быть привязан к высокому или низкому уровню или подключен к SDA или SCL, предлагая 4 разных адреса.
  31. ^ UCD9224 компании TI, архивировано 7 ноября 2017 г. на Wayback Machine, использует два канала АЦП, различающих двенадцать уровней каждый, для выбора любого допустимого 7-битного адреса.
  32. ^ Дельвар, Жан (16 августа 2005 г.). «Re: [ИСПРАВЛЕНИЕ 4/5] добавьте i2c_probe_device и i2c_remove_device». linux-kernel (список рассылки). Архивировано из оригинала 17 августа 2016 г.
  33. ^ avr-libc: Пример использования двухпроводного интерфейса (TWI). Архивировано 27 мая 2007 г. на Wayback Machine .
  34. ^ "ТЭСС -- Ошибка". tmsearch.uspto.gov . Проверено 29 апреля 2018 г.[ постоянная мертвая ссылка ]
  35. ^ «Что такое TWI? Как настроить TWI для связи I2C» (PDF) . Микрочиповая технология. 2018.
  36. ^ Торнтон, Скотт (29 ноября 2017 г.). «Улучшенная межинтегральная схема (I3C)». Советы по микроконтроллеру . Архивировано из оригинала 3 февраля 2018 г.
  37. ^ Патент США 4689740, «Двухпроводная шинная система, включающая провод синхронизации и провод данных для соединения нескольких станций», выдан 25 августа 1987 г., передан корпорации Philips в США. 
  38. ^ «Philips подает в суд еще на восемь компаний за нарушение патента на шину I2C» . ЭЭ Таймс . 17 октября 2001 г. Архивировано из оригинала 2 апреля 2021 г.
  39. ^ Спецификация шины I2C, версия 2.0; Филипс Полупроводники; декабрь 1998 г.; В архиве.
  40. ^ Спецификация шины I2C, версия 2.1; Филипс Полупроводники; январь 2000 г.; В архиве.
  41. ^ Спецификация шины I2C, версия 3; НХП Полупроводники; 19 июня 2007 г.; В архиве.
  42. ^ Спецификация шины I2C, версия 4; НХП Полупроводники; 13 февраля 2012 г.; В архиве.
  43. ^ Спецификация шины I2C, версия 5; НХП Полупроводники; 9 октября 2012 г.; В архиве.
  44. ^ «Спецификация шины I2C, версия 6» (PDF) . НХП Полупроводники . 4 апреля 2014 г. Архивировано из оригинала (PDF) 26 апреля 2021 г.

дальнейшее чтение

Внешние ссылки