Реализация High-speed USB на ядре Cortex-M3


PDF версия

Статья посвящена вопросу реализации высокоскоростного интерфейса USB на микроконтроллерах с относительно низкой тактовой частотой. Рассмотрен принцип организации прямого доступа к памяти и много­уровневых шин для обмена данными. Данная статья является сокращенным переводом работы [1].

В компьютерной технике стандарт USB уже полностью вытеснил интерфейсы UART, PS2 и IEEE-1284. Теперь он находит все более широкое применение во встраиваемых системах.
Секрет популярности USB заключается в его универсальности и полной совместимости USB-устройств различных производителей без дополнительных драйверов. К одной шине USB можно подключать несколько устройств, и они не будут влиять на работу друг друга. Стандарт USB удобен еще и тем, что позволяет обмениваться информацией не только между устройствами, но и между печатными платами внутри одного устройства.
Именно поэтому многие производители 32-разрядных микроконтроллеров (МК) и микропроцессоров (МП) включают в набор стандартной периферии интерфейс USB, обычно версии Full-Speed, обеспечивающей обмен данными со скоростью до 12 Мбит/с.
Однако в современных системах объем информации зачастую достигает несколько Гбайт, которые должны быть переданы за секунды. Для работы на таких скоростях был разработан стандарт High-Speed USB, осуществляющий обмен со скоростью до 480 Мбит/с.
Несомненно, стандарт USB High-Speed, следуя потребностям рынка, вскоре перейдет во встраиваемые приложения. С другой стороны, тактовые частоты многих МК не достаточно высоки, чтобы обеспечить обмен на скорости 480 Мбит/с. Например, ядро Cortex-M3 работает на частотах менее 100 МГц.
Принцип решения данной проблемы основан на том, что архитектура быстродействующих МК, например ARM-9, адаптируется под медленное ядро Cortex-M3, а область памяти разделяется на несколько блоков, чтобы критичные ко времени задачи выполнялись одновременно с пересылкой данных. Следует обратить внимание, что передача информации обязательно должна производиться через прямой доступ к памяти (DMA — direct memory access), чтобы не загружать ЦП. Для наглядности в таблице 1 приведено сравнение быстродействия системы с использованием ПДП и без него.

Таблица 1. Чтение с флэш-памяти. Микроконтроллер SAM7X, тактовая частота 55 МГц, режим Thumb

Скорость передачи, Кбит/с

Свободные ресурсы ЦП

Без использования ПДП, %

С использованием ПДП, %

0

100

100

115,2

96

99

500

86

99

1000

72

99

1500

58

99

2000

45

99

4000

0

98

6000

Недостижимо

97

8000

Недостижимо

97

10000

Недостижимо

96

Организация ПДП

