Пошаговая инструкция по пользованию флэшкой. Не работают USB-порты на компьютере – пути решения проблемы Принцип работы usb интерфейса

Почитав вот этот пост и сопутствующую ему дискуссию, я решил попробовать внести ясность в то, что такое USB Power Delivery и как это работает на самом деле. К сожалению у меня сложилось впечатление, что большинство участников дискуссии воспринимают 100 ватт по USB слишком буквально, и не до конца понимают что за этим стоит на уровне схематики и протоколов.

Итак, кратко – основные пункты:

  • USB PD определяет 5 стандартных профилей по электропитанию – до 5V@2А, до [email protected]А, до 12V@3А, до 12-20V@3А и до [email protected]А
  • Кабели и порты для Power Delivery сертифицируются и имеют дополнительные пины в разьеме
  • Тип кабеля и его соответствие профилю определяются автоматически через дополнительные пины и определение типа USB коннектора (микро, стандарт, A, B и т.д.)
  • Обычные USB кабели (не Power Delivery) сертифицируются только по первому профилю до 5V@2A
  • При подключении распределяются роли, между тем кто дает ток (Source / Источник ) и кто потребляет (Sink / Приемник )
  • Источник и Приемник обмениваются сообщениями по специальному протоколу, который работает параллельно традиционному USB
  • В качестве физического носителя протокол использует пару – VBus / GND. Именно поэтому Power Delivery не зависит от основного USB протокола и обратно совместим с USB 2.0 и 3.0
  • Используя сообщения, источник и приемник могут в любой момент времени меняться ролями, изменять силу тока и/или напряжение, уходить в спячку или просыпаться, и т.д.
  • По желанию устройства могут поддерживать управление PD через традиционные USB запросы, дескрипторы и т.д.
Под катом - детали.

О кобелях Про кабели

USB Power Delivery работает с шестью типами коннекторов:

Соответственно попарно допустимы следующие виды соединений

  1. USB 3.0 PD Standard-A <-> USB 3.0 PD Standard-B plug
  2. USB 3.0 PD Standard-A <-> USB 3.0 PD Micro-B plug
  3. USB 3.0 PD Micro-A <-> USB 3.0 PD Micro-B plug
  4. USB 3.0 PD Micro-A <-> USB 3.0 PD Standard-B plug
  5. USB 2.0 PD Standard-A <-> USB 2.0 PD Standard-B plug
  6. USB 2.0 PD Standard-A <-> USB 2.0 PD Micro-B plug
  7. USB 2.0 PD Micro-A <-> USB 2.0 PD Micro-B plug
  8. USB 2.0 PD Micro-A <-> USB 2.0 PD Standard-B plug
Отдельно стоит заметить что спецификация прямо запрещает извращения с несколькими коннекторами на одной из сторон соединительного кабеля, что достаточно логично, учитывая токи до 100 ватт. С другой стороны использование переходников и адаптеров не возбраняется при условии что они соответствуют профилю электропитания, и не закорачивают экран кабеля на его землю.

Про порты

После сертификации USB PD порты маркируются следующим образом:

Данное лого информирует о версии USB (2.0 или 3.0 SuperSpeed), а также о профилях электропитания которые поддерживает данный порт. Значение ”I” означает потребляемый профиль, необходимый для полноценного функционирования устройства, а значение «О» то какой профиль порт может предоставить. Примеры маркировки портов:

  • Первый порт поддерживает USB2. Он может давать питание по Профилю 1 (2A@5V) и использует Профиль 3 (5V@2A или 12V@3A) для полноценного функционирования. Например порт для планшета или нетбука.
  • Второй порт поддерживает USB2. Он может давать питание по Профилю 2 (2A@5V или [email protected]) и использует Профиль 4 (5V@2A или 12V@3A или 20V@3A) для полноценного функционирования. Например порт для ноутбука или лаптопа.
  • Третий порт поддерживает USB3. Он только дает питание по Профилю 1 (5V@2A). Сам он по VBus не запитывается. Например порт десктопа, монитора, телевизора, и т.д.
  • Четвертый порт поддерживает USB3. Как и в первом примере он может давать питание по Профилю 1 (5V@2A) и сам требует питание по Профилю 3 для полноценного функционирования (5V@2A или 12V@3A). Пример придумайте сами:)

Физический канал

USB PD определяет принципиальную схему физической организации соединения посредством кабеля следующим образом:

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

В качестве алгоритмов для определения разряженной батареи предлагаются следующее. Если одна из сторон выставляет сопротивление в 1кОм между экраном и землей, это свидетельствует о том что ее батарея разряжена. В такой ситуации другая сторона берет на себя роль источника и начинает отдавать минимальные 5В, чтобы дать через VBus питание противной стороне и начать обмен сообщениями по протоколу USB PD.

Как уже упоминалось ранее, для обмена сообщениями USB PD протокол использует линию VBus. Ниже приведена блок-схема, определяющая ключевые функциональные элементы передатчика:

И соответственно такая же блок-схема для приемника:

Сериализированная кодировка 4b5b и декодировка 5b4b подразумевает что все данные по шине, кроме преамбулы пакета, передаются пятибитными последовательностями в соответствии c таблицей кодировки, определяемой стандартом. Каждая такая последовательность кодирует либо одну из 16 цифр (0x00..0x0F), либо сигналы начала / синхронизации / сброса и конца пакета. Таким образом передача одного байта занимает 10 бит, 16-битного слова – 20 бит и 32-битного двойного слова – 40 бит и т.д.

Логический канал

USB PD протокол основывается на последовательных парах типа запрос-ответ. Запросы и ответы пересылаются с использованием пакетов. Пакеты состоят из преамбулы (фаза подготовки к передаче), начала пакета SOP (три сигнала Sync-1 и завершающий Sync-2 в кодировке 4b5b), заголовок, 0..N байт полезной нагрузки, контрольной суммы (CRC-32) и сигнала конца пакета (одиночный сигнал EOP):

