Главная > STM8 > Программный USB на микроконтроллерах STM8

Программный USB на микроконтроллерах STM8

В один прекрасный момент в меня засела мысль “а можно ли реализовать программный USB на микроконтроллерах STM8, по аналогии с V-USB для AVR микроконтроллеров”.

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

На сколько мне известно первым реализовал данный протокол на АВР-ах Инженер Игорь Чешко (Igor Cesko)), в последствии Atmel опубликовала документ AVR309: Software Universal Serial Bus (USB) (читать перевод на русский).

Игорем был реализован прием данных в кодированном виде с последующим анализом, а в V-USB уже декодирование NRZI и выборка незначащих бит происходит “на лету”.

(Если я где-то ошибся прошу сильно не пинать, я не очень сильно углубился в данную тему).

К сожалению прямой перенос кода с AVR на ATM8 не возможен ввиду отличий архитектуры и набора команд.

Основные проблемы STM8 с которыми я столкнулся:

  • малое число регистров (основная часть операций доступна только для регистра А)
  • трехуровневый конвейер
  • неопределенное время вхождения в обработчик прерывания (9 циклов на сохранения контекста и от 1 до 6 на завершение команд)

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

Время выполнения зависит от состояния конвейера на начало выполнения кода и расположения команд в памяти.


Микроконтроллер

В качестве подопытного я выбрал микроконтроллер STM8S103F3 (нацелился использовать STM8S003 Улыбка).

Хотя можно использовать любой из серии STM8L, STM8S.

Тактирование от “внешнего кварца” на 12 МГц, частота делится кратно с тактовой USB (8 тактов на один бит).

Линии USB подключены напрямую к PC7 и PC6.


Передача данных

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

Для формирования дифференциальных сигналов я задействовал две линии порта С, но занят весь порт целиком, т.е. другие его линии нельзя использовать во время приема и передачи данных.

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

Алгоритм формирования сигналов:

2014-02-21-Блок-схема-алгоритма-передачи

Давно не рисовал алгоритмы, возможно некоторые элементы неправильно нарисовал.

Кратно по алгоритму:

  1. Регистр А используется только для отсчета переданных подряд единиц
  2. Выходной сигнал формируется только путем инверсии выходных состояний сразу всех линий порта С
  3. После передачи всех данных, длительность формирования сигнала конец пакета складывается из времени выхода из подпрограммы передачи и выполнения дополнительных операций, возможно лучше переключать линии на выход и формировать длительность сигнала “конец пакета” с последующим переводом линий на вход в данной подпрограмме.

В коде передатчика очень много пустых команд “nop”, часть из них используется для выравнивания кода во флеш-памяти, остальная для формирования задержек (уж очень быстро работает микроконтроллер Улыбка) суммарно почти 50% от общего числа команд.

После написания кода приемника появилось больше знаний и практики в ассемблере STM8 и некоторые моменты можно было сделать проще и красивее, но на данном этапе не вижу смысла что-то править.

Для постоянства формирования интервалов код должен быть расположен в фиксированном месте флеш-памяти, я думаю можно перемещать, но только с выравниванием по словам (сам не пробовал).

На текущий момент код передатчика занимает порядка 300 байт.

На сегодня все, дальше будет самое интересное — код приемника.


Categories: STM8 Tags: , ,

Версия для печати Версия для печати
  1. 21 Февраль 2014 в 12:35 | #1

    Хех, я пытлася сделать тоже-самое несколько лет назал, и не влез по тактам приемника.

  2. ZiB
    21 Февраль 2014 в 12:56 | #2

    @bsvi
    К сожалению я пока реализовал только декодирование на лету, а вырезку незначащих нет.
    Чуть-чуть не хватает времени :(

  3. Bilzebub
    21 Февраль 2014 в 13:48 | #3

    А в чем на сегодняшний день актуальность такой штуки? у STM появились контроллеры STM32F0x2 (правда пока на стадии тестирования) и STM32L0x2 (анонсированы, скоро наверно появятся), они crystal-less, т.е. внешний кварц не нужен. Цена тоже неизвестна) но видимо будет не сильно высокая.

  4. ZiB
    21 Февраль 2014 в 13:54 | #4

    @Bilzebub
    Ждал, этого вопроса :)
    Абсолютно ни в чем, просто спортивный интерес.
    Для меня это хобби.

  5. Bilzebub
    21 Февраль 2014 в 13:59 | #5

    8-разрядные контроллеры, как мне кажется, скоро совсем канут в лету. Вчера приходил манагер, впаривал ATtiny13 за 40 центов. Утверждал что 32-разрядные дорогие, слишком большие и используются не на полную мощность. я ему показал stm32f030 за 55 центов в корпусе tssop20, и он предпочел дальше не спорить))

  6. ZiB
    21 Февраль 2014 в 14:01 | #6

    @Bilzebub
    Всё зависит от задачи и ваших предпочтений :)

  7. OneManArmy
  8. ZiB
    2 Март 2014 в 19:19 | #8

    @OneManArmy
    Big thanks for the review!

  9. OneManArmy
    2 Март 2014 в 19:29 | #9

    @ZiB
    =) Друг, я делюсь тем, на что сам наткнулся только что! Это не я! Просто подумал, что тебе приятно будет!

  10. ZiB
    2 Март 2014 в 19:40 | #10

    @OneManArmy
    Дык, это я им сам написал по совету Angel5 :)

  11. 3 Март 2014 в 00:06 | #11

    @Bilzebub , покажите и мне (в розницу, разумеется, а не в партии от 100 шт). А то я что-то не вижу.

    Чем обоснуете, кстати, применение тридцатидвухразрядного МК в задаче, где восьмиразрядного хватает (при условии того, что цена сравнима)?

  12. Артём
    23 Март 2014 в 21:04 | #12

    >>Чем обоснуете, кстати, применение тридцатидвухразрядного МК в задаче, где восьмиразрядного хватает
    Например тем, что у 32разрядного в запасе остаётся горазда больше неиспользованной производительности. В случае расширения функционала она может пригодится.

  13. vision
    21 Апрель 2014 в 16:49 | #13

    where is the schematic diagram
    of STM8s USB ? thanks!

  14. ZiB
    22 Апрель 2014 в 09:03 | #14

    @vision
    Good afternoon. Scheme is too simple to describe it.
    USB line connected directly to the microcontroller lines PC7 and PC6.
    See the source, it is really simple.

  1. Пока что нет уведомлений.

*