При реализации ПДП используются три типа контроллеров:
– периферийный контроллер ПДП (peripheral DMA controller — PDC), соединяющий напрямую низкоскоростные периферийные устройства с блоками памяти в наиболее простых случаях;
– специализированный контроллер, оптимизированный для работы с периферией, обеспечивающий максимальную полосу пропускания;
– центральный контроллер ПДП, оптимизированный для пересылки данных между блоками памяти или блоками памяти и высокоскоростными периферийными устройствами.
Оптимальная по соотношению цена/качество реализация ПДП обеспечивается при сочетании этих трех видов контроллеров. В случае необходимости можно воспользоваться более экономичным вариантом, когда обмен осуществляется только с помощью одного контроллера ПДП, однако при этом характеристики системы несколько ухудшаются.
Интерфейс работы с периферийным контроллером ПДП встроен в память каждого периферийного устройства. Он содержит 32-разрядный регистр-указатель памяти, 16-разрядный регистр-счетчик передач, 32-разрядный регистр-указатель памяти, содержащий значение следующей ячейки, и 16-разрядный регистр для следующего счетчика передач.
Рассмотрим процедуру приема информации.
Получив внешний символ, периферийное устройство посылает контроллеру сигнал готовности Receive Ready. По этой команде контроллер запрашивает доступ к системной шине. Получив его, он считывает содержимое регистра Receive Holding Register (RHR) и переписывает его в память.
После каждой такой процедуры указатель памяти инкрементируется, а количество оставшихся передач уменьшается на единицу.
Когда блок памяти заполняется, автоматически начинает формироваться следующий, либо контроллеру посылается сигнал прекращения передачи.
Передача данных от периферийного устройства производится аналогичным образом, но все операции следуют в обратном порядке.
После отправки каждого программного блока генерируется прерывание, и начинается передача следующего блока. Одновременно в ARM-процессоре может производиться обработка последнего переданного блока, что позволит избежать дополнительных процедур обновления указателей памяти и ускорит обмен.
Если однотипные периферийные устройства (приемник или передатчик) одновременно запрашивают линию, то их приоритетность определяется в соответствии с порядковыми номерами. Если запросы приходят не одновременно, то они обрабатываются по очереди. По умолчанию запросы приемников имеют более высокий приоритет, чем от передатчиков.
При обмене со скоростью более 10 Мбит/с время доступа к внутренней шине становится критичным и двухуровневых буферов приема и передачи уже недостаточно. Требуется центральный контроллер ПДП с более глубоким буфером и возможностью пакетной передачи данных.
Центральный контроллер ПДП имеет встроенный буфер FIFO для повышения устойчивости к задержкам на шине, функцию пакетной передачи с конфигурируемой длиной посылки, возможность распределения и сбора данных, а также обеспечивает работу со списком указателей. Он программируется для передачи либо между блоками памяти, либо между памятью и периферийным устройством.
Каждому специализированному контроллеру ПДП отводится свой уровень на шине, чтобы не возникало задержек получения доступа. Память для хранения микрокадров также разделяется так, чтобы на каждый контроллер приходилось по крайней мере по три банка.
Описанная реализация High-Speed USB на ядре Cortex-M3 с тактовой частотой 96 МГц, 5-уровневой шиной и двумя основными блоками SRAM схематично изображена на рисунке 1. Она обеспечивает скорость обмена 480 Мбит/с.

Рис. 1. Реализация High-Speed USB на МК Cortex-M3
Организация памяти

Процессор Cortex-M3 имеет три шины памяти: шина инструкций (I), шина данных (D) и системная шина (S). По всем шинам доступ к памяти осуществляется в один такт. Исключение составляет выборка команд на шине S.
Для увеличения скорости выборки команд и уменьшения времени доступа следует либо разрешить доступ к SRAM в один такт на шине I, либо увеличить разрядность флэш-памяти, чтобы несколько инструкций считывалось одновременно.
Для работы на тактовой частоте 96 МГц можно использовать только достаточно быстродействующую память SRAM. Однако если для оптимизации быстродействия используется несколько встроенных в кристалл SRАM, то резко увеличивается стоимость системы и ее потребление в режиме ожидания. В то же время более дешевая энергонезависимая флэш-память не способна работать на частоте процессора Cortex-M3.
Типичное время доступа к флэш-памяти составляет 35…50 нс, а такт Cortex-M3 длится всего 13 нс. Для компенсации этой разницы размер флэш-памяти увеличивают до 64 или 128 бит, что соответствует 4 или 8 инструкциям, и за один такт считывается несколько инструкций. Они запоминаются в регистре и затем поочередно, без задержек, выполняются на тактовой частоте 96 МГц.
В качестве сверхоперативной памяти для хранения данных также должны быть использованы модули SRAM. Для увеличения производительности память SRAM разделяют на несколько блоков, чтобы периферийные устройства и процессор могли одновременно пересылать данные по параллельным шинам. Эти блоки могут быть сконфигурированы программно на работу в качестве основной памяти.
Блоки памяти данных, подсоединенные к шине D, не доступны другим внешним устройствам или контроллерам ПДП.
Внутри микроконтроллера Cor­tex-M3 с высокоскоростным интерфейсом USB в общем случае будут использоваться другие протоколы связи и хранения данных. Соответственно, для ускорения обмена данными и процесса преобразования протоколов обработку информации и управление системой необходимо осуществлять параллельно, используя общие блоки SRAM.
Контролеры ПДП и шина S процессора могут быть подключены к встроенной в кристалл многоуровневой шине (multi-layer bus matrix) в качестве контроллеров шины, чтобы они всегда имели прямой доступ к блокам памяти.
В таблице 2 приводится сравнение характеристик ARM7 и Cortex-M3. При выборе МК необходимо учитывать скорость обмена с внешними модулями памяти. Из таблицы видно, что ядро ARM7 обеспечивает передачу данных по внешней шине со скоростью 0,54…0,67 DMIPS/МГц, а Cortex-М3 — только 0,117 DMIPS/МГц.

Таблица 2. Максимальное быстродействие. Тест Dhrystone 2.1, компилятор RVCT, оптимизация по быстродействию, нулевой период ожидания

 

Контроллер

SAM7SE

STM32F106

ЦП

ARM7TDMI

Cortex-M3

Внутренняя память

0,95 DMIPS/МГц (ARM32) 0,78 DMIPS/МГц (Thumb16)

1,22 DMIPS/МГц (Thumb2)

Внешняя память

0,54 DMIPS/МГц (ARM32) 0,67 DMIPS/МГц (Thumb16)

0,117 DMIPS/МГц (Thumb2)

Многоуровневая шина

Другая проблема при больших объемах вычислениях — пропускная способность шины. Когда несколько контроллеров ПДП и процессор пересылают большой объем данных по шине, она может начать работать с перегрузкой и работа системы замедлится. 32-разрядная шина, тактируемая на частоте 48 МГц, имеет максимальную скорость передачи данных 1,5 Гбит/с. При большом объеме передаваемых данных, такая пропускная способность шины бывает недостаточной.
Проблема разрешается путем использования нескольких параллельных шин на кристалле. Такая конфигурация иногда называется шиной с многоуровневой матрицей. В многоуровневых высокопроизводительных шинах (AHB — Advanced High-perfomance Bus) процессор и все контроллеры ПДП имеют собственный уровень в шине (см. рис. 2).

Рис. 2. Подключение внешних устройств через многоуровневую шину

В отличие от ядра ARM7, которое поддерживает только одноуровневую развитую системную шину (ASB — Advanced System Bus), Cortex-M3 имеет встроенную поддержку многоуровневых шин. Соответственно, оно больше подходит для МК с High-speed USB.
Когда несколько внешних устройств использует один и тот же канал прямого доступа или когда блоки памяти объединены, используется арбитраж.
Многоуровневые шины имеют ряд достоинств по отношению к одноуровневым. Во-первых, они изначально разработаны для параллельной передачи данных. Количество параллельных уровней может регулироваться в соответствии с нагрузкой системы.
Во-вторых, они разделяют каналы передачи так, чтобы контроллеры ПДП не мешали процессору управлять системой. Если при этом оперативная память будет разделена на независимые блоки, то возникновение конфликтов полностью предотвратится.

Заключение

Мы рассмотрели реализацию USB 2.0 High-Speed на ядре Cortex-M3. Заметим, что скорость обмена по этому интерфейсу является одной из самых высоких. Принимая во внимание распространенность USB, можно сделать вывод, что он станет стандартом для встраиваемых приложений как в современных системах, так и в электронике завтрашнего дня.

Литература
1. Jacko Wilbrink. Beefing up the Cortex-M3-based MCU to Handle 480 Mbps High-speed USB.

Оставьте отзыв

Ваш емейл адрес не будет опубликован. Обязательные поля отмечены *