Как было упомянуто выше, преамбула не кодируется в 4b5b. SOP, CRC и EOP кодируются 4b5b на физическом уровне, заголовок и полезная нагрузка кодируются на уровне логического протокола.
Сброс шины производится путем посылки трех сигналов RST1 и завершающего сигнала RST2, в соответствии с кодировкой 4b5b.

Протокол

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

Заголовок сообщения имеет фиксированную длину 16 бит и состоит из следующих полей:

Сообщения бывают двух видов – управляющие (control) и информационные (data).

Управляющие сообщения
Контрольные сообщения состоят только из заголовка и CRC. Количество объектов данных для таких сообщений всегда устанавливается в 0. Типы управляющих сообщений USB PD представлены в таблице ниже:

Отдельно следует упомянуть что поля вида tSourceActivity , tSinkRequest и т.д. - это константы, значения которых глобально заданы самой спецификацией в отдельной главе. Сделано это потому что они определялись опытным путем в результате прототипирования, и найденные оптимальные значения просто подставили в отдельную главу, чтобы не рыскать по всей спецификации.

Информационные сообщения
Данный вид сообщений предназначен для получения детальной информации об источнике или приемнике, а также для передачи запрашиваемых характеристик электропитания – сила тока, напряжение и т.д. Информационные сообщения всегда содержат ненулевое значение в поле ”Number of Data Objects”.

Спецификация определяет четыре вида информационных сообщений:

  • Power Data Objec t (PDO) – используется для описания характеристик порта источника или требований приемника
  • Request Data Object (RDO) – используется портом приемника для установки соглашения по характеристикам электропитания
  • BIST (Built In Self Test) Data Object (BDO) – используется для тестирования подключения на соответствие требованиям спецификации для физического соединения
  • Vendor Data Object (VDO) – используется для передачи нестандартной, дополнительной или иной проприетарной информации определяемой производителем оборудования и выходящей за рамки спецификации USB PD.
Виды информационных сообщений кодируются в поле ”Message Type” заголовка сообщения следующим образом:

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

Сообщения о характеристиках передаются:

  • От источника к приемнику через определенный временной интервал, при непосредственном подключении кабеля. Источник должен продолжать посылать сообщения на протяжении одной минуты после подключения до тех пор пока не будет установлено успешное соглашение по электропитанию, либо приемник не вернет RDO с флагом Capability Mismatch – несоответствие характеристик.
  • От источника к приемнику с целью принудительного переустановления соглашения по электропитанию или смены характеристик.
  • В ответ на управляющие сообщения Get_Source_Cap или Get_Sink_Cap
Каждый объект PDO должен характеризовать отдельный элемент электропитания, входящего в состав устройства на максимально допустимых для него значениях напряжения. Например, встроенная батарея 2.8-4.1V, стационарный блок питания 12V и т.д. Все элементы электропитания должны поддерживать как минимум 5V и соответственно каждый источник должет иметь хотя бы один PDO соответствующий профилю с характеристиками 5V.

PDO соответствующий элементу с постоянным типом электропитания 5V всегда должен идти первым в цепочке объектов.

Структура объекта PDO:

Для каждого типа электропитания предлагаются различные характеристики.

Постоянный тип электропитания, напряжение постоянное. Источник должен иметь хотя бы один такой элемент:

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

Вариативный тип электропитания, напряжение может изменяться в заданных пределах абсолютного минимума и абсолютного максимума, но не может регулироваться:

Батарея , данный тип используется для обозначения батарей которые могут быть напрямую подключены к линии VBus:

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

Данный запрос имеет два типа, в зависимости от адресуемого типа элемента электропитания, переданного в сообщении о характеристиках источника. Для запросов к элементу электропитания постоянного или вариативного типа, либо батареи поля ”Operating Current / Power” и ”Total Current / Prog Voltage” интерпретируются одним путем, а для запросов к элементу программируемого типа – другим путем, так как в этом случае запрашивается и напряжение, и сила тока.

Структура объекта RDO:

На мой взгляд данной информации достаточно, чтобы получить хорошее представление о принципах работы USB Power Delivery. Я сознательно не стал углубляться в дебри, связанные с таймерами, счетчиками и обработкой ошибок.

Взаимодействие с традиционным USB

Как уже было упомянуто выше, Power Delivery – это самостоятельная подсистема, которая функционирует параллельно и независимо от канонического USB. Тем не менее, в случаях когда устройства реализуют оба протокола – и USB и Power Delivery, спецификация рекомендует реализацию т.н. System Policy Manager или SPM, компонента который может контролировать оборудование USB PD посредством традиционных запросов USB.

Для систем с поддержкой SPM, спецификация рекомендует предоставить PD информацию посредством специальных типов USB дескрипторов. Не считаю нужным в них детально углубляться, просто перечислю их названия:

  • Power Delivery Capability Descriptor , является составной частью BOS дескриптора и сообщает о том поддерживает ли устройство зарядку батареи через USB, поддерживает ли оно стандарт USB PD, может ли оно выступать источником питания, и может ли оно быть приемником. Кроме того данный дескриптор содержит информацию о количестве портов-источников, портов-приемников и версии поддерживаемых спецификаций USB Battery Charging и Power Delivery.
  • Battery Info Capability Descriptor , требуется для всех устройств заявивших батарею в качестве одного из элементов электропитания. Содержит информацию о названии, серийном номере и производителе батареи, ее емкости, а также о пороговых значениях тока в заряженном и разряженом состоянии.
  • PD Consumer Port Capability Descriptor , требуется для всех устройств которые заявили поддержку хотя бы одно порта-приемника. Содержит информацию о поддержке стандартов Power Delivery и Battery Charging, минимальное и максимальное напряжение, операционную мощность, максимальную пиковую мощность и максимальное время, которое оно может эту пиковую мощность потреблять
  • PD Provider Port Capability Descriptor , требуется для всех устройств которые заявили поддержку хотя бы одного порта-источника питания. Содержит информацию о поддержке стандартов Power Delivery и Battery Charging, а так же список всех PDO объектов, характеризующих элементы электропитания доступных устройству.
  • PD Power Requirement Descriptor , требуется для всех устройств-приемников поддерживающих USB PD. Каждое устройство должно возвращать хотя бы один такой дескриптор в составе дескриптора конфигурации. Этот дескриптор должен идти сразу после первого дескриптора интерфейса. В случае когда их несколько, он должен идти после каждого первого дескриптора интерфейса функции, если используется IAD, или в случае композитного устройства без IAD, непосредственно после каждого дескриптора интерфейса, и до endpoint дескрипторов.
