Команды ПЗУ

Реализованы все команды ПЗУ для стандартной скорости связи.

Самой простой командой ПЗУ является команда «Пропуск ПЗУ». Ее инициирует функция SendByte с указанием в качестве аргумента командного байта SKIP ROM.

Блок-схемы команд Чтение ПЗУ (READ ROM) и Совпадение ПЗУ (MATCH ROM) показаны на рисунке 15.


Рисунок 15 – Блок-схема команды Чтение ПЗУ

Блок-схема команды Поиск ПЗУ (SEARCH ROM) показана на рисунке 16. При каждом вызове данная функция ищет одно подчиненное устройство и так до тех пор, пока не будут найдены все устройства на шине. Подтверждением последнего запуска этой функции служит возвращаемое значение OWI_ROM_SEARCH_FINISHED. Кроме этого, параметр ‘pin’ указывает на какой шине необходимо вести поиск и еще два параметра должны быть указаны в интерфейсе функции: ‘lastDeviation’ и ‘bitPattern’. Эти параметры управляют поиском подчиненного устройства. В таблице 4 приведена информация по тому, как использовать данные параметры для завершения полного поиска всех подчиненных устройств.

Таблица 4 – Использование аргументов bitPattern и lastDeviation

  BitPattern lastDeviation
Первый раз Обнуление 8-байтного массива  
Последующие разы Копирование 8-байтного массива возвращается через указатель bitPattern при последнем запуске. Значение, возвращаемое SearchRom при последнем запуске.

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


Рисунок 16 – Команда поиск ПЗУ

Замечания относительно параметров временной диаграммы

Важно, чтобы временные характеристики генерируемых сигналов соблюдались как можно более точно. Для этого необходима точная генерация временных задержек. Количество тактовых импульсов, необходимое для задержки в некоторое количество микросекунд вычисляется во время компиляции. Во время генерации импульсов некоторые такты теряются, когда происходит установка низкого уровня или освобождение шины. Данные такты вычитаются из общего количества тактов, необходимых для генерации задержки. При чрезмерно низкой тактовой частоте может генерироваться некорректная задержка. Для генерации коротких задержек тактовая частота должна быть не менее 2,17 МГц.

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

При использовании данного драйвера внешняя схемотехника должна быть такой же, как и при использовании драйвера УАПП с опросом флагов состояния.

Дополнительной функцией данного подхода является автоматическая передача и прием больших пакетов данных по шине, что выполняется с помощью двух процедур обслуживания прерываний (ISR). Набор вспомогательных функций может вызываться для установки всех необходимых параметров, а вызов ISR завершит трансакцию автоматически. С помощью данных функций имеется возможность без всякого вмешательства отработать последовательность «Сброс/присутствие» или передать от 1 до 255 бит данных в одном направлении.

Для максимального упрощения ISR они не должны различаться для приема и передачи. При каждом запуске функции UDRE ISR отправляется один бит из буфера данных. RXC ISR принимает тот же бит и помещает его назад в буфер данных независимо от того, в каком направлении данные были отправлены. В процессе передачи отправленные данные будут идентичны принятым данным и буфер данных остается неизменным. В процессе приема передаваться должны только ‘1’, т.к. сигнал ‘Запись лог.1’ эквивалентен сигналу чтение. Для нахождения значения, записанного подчиненным, осуществляется выборка сигнала. После этого, значение размещается в буфере данных.

Три глобальных флага индицируют состояние драйвера 1-Wire: занят, присутствие и ошибка. Флаг «занят» устанавливается, если имеются данные для передачи. Флаг «присутствие» устанавливается, если во время отправки сигнала «Сброс» обнаруживается сигнал «Присутствие». Данный флаг остается установленным до следующего сигнала «Сброс», на который не будет отклика сигналом «Подтверждение». Флаг «Ошибка» устанавливается, когда приемник УАПП определяет ошибку кадра. В этой ситуации необходимо передать новый сигнал «Сброс». Этим осуществляется сброс всех подчиненных устройств на шине, а также внутреннего состояния процедур UDRE и RXC ISR.

Все процедуры ISR должны выполняться как можно более быстро. Более сложные функции, например, команды ПЗУ, не реализуются данными ISR. Вложенные примеры кодов программы показывают, как данное поведение реализуется в виде цифрового автомата.

Процедуры обработки прерываний

Блок-схемы процедур ISR показаны на рисунках 17 и 18. Процедура UDRE ISR обрабатывает прерывание по освобождению регистра данных УАПП и выполняется всякий раз, когда освобождается место для данных в передающем буфере УАПП. Процедура RXC ISR отвечает за обработку прерывания по завершению приема УАПП и выполняется всякий раз, когда завершен прием и данные размешаются в приемном буфере УАПП.


Рисунок 17 – Процедура обслуживания прерывания UDRE


Рисунок 18 – Процедура обслуживания прерывания RXC

Вспомогательные функции

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

Блок-схемы вспомогательных функций приведены на рисунке 19.

Обратите внимание, что функция ReceiveData (прием данных) заполняет буфер данных логическими 1 и вызывает функцию TransmitData (передача данных). Функция RXC ISR осуществляет выборку сигнала и размещает считанное значение из подчиненного устройства в буфере данных.


Рисунок 19 – Вспомогательные функции

Вычисление CRC-кода

Описанный ниже алгоритм используется для вычисления двух разных CRC-кодов.

Результатом вычисления CRC может быть значение 0 или “seed”. Последовательность вычислений следующая:

  1. Нахождение логического исключающего ИЛИ между младшим битом CRC и младшим битом данных.
  2. Если результат равен 0, то:
    a. Сдвиг вправо CRC.
  3. Если результат равен 1:
    a. Поиск нового значения CRC путем вычисления логического исключающего ИЛИ между CRC и полиномом CRC.
    b. Сдвиг вправо CRC.
    c. Установка старшего бита CRC к 1.
  4. Сдвиг вправо данных.
  5. Повтор данной последовательности 8 раз.

Данный алгоритм может использоваться для вычисления, как CRC8, так и CRC16. Отличие состоит только в разрядности сдвигового регистра (8 разрядов для CRC8, 16 разрядов для CRC16) и значении полинома. Данное значение моделируется схемой из логических элементов исключающее ИЛИ. Значение полинома равно 18h для CRC8 и 4002h для CRC16.

Алгоритмы реализованы для поиска значения CRC для одного байта при однократном выполнении, но CRC “seed” размещается в качестве аргумента в процедуры CRC. Таким образом, результат одной операции CRC может быть указан в следующий раз вместе со следующим байтом и в результате вычисляется CRC от произвольного количества байт.

Проверка CRC для 64-разрядного идентификатора реализуется OWI_CheckRomCRC. Она вычисляет значение CRC8 первых 56 бит, а затем сравнивает его с последними 8 битами идентификатора.


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



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