![]() |
![]() |
![]() | ||||
|
|
|
|
| ||
| Интерфейс i2C |
Описание
интерфейса I2C.
1.0. Концепция шины I2C. 2.0. Общие параметры. 2.1. Валидность данных. 3.0. Пересылка бита. 3.1. Формат байта. 3.2. Подтверждение. 4.0. Синхронизация. 4.1. Арбитраж. 4.2. Использование механизма синхронизации как процедуры управления связью. 5.0. Форматы с 7-битным адресом. 6.0. 7-битная адресация. 6.1. Назначение битов первого байта. 6.1.1. Адрес общего вызова. 6.1.2. Байт СТАРТА. 6.1.3. Совместимость с CBUS. 7.0. Электрические параметры устройств I2C. 8.0. Максимальные и минимальные значения для резисторов Rp и Rs. 9.0. Дополнения к спецификации шины I2C. 10.0. Быстрый режим. 11.0. 10-битная адресация. 11.1. Назначение битов первых двух байтов. 11.2. 10-битные форматы. 12.0. Адрес общего вызова и байт СТАРТА. 13.0. Электрические и временные параметры. 14.0. Практические рекомендации. 14.1. Особенность реализации интерфейса с шиной I2C в ЭКЛЗ. 14.2. Рекомендации по созданию "Master"- устройства. 1.0. Концепция шины I2C. Шина I2C поддерживает любую технологию изготовления микросхем (НМОП, КМОП, биполярную). Две линии, данных (SDA) и синхронизации (SCL), служат для переноса информации. Каждое устройство распознается по уникальному адресу и может работать как передатчик или приёмник, в зависимости от назначения устройства. Кроме того, устройства могут быть классифицированы как ведущие и ведомые при передаче данных (см. Таблицу 1 ). Ведущий - это устройство, которое инициирует передачу данных и вырабатывает сигналы синхронизации. При этом любое адресуемое устройство считается ведомым по отношению к ведущему. Таблица 1. Терминология шины I2C
Рисунок 1. Пример конфигурации шины I2C с двумя микроконтроллерами. ![]()
Шина I2C допускает несколько ведущих. Это означает, что более чем одно устройство, способное управлять шиной, может быть подключено к ней. Поскольку в качестве ведущих обычно выступают микроконтроллеры, давайте рассмотрим пример пересылки данных между двумя микроконтроллерами, подключенными к шине (см. Рисунок 3). Пример покажет взаимоотношения передатчик-приемник и ведущий-ведомый, существующие в шине I2C. Необходимо заметить, что эти отношения не постоянны, а зависят только от направления пересылки данных в данный момент времени. Пересылка данных будет происходить следующим образом: 1. Пусть микроконтроллер А желает послать информацию в микроконтроллер В:
2. Пусть микроконтроллер А желает принять информацию от микроконтроллера В:
В обоих случаях ведущий (микроконтроллер А) генерирует синхроимпульсы и заканчивает пересылку. Возможность подключения более одного микроконтроллера к шине
означает, что более чем один ведущий может попытаться начать пересылку в
один и тот же момент времени. Для устранения хаоса, который может
возникнуть в данном случае, разработана процедура арбитража. Эта
процедура основана на том, что все I2C -устройства подключаются к шине по правилу
монтажного И. Подробнее об арбитраже см. Генерация синхросигнала - это всегда обязанность ведущего; каждый ведущий генерирует свой собственный сигнал синхронизации при пересылке данных по шине. Сигнал синхронизации может быть изменен только если он "вытягивается" медленным ведомым устройством (путем удержания линии в низком состоянии), или другим ведущим, если происходит столкновение. 2.0. Общие параметры. Как SDA, так и SCL являются
двунаправленными линиями,
подсоединенными к положительному
источнику питания через
подтягивающий резистор Рисунок 2. Подключение I2C устройств к шине. ![]()
Данные на линии SDA должны
быть стабильными в течение ВЫСОКОГО
периода синхроимпульса. ВЫСОКОЕ или
НИЗКОЕ состояние линии данных должно
меняться, только если линия
синхронизации в состоянии НИЗКОЕ Рисунок 3. Пересылка бита в шине I2C ![]()
Специальные ситуации на
шине отмечают сигналы START и STOP Переход линии SDA из ВЫСОКОГО состояния в НИЗКОЕ, в то время как SCL находится в ВЫСОКОМ состоянии означает START. Переход линии SDA из НИЗКОГО состояния в ВЫСОКОЕ при SCL в ВЫСОКОМ состоянии означает STOP. Сигналы СТАРТ и СТОП всегда вырабатываются ведущим. Считается, что шина занята после сигнала СТАРТ. Шина считается освободившейся через определенное время после сигнала СТОП. Определение сигналов СТАРТ и СТОП устройствами, подключенными к шине достаточно легко, если в них встроены необходимые цепи. Однако микроконтроллеры без таковых цепей должны осуществлять считывание значения линии SDA как минимум дважды за период синхронизации для того, чтобы определить переход состояния. Рисунок 4. Сигналы СТАРТ и СТОП. ![]()
Вследствие различных технологий микросхем (КМОП, НМОП, биполярная), которые могут быть подключены к шине, уровни логического нуля ("НИЗКИЙ") и логической еденицы ("ВЫСОКИЙ") не фиксированы и зависят от соответствующего уровня Vdd (см. Раздел 13.0 для электрических параметров). Один синхроимпульс генерируется на каждый пересылаемый бит. 3.1. Формат байта.Каждый байт, передаваемый по
линии SDA, должен состоять из 8 бит.
Количество байт, передаваемых за
один сеанс связи неограничено.
Каждый байт должен оканчиваться
битом подтверждения. Данные
передаются, начиная с наиболее
значащего бита В некоторых случаях, необходимо использовать другой формат данных (например, CBUS). Посылка, которая передается с таким адресом, может быть закончена выдачей сигнала СТОП, даже если это происходит во время передачи байта. В этом случае подтверждение не генерируется (см. Раздел 6.1.3). Рисунок 5. Пересылка данных по шине I2C ![]()
Подтверждение при передаче
данных обязательно. Соответствующий
испульс синхронизации генерируется
ведущим. Передатчик отпускает (ВЫСОКОЕ)
линию SDA в течение синхроимпульса
подтверждения. Приёмник должен
удерживать линию SDA в течение
ВЫСОКОГО состояния синхроимпульса
подтверждения в стабильно НИЗКОМ
состоянии Обычно, приёмник, который был адресован, обязан генерировать подтверждение после каждого принятого байта, исключая те случаи, когда посылка начинается с адреса CBUS (см. Раздел 6.1.3). В том случае, когда ведомый-приёмник не может подтвердить свой адрес (например, когда он выполняет в данный момент какие-либо функции реального времени), линия данных должна быть оставлена в ВЫСОКОМ состоянии. После этого ведущий может выдать сигнал СТОП для прерывания пересылки данных. Если ведомый-приёмник подтвердил свой адрес, но через некоторое время больше не может принимать данные, ведущий также должен прервать пересылку. Для этого ведомый не подтверждает следующий байт, оставляет линию данных в ВЫСОКОМ состоянии и ведущий генерирует сигнал СТОП. Если в пересылке участвует ведущий-приёмник, то он должен сообщить об окончании передачи ведомому-передатчику путем не подтверждения последнего байта. Ведомый-передатчик должен освободить линию данных для того, чтобы позволить ведущему выдать сигнал СТОП или повторить сигнал СТАРТ. Рисунок 6. Подтверждение. ![]()
При передаче посылок по шине
Синхронизация выполняется с использованием подключения к линии SCL по правилу монтажного И. Это означает, что вследствие перехода линии SCL из ВЫСОКОГО состояния в НИЗКОЕ, вызванного переходом синхросигнала одного из устройств в НИЗКОЕ состояние, произойдет также переход синхросигнала другого устройства в НИЗКОЕ состояние. Это состояние линии SCL
удерживается до тех пор, пока не
будет достигнуто ВЫСОКОЕ состояние
внутреннего синхросигнала одного из
устройств Когда у всех задействованных устройств кончится НИЗКИЙ период синхросигнала, линия SCL перейдет в ВЫСОКОЕ состояние. Все устройства начнут проходить ВЫСОКИЙ период своих синхросигналов. Первое устройство, у которого кончится этот период, снова установит линию SCL в НИЗКОЕ состояние. Таким образом, НИЗКИЙ период синхролинии SCL определяется наидлиннейшим периодом синхронизации из всех задействованных устройств, а ВЫСОКИЙ период определяется самым коротким периодом синхронизации устройств. Рисунок 7. Синхронизация во время арбитража. ![]()
Ведущий может начинать пересылку данных только если шина свободна. Два и более ведущих могут сгенерировать сигнал СТАРТ за время минимального удерживания (Thd;sta), что ведет к определенному сигналу СТАРТ на шине. Арбитраж происходит на шине SDA, в периоды, когда шина SCL находится в ВЫСОКОМ состоянии. Если один ведущий передает на линию данных НИЗКИЙ уровень, в то время как другой - ВЫСОКИЙ, то последний отключается от линии, так как состояние SDL (НИЗКОЕ) не соответствует ВЫСОКОМУ состоянию его внутренней линии данных. Арбитраж может продолжаться на протяжении нескольких бит. Так как сначала передается адрес, а потом, то арбитраж может продолжаться до окончания адреса, а если ведущие адресуют одно и то же устройство, то в арбитраже будут участвовать и данные. Вследствие такой схемы арбитража при столкновении данные не теряются. Ведущему, проигравшему арбитраж, разрешается выдавать синхроимпульсы на шину SCL до конца байта, в течение которого был потерян доступ. Если в устройство ведущего также встроены и функции ведомого и он проигрывает арбитраж на стадии передачи адреса, то он немедленно должен переключиться в режим ведомого, так как выигравший арбитраж ведущий мог адресовать его. Рисунок 8 показывает процедуру арбитража двух ведущих. Конечно, большее количество ведущих может быть вовлечено в процесс. В момент, когда обнаруживается различие между уровнем внутренней линии данных и SDA, выход первого ведущего принимает ВЫСОКОЕ значение, не влияя таким образом на пересылку данных выигравшего ведущего. Вследствие того, что арбитраж зависит только от адреса и данных, передаваемых соревнующимися ведущими, не существует центрального ведущего, а также приоритетного доступа к шине. Особое внимание следует обратить на ситуацию, когда во время арбитражной процедуры на шину передается повторный сигнал СТАРТ или сигнал СТОП. Если существует возможность возникновения такой ситуации, то ведущие должны послать повторный сигнал СТАРТ или сигнал СТОП в одних и тех же позициях кадра. Другими словами, арбитраж запрещен между:
Рисунок 8. Арбитраж между двумя ведущими. ![]() * передатчик 1 проигрывает арбитраж - его линия данных не совпадает с SDA. 4.2. Использование механизма синхронизации как процедуры управления связью.Кроме использования в процедуре арбитража, механизм синхронизации может быть использован приемниками как средство управления пересылкой данных на байтовом и битовом уровнях. На уровне байта, если устройство может принимать байты данных с большой скоростью, но требует определенное время для сохранения принятого байта или подготовки к приему следующего, то оно может удерживать линию SCL в НИЗКОМ состоянии после приема и подтверждения байта, переводя таким образом передатчик в состояние ожидания. На уровне битов, устройство,
такое как микроконтроллер без
встроенных аппаратных цепей Посылки данных происходят в
формате, показанном на Рисунок 9. Посылка данных. ![]()
После сигнала СТАРТ посылается адрес ведомого. После 7 бит адреса следует бит направления данных (R/W), "ноль" означает передачу (запись), а "единица" - прием (чтение). Пересылка данных всегда заканчивается сигналом СТОП, генерируемым ведущим. Однако, если ведущий желает оставаться на шине дальше, он должен выдать повторный сигнал СТАРТ и затем адрес следующего устройства. При таком формате посылки возможны различные комбинации чтения/записи. Возможные форматы:
Рисунок 10. ![]()
Рисунок 11. ![]() Рисунок 12. ![]()
ПРИМЕЧАНИЯ:
Процедура адресации на шине Первые семь битов первого
байта образуют адрес ведомого Рисунок 13. Первый байт после сигнала СТАРТ. ![]()
После того, как адрес послан, каждое устройство в системе сравнивает первые семь бит после сигнала СТАРТ со своим адресом. При совпадении устройство полагает себя выбранным как ведомый-приёмник или как ведомый-передатчик, в зависимости от бита направления. Адрес ведомого может состоять из фиксированной и программируемой частей. Вероятно, что в системе будет несколько таких одинаковых устройств, поэтому при помощи программируемой части адреса становится возможным подключить к шине максимально возможное количество таких устройств. Количество программируемых бит в адресе зависит от количества свободных выводов микросхемы. Например, если устройство имеет 4 фиксированных и 3 программируемых адресных битов, всего 8 одинаковых устройств может быть подключено к шине. Комитет I2C координирует выделение I2C адресов. Две группы по восемь адресов (0000ХХХ и 1111ХХХ) зарезервированы для целей, указанных в таблице 2. Комбинация бит 11110ХХ адреса зарезервирована для 10-битной адресации (см. Раздел 11.0). Таблица 2. Зарезервированные адреса.
ПРИМЕЧАНИЯ:
Адрес общего вызова адресует все устройства на шине. Однако, если устройству не нужны какие-либо данные, которые могут быть переданы по общему вызову, оно может игнорировать обращение путем не выдачи подтверждения. Если устройству нужны данные общего вызова, оно генерирует подтверждение и становится ведомым-приёмником. Второй и последующий байты должны подтверждаться каждым ведомым-приёмником, способным обработать эти данные. Есть ведомый не может обработать один из байтов, он не генерирует подтверждение. Значение посылки общего вызова всегда определяется вторым байтом (см. Рисунок 14). Существуют два варианта:
Когда бит "0", второй байт обладает следующим значением:
Остальные коды не установлены и устройства должны игнорировать их. Когда бит "1", двухбайтовая последовательность называется "аппаратный общий вызов". Это означает, что последовательность передана аппаратным ведущим устройством (таким как сканер клавиатуры), которое не может быть запрограммировано на выдачу конкретного адреса ведомого. Поскольку аппаратный ведущий не знает, какому устройству передается посылка, он может только сгенерировать аппаратный общий вызов и свой собственный адрес - идентифицируя себя для системы(см. Рисунок 15) Семь битов, остающихся во втором байте, содержат адрес аппаратного ведущего. Этот адрес распознается умным устройством (микроконтроллером), которое потом будет получать информацию от аппаратного ведущего. Если последний также может работать как ведомый, его адрес совпадает с адресом ведущего. С другой стороны в некоторых
системах аппаратный ведущий-передатчик
устанавливается в режим ведомого-приёмника
сразу после сброса. Таким способом,
ведущий, конфигурирующий систему,
может сообщить аппаратному ведущему
(который находится в режиме ведомый-приемник),
на какой адрес должны посылаться
данные Рисунок 14. Формат адреса общего вызова. ![]()
Рисунок 15. Пересылка данных из аппаратного ведущего-передатчика. ![]()
Рисунок 16. ![]() (а) Конфигурирующий ведущий посылает адрес начала данных к аппаратному ведущему (b) Аппаратный ведущий посылает данные выбранному ведомому
Микроконтроллеры могут быть подключены к шине двумя способами. Микроконтроллер с встроенными шинными цепями разгружен и только реагирует при помощи прерываний на события, происходящие на шине, в то время как микроконтроллер без таких цепей должен постоянно отслеживать состояние шины программным способом. Очевидно, что чем больше времени процессор тратит на обслуживание шины, тем меньше у него остается на основную задачу. Вследствие этого возникает разница между быстрыми аппаратными устройствами и медленными микроконтроллерами, полагающимися на программный опрос. В этом случае посылка данных
может начинаться со стартовой
процедуры, которая много дольше, чем
обычный сигнал СТАРТ
Ведущий-передатчик после обычного сигнала СТАРТ передает байт СТАРТА (00000001). Микроконтроллер поэтому может отслеживать линию SDA с меньшей частотой, пока не обнаружит последовательность из семи нулей, по сути - НИЗКИЙ уровень на SDA на протяжении семи тактовых импульсов. После обнаружения этой последовательности микроконтроллер может переключится на более высокую частоту опроса шины, для того чтобы обнаружить повторный сигнал СТАРТ. Аппаратный приёмник После байта СТАРТА генерируется тактовый импульс для подтверждения. Он присутствует только для совместимости с форматом байта. Устройствам запрещается подтверждать прием байта СТАРТА. Рисунок 17. Процедура байта СТАРТА. ![]()
Приёмники CBUS могут быть
подключены к шине В смешанной шине Ведущие-передатчики могут посылать данные в CBUS формате после посылки адреса CBUS. Передача заканчивается сигналом СТОП, распознаваемым всеми устройствами. ПРИМЕЧАНИЕ: Если конфигурация шины CBUS известна и расширение CBUS-совместимых устройств не предусматривается, конструктору разрешается устанавливать время удержания (DLEN), руководствуясь конкретными требованиями используемых устройств. Рисунок 18. Формат данных при посылках с CBUS передатчиком/приемником. ![]()
Электрические параметры
ввода/вывода Когда устройства с
фиксированным входным уровнем
смешаны с устройствами с
относительным входным уровнем,
последние должны быть подключены к
одной общей линии питания Входные уровни определяются следующим образом:
Как показано на Рисунке 22,
последовательно включенные
резисторы Rs (например, Рисунок 19.
Подключение устройств с
фиксированным входным уровнем к шине
![]() Рисунок 20.
Подключение устройств с широким
диапазоном питания к шине ![]() Рисунок 21.
Подключение устройств с
относительным (Vdd1) уровнем входного
напряжения и фиксированным входным
уровнем (Vdd2-4) к шине ![]() Рисунок 22. Последовательные резисторы Rs для защиты от высоковольтных выбросов.
Для
Величина питающего
напряжения ограничивает минимальное
значение Rp вследствие ограниченного
минимального тока выходных каскадов Желаемая шумовая граница Емкость шины состоит из общей емкости проводов, подключенных портов и контактов. Эта емкость ограничивает максимальное значение Rp вследствие ограничений на время установления (фронта). Рисунок 25 показывает Rpmax как функцию от емкости шины. Максимальный ток при
ВЫСОКОМ уровне для каждого порта не
превышает Рисунок 23. Минимальное значение Rp как функция от напряжения питания при параметре Rs. ![]() Рисунок 24. Максимальное значение Rs как функция от Rp при параметре - Vdd. ![]() Рисунок 25. Максимальное значение Rp как функция от емкости шины для стандартного режима. ![]() Рисунок 26. Общий ток при напряжении ВЫСОКОГО уровня как функция максимального значения Rp при параметре - Vdd.
Шина
Существуют две причины, ради которых были сделаны эти дополнения:
Устройства с Очевидно, что стандартные устройства не способны работать в быстрой шине, потому что они не могут синхронизироваться на высокой скорости и их состояние станет непредсказуемым. Ведомые быстрые устройства могут обладать как 7-битным, так и 10-битным адресом. Однако, 7-битный адрес более предпочтителен, так как его аппаратная реализация более проста и длина посылки меньше. Устройства с 7-битным и 10-битным адресами могут одновременно использоваться на одной шине, независимо от скорости передачи. 10.0. Быстрый режим.В быстром режиме протокол, формат, логические уровни и максимальная емкостная нагрузка линий шины остается неизменными. Изменения в спецификации таковы:
10-битная адресация не меняет формат шины. Для этого используется зарезервированная адресная комбинация 1111ХХХ первых семи бит первого байта (см. Раздел 6.0). 10-битная адресация не влияет на существующую 7-битную адресацию. Устройства с 7-битной и 10-битной адресацией могут быть подключены к одной шине. Хотя имеются восемь возможных комбинаций последовательности 1111ХХХ, из них используются только четыре - 11110ХХ. Комбинации типа 11111ХХ зарезервированы для дальнейших улучшений шины. 11.1. Назначение битов первых двух байтов.10-битный адрес формируется из первых двух байтов. Первые семь бит первого байта являются комбинацией вида 11110ХХ, где два младших бита (ХХ) являются двумя старшими (9 и 8) битами 10-битного адреса; восьмой бит первого байта - бит направления. "Ноль" в этом бите означает, что ведущий собирается записывать информацию в ведомого, а "единица" - что ведущий будет считывать информацию из ведомого. Если бит направления равен "нулю", то второй байт содержит оставшиеся 8 бит 10-битного адреса. Если бит направления равен "единице", то следующий байт содержит данные, переданные с ведомого ведущему. 11.2. 10-битные форматы.Возможны различные комбинации форматов 10-битных посылок:
Рисунок 27. Комбинированный формат. Ведущий адресует ведомого 10-битным адресом, потом передает ему данные и принимает из него данные. ![]()
Рисунок 28. Комбинированный формат. Ведущий передает данные двум ведомым, оба 10-битные. ![]()
Рисунок 29. Комбинированный формат. Ведущий передает данные двум ведомым, один из них 7-битный, второй - 10-битный. ![]()
ПРИМЕЧАНИЯ:
Процедура 10-битной адресации такова, что первые два байта после сигнала СТАРТ определяют адрес ведомого. Исключение составляет адрес "общего вызова" 00000000. Ведомые устройства с 10-битной адресацией должны реагировать на "общий вызов" также, как и устройства с 7-битной адресацией. Аппаратные ведущие могут передавать свои 10-битные адреса после "общего вызова". В этом случае, с байтом "общего вызова" следуют два байта, содержащих 10-битный адрес ведущего-передатчика. Формат совпадает с показанным на рис. 15, только первый байт ДАННЫХ содержит 8 младших разрядов адреса. Байт СТАРТА 00000001 может предварять 10-битный адрес точно таким же способом, как и при 7-битной адресации (см. Раздел 6.0). 13.0. Электрические и временные параметры.Уровни ввода/вывода, ток,
подавление выбросов, управление
скоростью нарастания и емкость
контактов для Шумовые границы для ВЫСОКОГО и НИЗКОГО уровней для быстрых устройств совпадает с границами для стандартных устройств (см. Раздел 7.0). Минимальное значение
НИЗКОГО и ВЫСОКОГО периодов линии SCL,
указанные в таблице 4,
определяет максимальные скорости
передачи Таблица 3. Электрические параметры.
ПРИМЕЧАНИЯ: *1) Максимальное * Максимальное время Tf для
линий SDA и SCL, указанное в таблице 4
** C - емкость одной линии шины в пФ. *** Порты ввода/вывода быстрых устройств при выключенном питании не должны нарушать работу шины. Рисунок 30.
Временная диаграмма работы шины ![]() Таблица 4. Временные параметры.
ПРИМЕЧАНИЯ: Все значения отночительно уровней Vihmin и Vilmax (табл 3) * Устройство должно
обеспечить время удержания не менее ** Время удержания должно достигать максимума только если устройство не вытягивает НИЗКИЙ период сигнала SCL. *** Быстрые устройства могут
быть использованы в медленной шине,
но требование Tsu;dat > 250 нс должно
выполняться. Это происходит
автоматически, если устройство не
вытягивает НИЗКИЙ период SCL. Если же
устройство вытягивает НИЗКИЙ период,
оно должно выдать следующий бит на
линию данных SDA за время T до
отпускания линии SCL, где **** С - общая ёмкость шины в пФ. 14.0. Практические рекомендации.Ниже мы рассмотрим основные
трудности, связанные с
использованием шины Электрический интерфейс
шины Анализируемое устройство
отрабатывает интерфейс "Slave"-адрес ЭКЛЗ на шине ЭКЛЗ не реагирует на команды "общий вызов" и "байт СТАРТА", совместим для совместной работы с 10-и битово адресуемыми устройствами. Подстройку скорости обмена данными под свои возможности ЭКЛЗ производит путем перевода линии SCL в
НИЗКОЕ состояние. ЭКЛЗ не способен работать в "быстром" режиме Типичная ошибка при реализации программ "Master"-абонента - управление значением порта для установки нулевого и единичного состояний линий SCL и SDA. Если для, например, ОМЭВМ семейства MCS-51 это нормальный режим работы, так как единичное состояние порта у них реализуется встроенным подтягивающим резистором = 50 кОм, то для ОМЭВМ с симметричными портами (Motorola 68HCxx, Microchip PIC, Atmel AVR), а так же при использовании LPT-порта IBM-совместимого компьютера в однонаправленном режиме вывода (линии LPT-порта D0-D7), это будет порождать электрические конфликты. Например, в руководстве "Microchip. Embedded Control Handbook 1994/1995" приведены практические программы для связи PIC c шиной I2C, содержащие подобные грубые ошибки. Положение усугубляется тем, что в случае взаимодействия по шине I2C с некоторыми микросхемами (например, EEPROM) такой вариант может сработать, так как они являются 100% аппаратными схемами и не вносят задержек в связной протокол, а паузу ожидания окончания цикла программирования производят переходом в пассивное состояние. Использование таких подпрограмм с устройствами, производящими захват линии SCL (а в случае ЭКЛЗ так оно и есть), приведет к невозможности связи, а возможно, и к выходу одного из сопрягаемых устройств из строя. Реализовать настоящую имитацию ОК (мы назвали этот режим имитацией ОК, так он не позволяет устанавливать на линии напряжение выше напряжения питания, что было бы нормально для настоящего ОК, но так как по спецификации I2C напряжение на линиях SCL и SDA не должно превышать напряжение питания, его вполне законно можно считать выходом с ОК) на порте с симметричным выходом можно, если установить значение порта постоянно в ноль, а управлять состоянием линии через манипуляции с регистром направления данных. Для ОМЭВМ PIC это будет регистр "TRISx", переводящий порт либо в третье состояние, либо подключающий линии в соответствии с состоянием регистра "PORTx". Практически так же это реализуется в AVR и MC68HC05 (08, 11), где "DDRx" коммутирует порт "PORTx", с той лишь разницей, что у них другая полярность управляющего сигнала - у PIC ноль в "TRISx" соответствует нулю на выходе, а у AVR и MC68HC05 единица в "DDRx" соответствует нулю на выходе. Еще одна тонкость, не имеющая собственно к I2C никакого отношения, заключается в том, что у некоторых ОМЭВМ совмещены регистр чтения состояния линий порта и регистр записи значения порта, в результате чего, если часть линий порта запрограммирована на вывод, а другая находится в третьем состоянии, то при выполнении последовательности операции "чтение из порта" - "модификация отдельных линий порта" - "запись в порт" - "активизация линий, находившихся в третьем состоянии" может произойти изменение ранее предустановленных состояний отдельных линий, находящихся в момент чтения в третьем состоянии. Это может нарушить (и скорее всего нарушит) работу программы обмена (потеряются нули, обеспечивающие имитацию выходов с ОК). Поэтому лучше производить принудительную установку в ноль битов перед каждой операцией обмена. Для IBM-совместимых ПЭВМ для реализации шины >I2C на базе LPT-порта рекомендуется использовать не регистр данных DR, а регистр управления CR, выходы которого построены по схеме открытого коллектора. Но и в этом случае следует проявлять осторожность, поскольку регистр управления LPT-порта имеет открытый коллектор только в режиме "Normal", а в режимах EPP и ECP этот регистр может оказаться с симметричным выходом. Другая важная сторона вопроса - необходимость тщательного соблюдения параметров временной диаграммы процесса обмена. Несмотря на то, что шина I2C асинхронная и позволяет "Slave"-абоненту затягивать передачу бита (байта) на сколь угодно длительное время, требования к минимальным значениям длительностей импульсов очень жесткие. Ситуация усугубляется тем, что положительные перепады состояния линии имеют склонность затягиваться, так как несимметричные управляющие выходы не могут создать крутые положительные фронты. При написании программ очень важно контролировать время между операциями на шине, реализуемыми различными подпрограммами, например выдача "Start" и "Stop"-условия, передача бита, передача байта. При состыковке этих подпрограмм не должны быть нарушены минимальные значения времени, что очень легко происходит при использовании высокоскоростных процессоров. Кроме того, необходимо следить, чтобы время между изменением на линии SDA и стробированием положительным импульсом на линии SCL было не меньше половины минимальной длительности полупериода SCL (4.7 мкс/2=2.4 мкс.) Еще одна распространенная ошибка - игнорирование требования слежения за захватом линии SCL "Slave"-абонентом. Грамотно реализованные прграммы операций "Master"-абонента должны контролировать возврат линии SCL после того, как переводят ее в единичное состояние, и только дождавшись реальной установки линии SCL в единичное состояние продолжать операции приемо-передачи. Теперь мы опишем минимально необходимый набор операций для реализации "Master"-абонента. Прежде всего, это подпрограммы выдачи "Start"- и "Stop"-условия, подпрограмма передачи байта, подпрограмма приема байта, выдающая сигнал АСК и подпрограмма приема байта, не выдающая сигнал АСК. Три последние используют подпрограммы передачи бита и приема бита. Во временных промежутках между подпрограммами линия SCL имеет нулевое значение. Как уже говорилось ранее, важно правильно согласовывать все временные характеристики подпрограмм. Если, к примеру, вы вызываете повторный "Start" сразу за передачей (приемом) байта, то необходимо, чтобы полностью завершился нулевой полупериод (>4.7 мкс), предшествующий "Start"-условию, а подпрограмма, реализующая "Start"-условие, переведя линии SDA и SCL в единичное состояние, дождавшись их реального возврата, должна удерживать ее в таком состоянии не менее установленного времени (>4.7 мкс), и так во всех случаях. Оперируя этими пятью подпрограммами можно легко наладить обмен по шине I2C. Можно выдать на шину "Start"-условие, за ним "Slave Adress", далее данные, в соответствии с протоколом адресуемого устройства. Можно выдать повторное "Start"-условие, новый "Slave Adress" и так далее, формируя процесс обмена как из элементов конструктора. | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| На главную | info@atlastelecom.ru |