Для управления USB Power Delivery через запросы USB, в случае если устройство поддерживает Power Delivery класс, спецификация предлагает команды, которые могут использоваться для передачи PD запросов и объектов посредством USB, то есть через шину данных. Сводная таблица дана ниже:

Заключение

Надеюсь что данным постом я подогрел интерес публики к USB Power Delivery. Скромно замечу, что автор имеет непосредственное отношение к данной спецификации, поэтому готов ответить на любые вопросы по Power Delivery в частности и USB в общем.

Интерфейс USB (Universal Serial Bus - Универсальный Последовательный Интерфейс) предназначен для подключения периферийных устройств к персональному компьютеру. Позволяет производить обмен информацией с периферийными устройствами на трех скоростях (спецификация USB 2.0 ):

  • Низкая скорость (Low Speed - LS) - 1,5 Мбит/с;
  • Полная скорость (Full Speed - FS) - 12 Мбит/с;
  • Высокая скорость (High Speed - HS) - 480 Мбит/с.
Для подключения периферийных устройств используется 4-жильный кабель: питание +5 В, сигнальные провода D+ и D- , общий провод.
Интерфейс USB соединяет между собой хост (host ) и устройства. Хост находится внутри персонального компьютера и управляет работой всего интерфейса. Для того, чтобы к одному порту USB можно было подключать более одного устройства, применяются хабы (hub - устройство, обеспечивающее подключение к интерфейсу других устройств). Корневой хаб (root hub ) находится внутри компьютера и подключен непосредственно к хосту. В интерфейсе USB используется специальный термин "функция" - это логически законченное устройств, выполняющее какую-либо специфическую функцию. Топология интерфейса USB представляет собой набор из 7 уровней (tier ): на первом уровне находится хост и корневой хаб, а на последнем - только функции. Устройство, в состав которого входит хаб и одна или несколько функций, называется составным (compaund device ).
Порт хаба или функции, подключаемый к хабу более высокого уровня, называется восходящим портом (upstream port ), а порт хаба, подключаемый к хабу более низкого уровня или к функции называется нисходящим портом (downstream port ).
Все передачи данных по интерфейсу иницируются хостом. Данные передаются в виде пакетов. В интерфейсе USB испольуется несколько разновидностей пакетов:
  • пакет-признак (token paket ) описывает тип и направление передачи данных, адрес устройства и порядковый номер конечной точки (КТ - адресуемая часть USB-устройства); пакет-признаки бывают нескольких типов: IN , OUT , SOF , SETUP ;
  • пакет с данными (data packet ) содержит передаваемые данные;
  • пакет согласования (handshake packet ) предназначен для сообщения о результатах пересылки данных; пакеты согасования бывают нескольких типов: ACK , NAK , STALL .
Таким образом каждая транзакция состоит из трех фаз: фаза передачи пакета-признака, фаза передачи данных и фаза согласования.
В интерфейсе USB используются несколько типов пересылок информации.
  • Управляющая пересылка (control transfer ) используется для конфигурации устройства, а также для других специфических для конкретного устройства целей.
  • Потоковая пересылка (bulk transfer ) используется для передачи относительно большого объема информации.
  • Пересылка с прерыванием (iterrupt transfer ) испольуется для передачи относительно небольшого объема информации, для которого важна своевременная его пересылка. Имеет ограниченную длительность и повышенный приоритет относительно других типов пересылок.
  • Изохронная пересылка (isochronous transfer ) также называется потоковой пересылкой реального времени. Информация, передаваемая в такой пересылке, требует реального масштаба времени при ее создании, пересылке и приеме.

Потоковые пересылки характеризуются гарантированной безошибочной передачей данных между хостом и функцией посредством обнаружения ошибок при передаче и повторного запроса информации.
Когда хост становится готовым принимать данные от функции, он в фазе передачи пакета-признака посылает функции IN -пакет. В ответ на это функция в фазе передачи данных передает хосту пакет с данными или, если она не может сделать этого, передает NAK - или STALL -пакет. NAK -пакет сообщает о временной неготовности функции передавать данные, а STALL -пакет сообщает о необходимости вмешательства хоста. Если хост успешно получил данные, то он в фазе согласования посылает функции ACK
Когда хост становится готовым передавать данные, он посылает функции OUT -пакет, сопровождаемый пакетом с данными. Если функция успешно получила данные, он отсылает хосту ACK -пакет, в противном случае отсылается NAK- или STALL -пакет.
Управляющие пересылки содержат не менее двух стадий: Setup-стадия и статусная стадия . Между ними может также располагаться стадия передачи данных . Setup-стадия используется для выполнения SETUP-транзакции , в процессе которой пересылается информация в управляющую КТ функции. SETUP-транзакция содержит SETUP -пакет, пакет с данным и пакет согласования. Если пакет с данными получен функцией успешно, то она отсылает хосту ACK -пакет. В противном случае транзакция завершается.
В стадии передачи данных управляющие пересылки содержат одну или несколько IN- или OUT- транзакций, принцип передачи которых такой же, как и в потоковых пересылках. Все транзакции в стадии передачи данных должны производиться в одном направлении.
В статусной стадии производится последняя транзакция, которая использует те же принципы, что и в потоковых пересылках. Направление этой транзакции противоположно тому, которое использовалось в стадии передачи данных. Статусная стадия служит для сообщения о результате выполнения SETUP-стадии и стадии передачи данных. Статусная информация всегда передается от функции к хосту. При управляющей записи (Control Write Transfer ) статусная информация передается в фазе передачи данных статусной стадии транзакции. При управляющем чтении (Control Read Transfer ) статусная информация возвращается в фазе согласовании статусной стадии транзакции, после того как хост отправит пакет данных нулевой длины в предыдущей фазе передачи данных.
Пересылки с прерыванием могут содержать IN - или OUT -пересылки. При получении IN -пакета функция может вернуть пакет с данными, NAK -пакет или STALL -пакет. Если у функции нет информации, для которой требуется прерывание, то в фазе передачи данных функция возвращает NAK -пакет. Если работа КТ с прерыванием приостановлена, то функция возвращает STALL -пакет. При необходимости прерывания функция возвращает необходимую информацию в фазе передачи данных. Если хост успешно получил данные, то он посылает ACK -пакет. В противном случае согласующий пакет хостом не посылается.
Изохронные транзакции содержат фазу передачи признака и фазу передачи данных , но не имеют фазы согласования . Хост отсылает IN - или OUT -признак, после чего в фазе передачи данных КТ (для IN -признака) или хост (для OUT -признака) пересылает данные. Изохронные транзакции не поддерживают фазу согласования и повторные посылки данных в случае возникновения ошибок.

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

Фирма-производитель Наименование Описание

Atmel
AT43301 Контроллер LS/FS-хаба 1-4 с общим управлением питанием нисходящих портов.
AT43312A Контроллер LS/FS-хаба 1-4 с индивидуальным управлением питанием нисходящих портов.
AT43320A Микроконтроллер на ядре AVR. Имеет встроенные USB-функцию и хаб с 4 внешними нисходящими портами, работающие в LS/FS-режимах, 512 байт ОЗУ, 32х8 регистров общего назначения, 32 программируемых вывода, последовательный и SPI-интерфейсы. Функция имеет 3 КТ с буферами FIFO размером 8 байт. Для нисходящих портов хаба предусмотрено индивидуальное управление питанием.
AT43321 Контроллер клавиатуры на ядре AVR. Имеет встроенные USB-функцию и хаб с 4 внешними нисходящими портами, работающие в LS/FS-режимах, 512 байт ОЗУ, 16 кбайт ПЗУ, 32х8 регистров общего назначения, 20 программируемых вывода, последовательный и SPI-интерфейсы. Функция имеет 3 КТ. Для нисходящих портов хаба предусмотрено индивидуальное управление питанием.
AT43324

Микроконтроллер на ядре AVR. Имеет встроенные USB-функцию и хаб с 2 внешними нисходящими портами, работающие в LS/FS-режимах, 512 байт ОЗУ, 16 кбайт ПЗУ, 32х8 регистров общего назначения, 34 программируемых вывода. Клавиатурная матрица может иметь размер 18х8. Контроллер имеет 4 выхода для подключения светодиодов. Функция имеет 3 КТ. Для нисходящих портов хаба предусмотрено индивидуальное управление питанием.

AT43355 Микроконтроллер на ядре AVR. Имеет встроенные USB-функцию и хаб с 2 внешними нисходящими портами, работающие в LS/FS-режимах, 1 кбайт ОЗУ, 24 кбайт ПЗУ, 32х8 регистров общего назначения, 27 программируемых выводов, последовательный и SPI-интерфейсы, 12-канальный 10-разрядный АЦП. Функция имеет 1 управлющую КТ и 3 программируемых КТ с буферами FIFO размером 64/64/8 байт.
Fairchild Semiconductor USB100 Контроллер манипуляторов (мышь, трекбол, джойстик). Поддерживает 2D/3D-мышь, джойстик с тремя потенциометрами, манипулятор с 16 кнопками.

Intel
8x931Ax Микроконтроллер с архитектурой MSC-51. Имеет встроенную USB-функцию, работающую в LS/FS-режимах, 256 байт ОЗУ, 0/8 кбайт ПЗУ, 8х4 регистра общего назначения, 32 программируемых вывода, последовательный интерфейс, интерфейс управления клавиатурой. Функция имеет 3 КТ с буферами FIFO размером 8/16/8 байт.
8x931Hx Микроконтроллер с архитектурой MSC-51. Имеет встроенную USB-функцию и хаб с 4 внешними нисходящими портами, работающие в LS/FS-режимах, 256 байт ОЗУ, 0/8 кбайт ПЗУ, 8х4 регистра общего назначения, 32программируемых вывода, последовательный интерфейс, интерфейс управления клавиатурой. Функция имеет 3 КТ с буферами FIFO размером 8/16/8 байт.
8x930Ax Микроконтроллер с архитектурой MSC-251. Имеет встроенную USB-функцию, работающую в LS/FS-режимах, 1024 байта ОЗУ, 0/8/16 кбайт ПЗУ, 40 регистров общего назначения, 32 программируемых вывода, последовательный интерфейс. Функция имеет 4(6) КТ с буферами FIFO размером 16/1024(256)/16(32)/16(32)/(32)/(16) байт.
8x930Hx Микроконтроллер с архитектурой MSC-251. Имеет встроенную USB-функцию и хаб с 4 внешними нисходящими портами, работающие в LS/FS-режимах, 1024 байта ОЗУ, 0/8/16 кбайт ПЗУ, 40 регистров общего назначения, 32 программируемых вывода, последовательный интерфейс. Функция имеет 4 КТ с буферами FIFO размером 16/1024/16/16 байт.

