Реализация. Далее рассматриваются три различных способа реализации протокола 1-Wire: полностью программная (по опросу)

Далее рассматриваются три различных способа реализации протокола 1-Wire: полностью программная (по опросу), на основе УАПП с опросом флагов состояния и на основе УАПП с управлением по прерываниям. Короткое описание каждого дается ниже. Подробное описание по использованию каждого драйвера не входит в данный документ. Если необходимо более подробная информация по работе каждого драйвера, то необходимо ознакомится с исходным кодом интересующего драйвера, который входит в состав данных «Рекомендаций»

Рассмотрим программный подход к реализации протокола 1-Wire без задействования специальных аппаратных блоков микроконтроллера. Преимуществом данного подхода является то, что из аппаратных затрат потребуется только одна линия ввода-вывода общего назначения (GPIO). Поскольку все линии ввода-вывода у AVR-микроконтроллеров двунаправленные и содержат опциональные подтягивающие резисторы, то AVR-микроконтроллер может управлять шиной 1-Wire без какой-либо внешней схемы. В случае, если номинал внутреннего подтягивающего резистора не соответствует текущей конфигурации подчиненных устройств, то понадобиться только один внешний резистор. Недостатком данного подхода является возникновение задержек в процессе генерации “Сброс/Присутствие” и передачи бит. Чтобы гарантировать корректность временных интервалов на шине 1-Wire, прерывания должны быть отключены на время передачи бит. Длительность интервала между передачами двух бит никак не ограничивается. Таким образом, после передачи каждого бита можно смело активизировать прерывания. В этом случае генерация прерывания может возникать с задержкой, но ее наихудшее значение не превысит длительности генерации сигнала “Сброс/Присутствие” (менее 1 мс).

Драйвер УАПП с управлением по опросу использует модуль УАПП, который входит в состав многих микроконтроллеров AVR. Он используется для генерации сигнала необходимой формы на битном уровне. Остальная часть драйвера эквивалентна программному. Основными преимуществами данного драйвера по сравнению с программным – компактность программного кода и отсутствие необходимости манипулировать прерываниями во время передачи сигналов, т.к. УАПП выполняет это автономно. Недостатки: требует двух линий ввода-вывода и несложную внешнюю схему.

Драйвер УАПП с управлением по прерываниям использует УАПП для генерации сигналов необходимой формы тем же способом, что и драйвер УАПП с управлением по опросу. Дополнительным преимуществом данного подхода является возможность автоматического приема-передачи до 255 бит данных.

Драйверы с опросом состояния

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

Программная реализация

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

Количество подключаемых шин ограничивается восемью, а перенос шины в пределах порта может конфигурироваться. Выводы, которые не задействованы шинами 1-Wire, остаются незатронутыми. Поскольку все шины 1-Wire подключены к одному и тому же порту, то несколько операций может быть выполнено на одной или более шинах одновременно. Это стало возможным благодаря аргументу pin или pins, которые входит в интерфейс каждой функции. Данный аргумент должен содержать маску для выводов, которые задействованы для работы. Например, имеется возможность отправить сигнал СБРОС восьми шинам одновременно, указав в качестве аргумента 0xff. Значение, возвращаемое этой функцией будет битовой маской всех шин, где один или более подчиненных устройств сгенерировали сигнал «присутствие». Данная битовая маска может подставляться в качестве аргумента pins в функцию, которая вводит команду «Пропуск ПЗУ». Все функции в этой реализации поддерживают возможность выбора вывода (pin). Следует руководствоваться общим правилом: все команды записи могут адресовать несколько шин одновременно. Команды чтения могут адресоваться только к одной шине.

Инициализация

Процедура инициализации интерфейса 1-Wire предельно проста. Она заключается в установке выводов 1-Wire на ввод и, при необходимости, активизации встроенного подтягивающего резистора для перевода шины в неактивное состояние. Некоторые микросхемы отреагируют на этот нарастающий фронт на шине, как на окончание сигнала «Сброс» и ответят сигналом «Присутствие». Для гарантирования, что этот сигнал не вызовет какого-либо сеанса связи, предусмотрена длительная выдержка времени.

Функции битового уровня

Функции битового уровня реализованы в соответствии с рекомендациями по применению AN126 компании Dallas Semiconductors. Все параметры временной диаграммы выдержаны в соответствии с рекомендованными значениями в этом документе. Значения приведены в таблице 3.

Таблица 3 – Значения используемых задержек времени

Параметр Рекомендованная задержка, мс
A  
B  
C  
D  
E  
F  
G  
H  
I  
J  

Обратите внимание, что в стандартном режиме задержка G равна 0.

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

Функции уровня передачи бит реализованы так, как показано на рисунке 13. Обратите внимание, что функция “Определение присутствия” отправляет сигнал «Сброс» и считывает “Сигнал присутствие”. Также следует учесть, что все функции уровня передачи бит могут адресоваться к нескольким шинам одновременно.


Рисунок 13 – Функции слоя передачи бит

Для установки низкого уровня на шине и ее освобождения реализовано два макроса. Реализация этих функций в виде макроса обосновано высокой частотой их использования и тем, что использование команд вызова (call) может ухудшить временные характеристики.

Реализация на УАПП с опросом

При использовании данного подхода за параметры всех временных диаграмм отвечает модуль УАПП. Для отправки бита устанавливается соответствующая скорость связи УАПП, а затем в регистр данных записывается значение, которое вызовет генерацию сигнала желаемой формы (см. «Генерация сигналов с помощью УАПП”).

Инициализация

Для инициализации интерфейса 1-Wire при использовании рассматриваемого драйвера, первоначально необходимо инициализировать модуль УАПП с корректными параметрами: разрешить передачу и прием, установить формат данных 8 бит, отключить паритет, установить генерацию одного стоп-бита и задать скорость связи до 115,2 кбод.

Установка данных параметров приведет к переходу вывода TXD в неактивное состояние УАПП, которое равно лог. 1. Подчиненные устройства воспримут, возникающий при этом, нарастающий фронт, как сигнал «Сброс» и ответят на него сигналом «Присутствие».

Функции битового уровня

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

Интерфейс с данными функциями такой же, как и у драйвера с программной реализацией. Однако, аргумент ‘pins’ в данном случае опускается. Набор макросов делает возможным вызвать данные функции с или без аргумента pins. Если же аргумент pins будет указан, то макрос его исключит.

Функции высокого уровня

Обратите внимание, что многие функции в этом слое получают аргумент с типом «unsigned char pointer» (символьный указатель без знака). Данный указатель адресует массив из 8 байт памяти, который может использоваться функцией. Расположение, а также редкая инициализация, этих массивов должна выполняться пользователем. В данном документе полагается, что перед вызовом функции была выполнена инициализация памяти каким-либо методом.

Функции передачи байта


Рисунок 14 – Функции передачи байта


Понравилась статья? Добавь ее в закладку (CTRL+D) и не забудь поделиться с друзьями:  



double arrow
Сейчас читают про: