Pull to refresh

Примитивы для реализации 1-Wire master при помощи PWM и ICP для STM8L и STM32

Reading time 4 min
Views 12K
В предыдущей статье был представлен вариант реализации примитивов для асинхронной работы с шиной 1-wire для микроконтроллеров Atmel. Ну а сейчас вашему вниманию предлагается реализацию того же самого, но на более мощных микроконтроллерах семейства STM8L (для отладки использовалась обычная оценочная плата STM8L-Discovery с извлеченным LCD-дисплеем). С минимальными изменениями описываемая реализация может быть адаптирована и для семейства STM32.



В качестве toolchain использовался IAR Embedded Workbench для STM8 с бесплатной лицензией (ограничение размера кода 8Кб).

В качестве аппаратного драйвера шины 1-Wire взята схема из предыдущей статьи. Подключение следующее:

  • контакт PB1 оценочной платы подключаем к OCRA драйвера
  • контакт PD0 оценочной платы подключаем к ICP драйвера
  • контакт PA5 оценочной платы подключаем к PULLUP драйвера

Не забываем подключить GND, питание +5V и питание +3V3.

В отличии от AVR микроконтроллеры семейства STM8 (и STM32) предлагают более широкий набор внутренней периферии. Таким образом описываемый проект можно скомпилировать в нескольких вариантах:

  1. IRQ-only. Логика работы реализована только по прерываниям, без использования DMA. Этот вариант компилируется когда символ __DRV_ONEWIRE_DMA не определен.

    Плюсы реализации:

    • Требуется всего 3 байта RAM
    • Возможность запрограммировать таймер на любое требуемое разрешение

    Минусы реализации:

    • Большое количество прерываний (по 3 прерывания на каждый передаваемый бит)

  2. DMA с 8-ми битной передачей. Программирование таймера и сохранение результатов во время приема и передачи битов производится при помощи DMA. Этот вариант компилируется когда символ __DRV_ONEWIRE_DMA=1.

    Плюсы реализации:

    • Требуется 9 байт RAM
    • Небольшое количество прерываний (одно прерывание на 1-й передаваемый бит и 3 прерывания в случае успешного завершения обмена)

    Минусы реализации:

    • Невозможность запрограммировать таймер на большое разрешение

  3. DMA с 16-ти битной передачей. Программирование таймера и сохранение результатов во время приема и передачи битов производится при помощи DMA.Этот вариант компилируется когда символ __DRV_ONEWIRE_DMA=2.

    Плюсы реализации:

    • Небольшое количество прерываний (одно прерывание на 1-й передаваемый бит и 3 прерывания в случае успешного завершения обмена)
    • Возможность запрограммировать таймер на любое требуемое разрешение

    Минусы реализации:

    • Требуется 17 байт RAM

Кроме того, благодаря наличию у таймеров входа запрета PWM (BREAK-сигнал), появилась возможность аппаратно реализовать защиту от попытки выполнить обмен данными в момент включенного active-pullup (т.е. чтобы случайно не замыкали 1-wire на землю в момент, когда на нее подается питание для выполнения преобразований).

Общие особенности реализации

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

Регистры управления PWM (TIMx_CCR1) и Capture (TIMx_CCR2) программируются в режим использования shadow-регистров. Это означает, что после программного изменения регистра PWM ((TIMx_CCR1) его значение начнет использоваться только после возникновения сигнала UEV внутри микроконтроллера. А этот сигнал формируется либо автоматически при достижении счетчиком заданной вершины (период), либо программно путем установки бита UG в регистре TIMx_EGR).

Непосредственно до запуска PWM вычисляется и загружается в регистр PWM (TIMx_CCR1) требуемая длительность импульса самого младшего передаваемого бита. После этого таймер запускается установкой бита CEN в регистре TIMx_CR1. В этот момент сигнал PWM еще не активен, т.к. бит MOE в регистре TIMn_BKR заранее был сброшен в 0. После этого программно устанавливается бит UG в TIMx_EGR, что вызывает активацию внутреннего сигнала UEV, сброс текущего значения счетчика в 0 и загрузку содержимого регистра PWM (TIMx_CCR1) в его shadow-копию, используемую для сравнения.

Кроме того, так как в регистре TIMn_BKR заранее был установлен бит AOE, по сигналу UEV может автоматически установится бит MOE в регистре TIMn_BKR, что разрешит выход PWM. Однако это произойдет только при не активном сигнале BREAK, который формируется от управления внешним active-pullup (это возможно потому, что сигнал BREAK внутри микроконтроллера формируется непосредственно по значению сигнала на внешнем пине независимо от того, в запрограммирован ли он на режим входа или выхода). Таким образом, если при выполнении процедуры RESET либо попытки передать/принять бит(ы) будет активен сигнал active-pullup, то включение выхода PWM будет блокировано.

Принцип работы IRQ-only реализации совпадает с описанным в предыдущей статье с тем отличием, что вместо режима работы таймера «вверх-вниз» используется режим подсчета «вверх до заданного значения». Это стало возможным потому, что разрядов 16-ти битного таймера вполне хватает как для формирования периода таймслота передачи одного бита, так и для реализации процедуры «формирование сигнала RESET с ожиданием PRESENCE».

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

Реализация с использованием DMA с 8-ми и 16-ти битной передачей в принципе одинаковая и различается только разрядностю значений для PWM и ICP. Все длительности импульсов вычисляются заранее до запуска таймера. Длительность импульса самого младшего бита загружается в регистр PWM (TIMx_CCR1) как описано выше, а для загрузки остальных значений при необходимости программируется 1-й канал DMA. Все результаты измерений всегда сохраняются при помощи 2-го канала DMA.

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

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

Список литературы:

  1. Код проекта на github
  2. Примитивы для реализации 1-Wire master при помощи PWM и ICP на микроконтроллерах AVR AtMega
  3. Драйвер шины 1-Wire для контроллеров питанием меньше 5V
  4. Высокоуровневые функции для работы с 1-Wire
Tags:
Hubs:
+6
Comments 7
Comments Comments 7

Articles