Microchip
PIC16C745 Микроконтроллер с архитектурой PIC. Имеет встроенную USB-функцию, работающую в LS-режиме, 256 байт ОЗУ, 14336 байт ПЗУ, 22 программируемых вывода, последовательный интерфейс, 5-канальный 8-битный АЦП.
PIC16C765 Микроконтроллер с архитектурой PIC. Имеет встроенную USB-функцию, работающую в LS-режиме, 256 байт ОЗУ, 14336 байт ПЗУ, 33 программируемых вывода, последовательный интерфейс, 8-канальный 8-битный АЦП.
PIC18F2450 Микроконтроллер с архитектурой PIC. Имеет встроенную USB-функцию, работающую в LS/FS-режиме, 1536 байт ОЗУ, 16384 байт ПЗУ, 19 программируемых выводов, последовательный и SPI-интерфейсы, 5-канальный 10-битный АЦП. Функция имеет 8 КТ.
PIC18F2550 Микроконтроллер с архитектурой PIC. Имеет встроенную USB-функцию, работающую в LS/FS-режиме, 1536 байт ОЗУ, 32768 байт ПЗУ, 19 программируемых выводов, последовательный, CAN- и SPI-интерфейсы, 5-канальный 10-битный АЦП. Функция имеет 8 КТ.
PIC18F4450 Микроконтроллер с архитектурой PIC. Имеет встроенную USB-функцию, работающую в LS/FS-режиме, 1536 байт ОЗУ, 16384 байт ПЗУ, 34 программируемых вывода, последовательный, CAN- и SPI-интерфейсы, 8-канальный 10-битный АЦП. Функция имеет 8 КТ.
PIC18F4550 Микроконтроллер с архитектурой PIC. Имеет встроенную USB-функцию, работающую в LS/FS-режиме, 1536 байт ОЗУ, 32768 байт ПЗУ, 34 программируемых вывода, последовательный, CAN- и SPI-интерфейсы, 8-канальный 10-битный АЦП. Функция имеет 8 КТ.
Texas Instruments TUSB2036 Контроллер LS/FS-хаба 1-3 с индивидуальным управлением питанием нисходящих портов.

Разъем USB типа A наиболее распространен и является самым узнаваемым. Компьютерные мышки, клавиатуры, внешние жесткие диски оснащены именно этим коннектором. Разработка этого форм-фактора USB была закончена в 90-х годах прошлого столетия, релиз состоялся вместе с первой версией стандарта. Основным преимуществом является прочность и надежность, позволяющие выдержать большое количество подключений без каких-либо проблем. Несмотря на прямоугольную форму разъема, его нельзя воткнуть неправильно, благодаря специальной защите. Однако из-за больших габаритов, не подходивших для портативных устройств, были разработаны USB разъемы меньших размеров.

Коннекторы USB типа B обычно используются для подключения периферийных устройств к компьютеру на стороне устройства. Сейчас этот тип разъема не распространен. Также существуют портативные разъемы типа B – Mini USB и Micro USB .

Появление Mini USB было обусловлено широким распространением миниатюрных устройств, размер которых не позволял использовать полноценные разъемы. Однако вскоре стало понятно, что этот разъем не отличается надежностью. Поэтому ему на смену пришла спецификация Micro USB. Измененная форма позволяла крепко держаться в устройстве, к тому же коннектор был еще меньше, нежели Mini USB. Использование Micro USB фактически стало стандартом для всех компактных устройств. Но уже сейчас ему на смену приходит USB типа C.

USB Type- C или USB-C – это последний из представленных стандартов разъемов USB. Релиз спецификации состоялся в 2014 году. Данная версия обеспечивает высокую скорость передачи данных, а также возможность двустороннего подключения.

Стандарты USB

15 января 1996 года была представлена первая спецификация стандарта универсальной последовательной шины — USB 1.0 . Скорость передачи данных не превышала 12 Мбит/c, а максимальная сила тока, подаваемая на подключенные устройства, составляла 500 мА.

Версия USB 1.1 лишь исправляла ошибки, допущенные при проектировании первой спецификации, однако именно 1.1 впервые была широко распространена. Стандарт USB 2.0 был анонсирован уже в апреле 2000 года и служил обновлением для USB 1.1.

USB 2.0 предоставил дополнительную пропускную способность для приложений, мультимедиа и хранения данных. Скорость передачи данных возросла в 40(!) раз. Для обеспечения плавного перехода на новый стандарт как для потребителей, так и для производителей, USB 2.0 имел полную совместимость с оригинальными USB-устройствами.

Данный стандарт поддерживает три режима скорости (1.5, 12 и 480 мегабит в секунду):

  • Low Speed (не более 1.5 Мбит/с) – клавиатуры, мыши, джойстики;
  • Full Speed (не более 12 Мбит/с) – аудио- и видеоустройства;
  • High Speed (не более 480 Мбит/с) – высокопроизводительные периферийные устройства;

Внедрение USB 2.0 позволило сильно продвинуться в развитии периферийных «девайсов» для персональных компьютеров. Этот стандарт позволил подключать несколько энергоемких устройств к хосту одновременно.

Стандарт USB 3.0 (SuperSpeed ​​ USB ) стал официальным 17 ноября 2008 года. Новая спецификация поддерживала скорость передачи в 10 раз большую (до 4.8 гигабит в секунду), нежели USB 2.0. Максимальная сила тока, подаваемая на периферийные устройства, возросла с 500 до 900 мА. Это позволило не использовать дополнительные источники питания для некоторых гаджетов, а также увеличить количество устройств, питающихся от одного порта.

Переход на USB 3.0 был очень медленным. Корпорация Intel отложила внедрение стандарта в свои чипсеты до 2011 года. Отсутствовала поддержка новой спецификации и со стороны софта: ни Windows, ни Linux на тот момент не могли работать с версией 3.0.

Летом 2013 года был разработан обновленный стандарт — USB 3.1 . Скорость передачи данных возросла до 10 Гбит/с. Стандарт 3.1 обратно совместим с версиями 2.0 и 3.0. Именно с этой версией стали появляться новые разъемы USB Type-C.

Версия USB 3.2 обещает снова увеличить скорость обмена данными вдвое – уже до 20 Гбит/с.

USB-хабы (USB-концентраторы, USB-разветвители)

Компьютеры, как минимум, имеют один или два USB-разъема. Но с таким количеством USB-устройств на рынке, вы быстро исчерпаете лимит доступных портов. У вас могут быть одновременно подключены клавиатура, мышь, принтер, микрофон и веб-камера, работающие через USB. Возникает очевидный вопрос: «Как подключить все устройства?»

Легкое решение проблемы — купить недорогой USB-концентратор (хаб). Что же такое USB-хаб?

USB-хаб – это устройство, выполняющее роль «переходника» от одного разъема USB до большего количества.

Стандарт USB поддерживает подключение до 127 устройств к одному порту, а USB-хабы являются частью стандарта. К тому же, с помощью USB-хабов можно увеличить длину USB провода с максимально возможных для одного кабеля 5 метров до 30.

Вы подключаете разветвитель к компьютеру, а затем подключаете свои устройства (или другие разветвители) непосредственно к нему. Соединяя концентраторы вместе, вы можете создавать десятки доступных USB-портов на одном компьютере.

Концентраторы могут питать или не питать подключенные устройства. У энергоемких устройств (принтеров, сканеров и т.д.) есть свой собственный источник питания, но устройства с низким энергопотреблением (мыши, клавиатуры и т.д.) получают питание от компьютера. Это сильно упрощает работу с ними. Мощность (до 500 миллиампер с напряжением 5 вольт для USB 2.0 и 900 миллиампер для USB 3.0) поступает с шины компьютера. Если у вас много устройств с автономным питанием (например, принтеры и сканеры), то ваш концентратор не нуждается в питании. Если же у вас много устройств без питания, таких как мыши и клавиатуры, вам, вероятно, нужен мощный концентратор с собственным блоком питания.

Как работает USB?

Как мы уже говорили, к одному USB хосту можно подключить одновременно несколько устройств. Каждому устройству ставится в соответствие уникальный адрес – 7-битное двоичное число (отсюда и следует ограничение в 127 устройств). В момент подключения к хосту устройство высылает данные, содержащие информацию о типе прибора, производителе и т.д. На основе этих данных хост принимает решение, в каком режиме работать с данным аппаратом.

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

  • IN (хост готов принимать данные с устройства);
  • OUT (хост готов передавать данные на устройство);
  • SETUP (хост сообщает устройству о последующей передаче конфигурационной информации);

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

Использование USB-портов и разъемов стало повсеместным. Они применяются и на компьютерах, и на мобильных устройствах, и на устройствах хранения данных. USB-коннекторы сильно облегчили процесс питания устройств и передачи данных в современном мире.

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

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

Долгое время единственным универсальным интерфейсом для ПК был SCSI, дорогой вариант оправданный только для высокой пропускной способности устройств. Для периферийных устройств как правило, требуется либо последовательный или параллельный порт, или используется фирменный интерфейс.
Разработанные изначально для принтеров и модемов, последовательные и параллельные порты компьютера оставляют желать лучшего как общие цели интерфейса. Их скорость передачи данных низкая (максимальная 115Kbit/sec для последовательного порта, до 400KB/sec для параллельного интерфейса), и каждое устройство требует своего собственного аппаратного прерывания (IRQ), которое ограничивает количество возможных расширений. И не было никакой надежды на достижение подключения и работы с этими интерфейсами, это и является существенным, если присоединение периферийных устройств к ПК должно быть сделано так, что может быть достигнуто путем нетехнических пользователей.
Необходимость средних скоростей, недорогого в подключении интерфейса, который может использоваться для подключения практически неограниченного числа устройств в конце концов признали, и нашли решение Universal Serial Bus — USB .
Дизайн цели
USB был разработан, чтобы позволить большому количеству (до 127) с низкой и средней скоростью периферийных устройств для установки на ПК, с максимальной скоростью передачи 12Mbit/sec . USB никогда не был предназначен для альтернативы SCSI порта, но всё же он намного быстрее, чем последовательный или параллельный порты.
Особое внимание было уделено нуждам аудио и видео устройствам, для которых было предусмотрено большее значение производительности для следующего поколения персональных приложений. Дизайн USB предоставляет собой изохронные данные, которые будут поставляться без задержек и которые могут отрицательно повлиять на качество изображения и речи.
USB интерфейс был разработан, чтобы просто подключить и работать. Устройства могут быть добавлены и удалены даже при работающей системе, что позволяет избежать необходимости перезагрузки системы и её перенастройки. Технические вопросы, такие как назначение устройству идентификатора,которые заботятся об аппаратной и программной архитектуре, так что эти общие источники не будет проблемой и ошибкой конфигурации. Была введена и система для энергосбережения, позволяя устройствам быть приостановленными.
Типичные устройства USB , требующие низкой и средней пропускной способности. На нижнем конце диапазона пропускной способности, USB может быть использовано для подключения клавиатуры и мыши к компьютеру. На верхнем, сканеры, устройства резервного копирования или камеры для видео-конференц-приложений которые могут использовать USB , что исключает необходимость для собственных интерфейсных плат и связанную с ними установку и проблемы настройки.
Архитектура шины, в которой данные для различных устройств путешествует по тому же кабелю, также имеет потенциал для упрощения связей. Например, мышь может подключаться к клавиатуре, и один кабель будет затем связывать их с ПК . Хотя мониторам по-прежнему необходим аналоговый кабель VGA, отдельное звено USB позволит мониторам работать от программного обеспечения на ПК , а не на экране. В случае с мультимедийным монитором, аудио-данные для встроенных динамиков и микрофона также могут быть отправлены по тому же кабелю.
Физический уровень
USB-устройства соединяются вместе с помощью недорогого белого четырёх жильного кабеля с волновым сопротивлением 90 Ом. USB-устройства могут быть как с автономным питанием (с собственным автономным питанием) или с питанием от шины. Одна из пар проводов в кабеле USB используется для передачи питания + 5: контакт 1 несет напряжение питания +5 В, контакт 4 общий. Существуют два класса с питанием устройства от шины. Маломощные приборы могут потреблять не более 100 мА тока, в то время приборы большой мощности могут потреблять до 500 мА. Вторая пара проводов, D + и D-на выводах два и три, является витая пара используемая для передачи данных. Данные провода используют дифференциальную передачу сигналов: и несут сигнал по отношению к земле, переход происходит, когда две линии передачи данных от обратной полярности по отношению друг к другу. Это дает лучшую устойчивость к шуму, чем обычный однотактный логический сигнал.
Данные отправляются как синхронный последовательный поток битов, закодированных с помощью NRZI (0 представлен переход сигнала и 1 в переходный период.) Бит используется, чтобы гарантировать, что переходы происходят достаточно часто,так что приемники не теряют синхронизацию. Временные сигналы передаются вместе с данными, синхронизация поля предшествует каждому пакету данных.
USB работает на двух разных скоростях. Полная скорость даёт пропускную способность 12Mbit/sec. На такой скорости, экранированный кабель должен быть использован для получения адекватной помехоустойчивости и предотвращения электромагнитных помех (EMI). Экранированный кабель около 5 мм. в диаметре, сегменты кабеля могут иметь максимальную длину 5 метров.
Для приложений, требующих низкую пропускную способность, имеется более низкая скорость работы. Это позволяет сдлеать немного тоньше и дешевле неэкранированный кабель, который будет использоваться. Длина кабеля уменьшается на неэкранированном кабеле и максимально может быть 3м. Для предотвращения сигнала высокая скорость передается через неэкранированный кабель (что приведет к EMI) и, чтобы избежать риска устройств с низкой скоростью передачи данных неправильного определения полной скорости передачи данных в виде команд, которым они должны отвечать, связи с низкой скоростью устройств отключены в то время когда используется полная сигнализация скорости.
Два типа вилка и розетка, известный как серия А и серия B, которые заданы для USB портов. Серия вилка и розетка, предназначены для использования с устройствами, к которым прочно прикреплен внешний кабель, например, клавиатура, мышь и концентраторы. Серия B разъемов используются, когда кабель USB съемный, как в случае принтеров, сканеров и модемов. Эти два типа не являются взаимозаменяемыми.
Серия B имеет разъемы 10.6mm х 12.0mm с контактными углублениями. Как вилки так и розетки имеют небольшие размеры,так что порты USB устанавливаются на ноутбуки, а также настольные ПК , так как технология становится все более распространенной. USB-портам назначаеться графический значок, показанный на рисунке.

Продолжение статьи следует, читаем в следующих статьях.

Начнем с минимума:
include 18f2455 -- библиотека для используемого МК
--
enable_digital_io () -- переключение всех входов на цифровой режим
--
alias Button is pin_B7 -- раз уж у нас подключена кнопка, объявим ее
pin_B7_direction = input -- кнопка у нас работает на вход
--
-- одна строчка - и у нас есть все необходимое для работы с USB CDC
include usb_serial -- бибилотека для работы с usb
--
usb_serial_init () -- --инициализируем USB CDC
forever loop -- основной цикл, выполняется постоянно
usb_serial_flush () -- обновление usb. Данная процедура выполняет все необходимые
-- действия для поддержания соединения с ПК
end loop

Скомпилировав данный код, записав полученный HEX файл в МК при помощи бутлоадера и запустив устройство можно будет наблюдать как в системе опрделится новое устройство: Виртуальный сom-порт.

Теперь, когда устройство уже работает, научим его общаться.

Для чтения принятого байта существует функция usb_serial_read(byte) :boolean. При наличии полученного байта она заносит его в указанную переменную и возвращает true , иначе возвращает false .

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

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

include 18f2455
--
enable_digital_io ()
--
alias Button is pin_B7
pin_B7_direction = input
--
--
include usb_serial
--
usb_serial_init ()
var byte ch -- объявляем переменную
forever loop -- основной цикл
usb_serial_flush ()
if (usb_serial_read (ch )) then -- если байт получен, он будет записан в ch
usb_serial_data = ch -- отправляем полученный байт обратно
end if
end loop

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

Пока у нас нет своего, используем готовый терминал: я использовал программу RealTerm.
Открываем порт с нужным номером и отправляем данные.


И нам в ответ приходит то, что мы отправили. Значит, все работает как надо.

Софт

Итак, наш микроконтроллер умеет принимать байты и тут же отправлять их обратно. Теперь напишем свой софт для общения с ним (я буду использовать Delphi).

Создаем новый проект, раскидываем по форме необходимые компоненты:
SpinEdit1 - для указания номера порта
Button1 - для установки соединения
Button2 - для разрыва соединения
SpinEdit2 - для ввода байта в десятичном виде
Button3 - для отправки байта
Memo1 - для вывода принятой информации.

Как уже было сказано выше, с com-портом нужно работать так же, как и с обычным текстовым файлом: используя функции CreateFile, WriteFile и ReadFile.

Дабы не вдаваться в подробности, возьмем готовую библиотеку для работы с com-портом: ComPort.

Вешаем на каждую кнопку необходимую задачу и получаем конечный код:

unit Unit1;

interface

Uses
Windows, Messages, SysUtils, Variants, Classes, Graphics , Controls, Forms,
Dialogs, StdCtrls, Spin,ComPort;

Type
TForm1 = class (TForm)
SpinEdit1: TSpinEdit;
Button1: TButton;
Button2: TButton;
SpinEdit2: TSpinEdit;
Button3: TButton;
Memo1: TMemo;
procedure OnRead(Sender: TObject; ReadBytes: array of Byte );
procedure Button1Click(Sender: TObject);
procedure Button2Click(Sender: TObject);
procedure FormDestroy(Sender: TObject);
procedure Button3Click(Sender: TObject);
private
{ Private declarations }
Port: TComPort;
public
{ Public declarations }
end;

var
Form1: TForm1;
num: integer;
implementation

Procedure TForm1.Button1Click(Sender: TObject);
begin
Port:= TComPort.Create(SpinEdit1.Value, br115200); //создаем соединение
Port.OnRead:= OnRead; //создаем поток чтения принятых данных
Button2.Enabled:= true ; //активируем кнопку закрытия соединения
end;

Procedure TForm1.Button2Click(Sender: TObject);
begin
Port.Free; //закрываем соединение
Button2.Enabled:= false ; //отключаем кнопку
end;

Procedure TForm1.Button3Click(Sender: TObject);
begin
if Button2.Enabled then Port.Write();
end;

Procedure TForm1.FormDestroy(Sender: TObject);
begin
if Button2.Enabled then
Port.Free;
end;

Procedure TForm1.OnRead(Sender: TObject; ReadBytes: array of Byte );
var
i:integer;
begin
for i:= Low(ReadBytes) to High(ReadBytes) do //проходим по массиву принятых байт
begin
Memo1.Text:= Memo1.Text + "." +InttoHex(ReadBytes[i],2); //добавляем его HEX значение в окно
inc(num); //считаем колв-о принятых байт
end;
if num > 10 then begin
Memo1.Lines.Add("" ); //переносим строку
num:= 0;
end;
end;

Запускаем, устанавливаем соединение, отправляем байты:

Вот и готов наш самый простой терминал для работы с самым простым usb-устройством.

Как видно, чтение и запись происходит динамическими массивами байт.

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

include 18f2455
--
enable_digital_io ()
--
alias Button is pin_B7
pin_B7_direction = input
--
--
include usb_serial
--
usb_serial_init ()
var byte ch
var byte i -- объявляем вторую переменную
forever loop -- основной цикл
usb_serial_flush ()
if (usb_serial_read (ch )) then -- если байт получен выполняем необходимые действия
case ch of -- перебираем номер байта
0 : usb_serial_data = 0xff
1 : usb_serial_data = Button -- отправка состояния кнопки
OTHERWISE block -- если получено что-то иное
for 16 using i loop -- отправляем 10 байт с данными
usb_serial_data = ch +i -- от ch до ch+15
end loop
end block
end case
end if
end loop

Дополнительные возможности

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

Упрощение отправки данных

Отправлять информацию по одному байту - не всегда удобно. Очень часто может пригодиться библиотека print . Она содержит процедуры по отправке данных всевозможной длины всевозможными форматами: byte,hex,dec,bin,boolean что может упростить вывод данных в программе.
>include print
...
var dword data
print_dword_hex (usb_serial_data , data )

Название всех команд можно посмотреть в файле библиотеки.

Ожидание подключения к ПК

Если перед стартом основного цикла микроконтроллера необходимо предварительно установить соединение с ПК, то можно дописать перед ним строчки
while (usb_cdc_line_status () == 0x00 ) loop
end loop

Привязываем к устройству номер порта

Если оставить все как есть, система при каждом новом подключении будет выделять первый свободный номер порта. А это значит что за ним придется всегда следить.
Для того, что бы этого не происходило, необходимо устройству присвоить уникальное значение серийного номера до подключения библиотеки usb:
Номер может быть любой длины и содержать различные символы.
const byte USB_STRING3 =
{
24 , -- длина массива
0x03 , -- bDescriptorType
"0" , 0x00 ,
"1" , 0x00 ,
"2" , 0x00 ,
"3" , 0x00 ,
"4" , 0x00 ,
"5" , 0x00 ,
"6" , 0x00 ,
"7" , 0x00 ,
"8" , 0x00 ,
"9" , 0x00 ,
"X" , 0x00
}

Меняем имя устройства на свое

Поменять имя устройства, видимое в системе до установки драйверов можно объявив массив с именем, как и серийный номер, это необходимо сделать до подключения библиотеки USB.
const byte USB_STRING2 =
{
28 , --
0x03 , -- bDescriptorType
"D" , 0x00 ,
"e" , 0x00 ,
"m" , 0x00 ,
"o" , 0x00 ,
" " , 0x00 ,
"B" , 0x00 ,
"o" , 0x00 ,
"a" , 0x00 ,
"r" , 0x00 ,
"d" , 0x00 ,
" " , 0x00 ,
"=" , 0x00 ,
")" , 0x00
}

Но увы, после установки драйверов устройство поменяет имя на указанное в.inf файле, потому поменяем имя и там


DESCRIPTION=«Demo CDC»

Организуем автоподключение устройства

Увы, никаких прямых путей выполнить данную задачу нет, потому придется исхитриться.

Прежде всего необходимо присвоить своему устройству уникальное значение производителя и продукта, дабы легко определять его среди сотен других стандартных CDC-прошивок.
VID и PID выдаются за денюжку, потому пойдем по пуути китайцев: втихую возьмем себе заведомо свободные значения.

Прошивка:
В прошивке необходимо объявить две переменные до подключения библиотеки USB

const word USB_SERIAL_PRODUCT_ID = 0xFF10
const word USB_SERIAL_VENDOR_ID = 0xFF10

Вместо FF10 можно вставить любые два слова (2 байта). Конечный результат содержится в прилагаемом архиве.

Драйвера:
Так как драйвера не предназначены для нашей комбинации VID и PID, допишем наши значения в.inf файл вручную:


%DESCRIPTION%=DriverInstall, USB\VID_FF10&PID_FF10


%DESCRIPTION%=DriverInstall, USB\VID_FF10&PID_FF10

Софт:
Для отлова событий подключения\отключения устройства подключим библиотеку ComponentUSB. Не считаю нужным пояснять каждую строчку: все изменения можно увидеть в прилагаемом проекте.

Результат

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

Как видно, организовать обмен данными между МК и ПК через USB - не самое сложное занятие. Полученное соединение можно использовать не только для конечынх целей: оно так же подходит для отладки программы. Ведь отправить на компьютер результаты расчетов, текущие состояния регистров и переменных куда нагляднее, чем моргать парой светодиодов азбукой морзе.

И напоследок: советую заглянуть в исходный код лампы настроения. Там можно найти довольно-таки хороший вариант обработки принимаемых данных для организации удобного протокола обмена.



Понравилась статья? Поделиться с друзьями: