Адаптер usb to usart, spi и i2c

Адаптер USB to USART, SPI и I2C

Все началось с того, что мне надо было подключиться к одному устройству по USART. Я сразу взял адаптер USB to UASRT (ибо в ноутбуке COM порт не предусмотрен) на AtTiny2313 (рекламой заниматься не буду, схема легко находится в интернете), подключил, запустил и внезапно понял, что у адаптера фиксированная скорость 9600, а у девайса, к которому требовалось подключиться, скорость 57600. Дело, естественно, было поздним вечером, и купить что-нибудь вроде FT232 возможности не было. Поэтому после непродолжительного раздумья, было решено изменить скорость UASRT в адаптере обычной перепрошивкой. В итоге соединение было успешно налажено. Но согласитесь — это ведь не выход, программатора может под рукой не оказаться, да и неудобно каждый раз с прошивкой шаманить. В следствие этого я серьезно задумался о создании нормального адаптера, с регулируемой скоростью (и не только).

Конечно, самый простой вариант – купить FT232, но сравнив ее стоимость со стоимостью Mega8, я пришел к выводу, что этот вариант мне не подходит. Поэтому было решено сделать адаптер на МК. А раз он на МК, то делать только USART как-то не рационально. Поэтому неплохо было бы в этот адаптер засунуть еще несколько интерфейсов, если уж делать, то что-то универсальное и полезное. Почти сразу в памяти всплыли “приятные” воспоминания об установке драйверов для адаптера на Tiny2313 (для Windows7 x64 это довольно мучительно). А это значит, что от устройства “виртуальный COM” придется отказаться, следовательно, надо будет написать программу для ПК, иначе работа с устройством будет невозможна. В общем, после обдумывания в течение некоторого времени, сформировалась окончательная идея девайса. Функционал получился вот таким:

  • адаптер USB->USART;
  • адаптер USB->SPI;
  • адаптер USB->I 2 C;
  • при этом устройство должно быть HID (Human Interface Device), чтобы не морочить голову с установкой драйверов.

Объектом издевательств стал МК Mega8, т.к. в TQFP корпусе он занимает совсем мало места (намного меньше, чем AtTiny2313) и обладает целыми 8 Кб. памяти. Сначала планировалось сделать все интерфейсы программными, но после разводки платы пришлось отказаться от аппаратного I 2 C, т.к. на односторонней плате вывести его никак не получалось (в будущем все-таки надо будет решить этот вопрос, может отдельно вывести сбоку платы). Поэтому его функциональность несколько ограничена, но USART и SPI остались полнофункциональными. Для связи с ПК была применена библиотека V-USB.

Схема устройства получилась вот такой:

Как видно, ничего сложного в ней нет. МК питается напряжением 5 В., согласование уровней для USB выполнено при помощи делителей напряжения резистор 68 Ом. + стабилитрон 3.3 В.. Тактовая частота МК – 12 МГц. Это минимальная частота для работы с шиной USB. Так же в схеме присутствуют три светодиода для индикации режимов работы. Один из светодиодов показывает, какой режим работы включен, а два других индицируют прием/передачу данных. Никаких кнопок и переключателей в устройстве не предусмотрено, и все настройки выполняются программно, прямо с ПК. Да, на все выводы, используемые для работы интерфейсов включены резисторы на 68 Ом. для защиты МК от КЗ. Как уже было отмечено выше, устройство представляется ПК как HID и не требует установки драйверов. VID и PID были выбраны из предоставляемых V-USB: VID — 0x16c0, PID — 0x05df. В противном случае пришлось бы отдать кругленькую сумму за покупку индивидуального идентификатора для USB устройства. Но т.к. проект Open Source и некоммерческий, совершенно свободно можно использовать идентификаторы, предложенные V-USB.

Плата получилась вот такая:

А в спаянном виде:

Это был тестовый образец да еще и разведенный с ошибками. Я почему-то посчитал, что вывод CE выводить не стоит. Ну ничего, все уже исправлено и к статье приложена правильная плата.

Итак, со схемой все понятно, он простая до предела и паяется за один вечер. Но, как было сказано выше, получившееся устройство определяется ПК как HID, т.е. ОС подбирает под него драйвер из своей базы. Проще говоря, Windows думает, что работает с устройством ввода. Это делает возможным работу на любом ПК без мороки с драйверами. Но с этим связана одна небольшая проблема, ни одна из существующих программ для обмена данными через USART работать с этим устройством не будет. А значит нужна какая-то специальная программа для работы с модулем, иначе он никакой ценности из себя не представляет. Поэтому я открыл свой любимый C++ Builder (нынче его обозвали CodeGear RAD Studio, что в прочем не меняет смысла), версия 2007, и написал вот такую программу:

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

USART: (прием данных идет все время, пока активен режим, так сказать, на автомате)

  • отправка нескольких HEX чисел, просто пишем их через пробел в неограниченном количестве, например: 01 05 fa aa .
  • отправка строки (текст, числа и т.п.). Тут уже в начале строки пишется идентификатор S (s), например: s www.cxem.net

SPI:

  • для отправки данных устройству формат строки такой: Адрес (кому передавать и в какую ячейку памяти) А (а) и Данные D (d). Например: aa3 dfa;
  • для запроса данных с устройства: Адрес (от кого принимать и из какой ячейки памяти) и идентификатор чтения R (r). Например: aa3 r

I 2 C:

  • для отправки данных устройству: Адрес устройства (бит чтения в 0) А (а) Адрес ячейки памяти M (m) Данные D (d). Например аа2 m03 d15
  • запрос данных выглядит вот так: Адрес устройства (бит чтения в 0) А (а) Адрес ячейки памяти M (m) Адрес устройства (бит чтения в 1) А (а) Идентификатор чтения с количеством ячеек памяти для чтения R (r). Например: aa2 m03 aa3 r1

​Для SPI в режиме Slave никаких команд не предусмотрено, просто сидим и ждем, пока нам что-нибудь пришлют. Для работы с девайсом подключаем его к ПК, ждем некоторое время, пока ОС не сообщит, что драйвера успешно найдены и установлены, запускаем программу и начинаем обмен данными. Все предельно просто, ведь простота и была одним из критериев при создании устройства.

Да, кстати, программа совместима со всеми версиями Windows, начиная с Windows XP и заканчивая Windows 8, и не требует для работы различной экзотики, типа NetFramework и т.п. Как, впрочем, и сам модуль.

Вот, собственно, и все, программа, плата и исходники прилагаются.

Фьюзы выставляются для работы от внешнего кварца с высокой частотой. Выглядят вот так:

На картинке LOW фьюзы в 1, когда не отмечены, и в 0, когда отмечены. HIGH фьюзы наоборот. В шестнадцатеричном виде это выглядит вот так: HIGH: D9, LOW: FF.

Ну и конечно же видео, т.к. лучше один раз увидеть, чем. (USART работает в режиме эхотест (Rx и Tx соединены), а SPI и I 2 C тестируются с микросхемой PCA2129T, статья о ней тут)

Конвертер USB-I2C на ATtiny. Часть 1

Устройство позволяет быстро, легко и дешево присоединить к USB порту вашего ПК практически любую микросхему I 2 C клиента (термо датчики, АЦП, дисплеи, схемы управления реле, и т.д.). Доступны драйверы для Linux, Windows и MacOS.

Этот проект является проектом с открытой документацией. Цель проекта – разработать дешевый универсальный I 2 C интерфейс, подключаемый к USB. Устройство должно быть заменой простых и дешевых адаптеров LPT–I 2 C. Использование USB имеет несколько преимуществ, включая встроенное питание и более современный интерфейс. К тому же, не требуется нагружать процессор ПК битовыми операциями. Для этого устройства требуется даже меньше деталей, чем для некоторых вариантов на основе принтерного порта.

Несмотря на то, что устройство разрабатывалось для и под Linux, оно также работает под Windows и MacOS X. Демонстрационный драйвер и программа для Windows включены в проект, чтобы помочь вам начать использовать устройство как можно быстрее.

Этот проект основан на:

  • Проекте Linux USB и реализации I 2 C в Linux
  • Драйвере и тестовом приложении для Windows, основанных на библиотеке libusb-win32
  • AVR-USB, чисто программной реализации интерфейса USB для платформы AVR
  • USBtiny, другой программной реализации USB для AVR

Железо

Плата прототипа с датчиком температуры DS1621 Готовое устройство в сборе. Добавлен тот же самый датчик

Аппаратная часть устройства сделана на микроконтроллере Atmel AVR ATtiny45. Это дешевый и доступный микроконтроллер с 4 кБ флеш-памяти (из которой 2 кБ заняты программой этого устройства) и 256 байт памяти данных. Микроконтроллер окружен несколькими компонентами.

USB интерфейс

USB интерфейс реализован чисто программно и использует 2 контакта микроконтроллера (PB0 и PB2). Эта программная реализация поддерживает только низкоскоростной USB, о чем компьютеру сообщается с помощью резистора R1.

Интерфейс I 2 C, также программный, основан на побитовом вводе/выводе через обычный порт. Для аппаратного интерфейса TWI контроллера ATtiny45, на котором можно было бы сделать интерфейс I 2 C, пришлось бы использовать выводы, необходимые для работы с USB. Программный интерфейс может оказаться не полностью совместимым с I 2 C, и поэтому некоторые микросхемы – клиенты I 2 C могут не работать с такой шиной. Правда, до сих пор не было обнаружено ни одного несовместимого устройства. В устройстве реализована программно управляемая задержка такта I 2 C, позволяющая конфигурировать тактовую частоту I 2 C. Задержка по умолчанию – 10 мкс. Учитывая другие задержки в коде побитового ввода/вывода, результирующая тактовая частота I 2 C получается около 50 кГц.

Из соображений простоты, вся передача данных по USB выполняется через Control EP (EP0). Так как библиотека AVR-USB поддерживает только медленные USB устройства, она не может использоваться для передачи больших объемов данных, которая возможна только для высоко- и полноскоростых USB устройств. Низкоскоростные устройства поддерживают так называемую передачу по прерываниям, которая ограничена предустановленной шириной канала, в то время как контрольная передача может использовать любую доступную ширину канала.

Читайте также  Лабораторный блок питания 0-30в, 0-2а

Устройство, таким образом, использует передачу control для всех данных. Это требует некоторых дополнительных ограничений, чтобы избежать одновременного доступа к устройству множества драйверов (т.е. драйвера ядра и тестовой программы на основе библиотеки libusb ). Под ОС Linux это достигается выбором соответствующих типов запросов. Этот вид контроля доступа может быть не возможен в других операционных системах.

Потребление энергии

Микроконтроллер и микросхемы клиентов I 2 C (одна или несколько) питаются от линии VBUS интерфейса USB.

Сам адаптер потребляет менее 10 мА и сообщает об этом компьютеру через USB дескрипторы. Устройство также может питать микросхемы – клиенты I 2 C. Но так как эти микросхемы имеют различное потребление тока, невозможно точно включить их потребление в дескрипторы устройства. Вы целиком ответственны за контроль над полным энергопотреблением, и в особенности за тем, чтобы оно не превышало допустимый лимит для USB в 500 мА.

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

Драйвер ядра

Устройство изначально планировалось для использования с Linux. Оно поставляется с драйвером ядра для Linux, который связывает USB и I 2 C подсистемы в ядре Linux. Таким образом, вся установка прозрачна для пользовательских приложений, таких как lm_sensors framework. Специальных драйверов микросхем — клиентов не требуется, так как драйверы, изначально присутствующие в ядре, будут использованы с данным устройством. Т.е., в случае датчика температуры DS1621, установленного на плате прототипа, данные с датчика могут выглядеть так:

Схема и печатная плата

Стабилитроны в схеме необязательны. Они могут потребоваться, если схема будет питаться непосредственно от USB линии VBUS. Линии данных USB (D+ и D-) могут работать только с напряжением 3.3 В. На некоторых компьютерах возникают проблемы при работе с напряжением 5 В. В этом случае может помочь ограничение напряжения до значения не более 3.6 В. В моем прототипе эти диоды отсутствуют, так как мой ПК прекрасно работает с напряжением 5 В на линиях данных USB.

Резистор R1, сопротивлением 2.2 кОм а не 1.5 кОм, по той же причине. Он использовался для подтягивания напряжения к 3.3 В. Нам же необходимо подтянуть выход к 5 В, и сопротивление требуется большее.

Ниже представлена печатная плата. Она состоит только из частей для USB и I 2 C и не содержит микросхемы – клиента I 2 C. Вместо него на плате имеется место для размещения такой микросхемы. Вы можете легко вытравить плату сами. Так как большинство проводников проходит на нижней стороне, подойдет даже односторонняя печатная плата. Понадобится просто сделать 4 недостающих соединения с помощью проводов.

Digitrode

цифровая электроника вычислительная техника встраиваемые системы

  • Вычислительная техника
    • Микроконтроллеры микропроцессоры
    • ПЛИС
    • Мини-ПК
  • Силовая электроника
  • Датчики
  • Интерфейсы
  • Теория
    • Программирование
    • ТАУ и ЦОС
  • Перспективные технологии
    • 3D печать
    • Робототехника
    • Искусственный интеллект
    • Криптовалюты

Чтение RSS

Краткий обзор популярных последовательных интерфейсов (SPI, I2C, UART/USART)

Сравнение последовательных протоколов связи

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

Разница между последовательной и параллельной связью

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

Виды последовательной связи

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

SPI (Serial Peripheral Interface)

Это протокол последовательной связи синхронного типа, который состоит из двух линий данных (MOSI и MISO), одной тактовой линии (SCK) и линии выбора подчиненных (SS).

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

Master (ведущий) — устройство, которое обеспечивает синхронизацию

Slave (ведомый) — устройство, отличное от мастера, использующее тактирование ведущего для связи

MOSI — Master Out Slave In (линия, по которой мастер отправляет данные своим подчиненным)

MISO — Master In Slave Out (линия, по которой ведомые передают ведомому данные в ответ)

SCK – линия тактирования (предоставляется ведущим устройством)

SS — Slave Select (линия, используемая для выбора ведомого устройства, к которому ведущий хочет установить связь)

В случае с SPI в любой момент времени может быть только одно ведущее устройство и несколько других ведомых, которые отвечают только на вызов ведущего. Вся связь обрабатывается самим ведущим; ни один подчиненный не может отправлять данные по своей воле. Ведущий отправляет данные через MOSI, а ведомые отвечают через линию MISO. Во всем процессе SCK (последовательное тактирование) играет очень важную роль, каждое подчиненное устройство зависит от этих часов, чтобы читать данные из MOSI и отвечать через MISO. SS (выбор ведомого) используется для того, чтобы конкретное подчиненное устройство проснулось, с кем мастер хочет общаться. Ниже представлена иллюстрация принципа подключения посредством интерфейса SPI:

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

SPDR (регистр данных SPI) используется для хранения одного байта данных, который должен быть передан или получен.

SPSR (регистр состояния SPI) содержит биты состояния, участвующие в передаче SPI.

SPCR (регистр управления SPI) содержит контрольные биты, участвующие в передаче SPI.

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

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

I2C (Inter-Integrated Circuit) или двухпроводный интерфейс

Другим очень полезным синхронным протоколом последовательной связи является протокол I2C или Inter-Integrated Circuit. В отличие от SPI, I2C использует только два провода для всего процесса, возможно, поэтому он также известен как протокол двухпроводного интерфейса (TWI). Эти два провода представляют собой SDA (последовательные данные) и SCL (последовательное тактирование). Протокол I2C может поддерживать несколько подчиненных устройств, но в отличие от SPI, который поддерживает только одно ведущее устройство, I2C может также поддерживать несколько мастер-устройств. Каждое устройство отправляет / принимает данные, используя только один провод, который является SDA. SCL поддерживает синхронизацию между устройствами через общую систему тактирования, которая реализуется активным ведущим устройством.

Каждое подчиненное устройство имеет свой собственный уникальный адрес (от 7 до 10 бит), который ведущий использует для их идентификации. Всякий раз, когда ведущий хочет отправить данные, он сначала генерирует запрос, который имеет конкретный адрес этого подчиненного устройства. Каждое подчиненное устройство сопоставляет этот адрес со своим и тот, чей адрес соответствует, отвечает ведущему. Каждое сообщение начинается с условия запуска и заканчивается условием остановки. Одно сообщение может содержать несколько байтов данных, каждый из которых имеет бит подтверждения (ACK) или отрицательный бит подтверждения (NACK) между ними.

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

UART / USART

UART означает универсальный асинхронный приемник и передатчик, а USART – универсальный синхронный и асинхронный приемник и передатчик. Разница между ними заключается в том, что UART выполняет только асинхронную последовательную связь, в то время как USART может выполнять как синхронный, так и асинхронный последовательный коммуникационный процесс.

Для асинхронного режима этот протокол использует только два провода, а именно Rx и Tx. Поскольку здесь не нужна синхронизация, оба устройства должны использовать свои независимые внутренние системы тактирования для функционирования. Тем не менее, существует термин «скорость передачи», который помогает этим устройствам оставаться в режиме синхронизации, фиксируя скорость обмена данными. Скорость передачи данных в бодах равно число бит данных, передаваемое в секунду, поэтому оба устройства должны работать с одинаковой скоростью передачи в бодах, чтобы поддерживать его надлежащее функционирование.

Интерфейс UART/USART имеет большое ограничение, связанное с тем, что только два устройства могут обмениваться данными с помощью этого протокола одновременно. Линия Tx одного устройства передает данные на лннию Rx другого устройства и аналогично Tx последнего передает данные в Rx первого устройства. Так происходит обмен данными.

Для синхронного режима используется дополнительный вывод XCK. Импульсы тактирования генерируются устройством, отправляющим данные в это время.

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

Выводы сравнения интерфейсов

Используйте SPI, если у вас есть только один ведущий и несколько ведомых устройств. SPI для этого является более быстрым протоколом. Когда у вас также есть несколько ведущих устройств, помимо нескольких ведомых устройств, следует предпочесть использовать I2C или TWI вместо SPI. Это также уменьшит количество используемых проводов. А если вы ищете протокол для последовательной связи только двух устройств между собой, то USART / UART оказывается лучшим решением, поскольку его легко применять и с ним просто работать во многих периферийных устройствах.

Читайте также  Usb зарядка li-ion аккумуляторов на оу lm358

Адаптер usb to usart, spi и i2c

USB to USART и не только.

Автор: КАШАК, neo-bars@ya.ru
Опубликовано 16.07.2013
Создано при помощи КотоРед.

Все началось с того, что мне надо было подключиться к одному устройству по USART. Я сразу взял спаянный когда-то адаптер USB to UASRT (ибо в ноутбуке COM порт не предусмотрен) на AtTiny2313 (рекламой заниматься не буду, схема легко находится в интернете), подключил, запустил и внезапно понял, что у адаптера фиксированная скорость 9600, а у девайса, к которому требовалось подключиться, скорость 57600. Дело, естественно, было поздним вечером, и купить что-нибудь вроде FT232 возможности не было. Поэтому после непродолжительного почесывания хвостом за ухом, было решено изменить скорость UASRT в адаптере обычной перепрошивкой. В итоге соединение было успешно налажено. Но согласитесь — это ведь не выход, программатора может под рукой не оказаться, да и неудобно каждый раз с прошивкой шаманить. После этого случая я серьезно задумался о создании нормального адаптера, с регулируемой скоростью (и не только).

Конечно, самый простой вариант – купить FT232, но сравнив ее стоимость со стоимостью Mega8, я пришел к выводу, что этот вариант мне не нравится. Поэтому было решено сделать адаптер на МК. А раз он на МК, то делать только USART как-то не рационально. Поэтому неплохо было бы в этот адаптер засунуть еще несколько интерфейсов, если уж делать, то что-то универсальное и полезное. Почти сразу в памяти всплыли “приятные” воспоминания об установке драйверов для адаптера на Tiny2313 (для Windows7 x64 это довольно мучительно). А это значит, что от устройства “виртуальный COM” придется отказаться, следовательно, надо будет написать программу для ПК, иначе работа с устройством будет невозможна. В общем, после обдумывания в течение некоторого времени, сформировалась окончательная идея девайса. Функционал получился вот таким:

  • адаптер USB->USART;
  • адаптер USB->SPI;
  • адаптер USB->I 2 C;
  • при этом устройство должно быть HID (Human Interface Device), чтобы не морочить голову с установкой драйверов.

Объектом издевательств для создания девайса стал МК Mega8, т.к. в TQFP корпусе он занимает совсем мало места (намного меньше, чем AtTiny2313) и обладает целыми 8 Кб. памяти (можно помимо программы адаптера засунуть туда. например бегущий огонек, ну или то-нибудь более полезное). Сначала планировалось сделать все интерфейсы программными, но после разводки платы пришлось отказаться от программного I 2 C, т.к. на односторонней плате вывести его никак не получалось (спасибо создателям этого МК, которые по какой-то причине вывели его сверху, как раз рядом с USART и входом внешних прерываний INT0). Но в будущем все-таки надо будет решить этот вопрос, может отдельно вывести сбоку платы или еще как. Поэтому функциональность I 2 C несколько ограничена, зато USART и SPI остались полнофункциональными.

Схема устройства получилась вот такой:

Как видно, ничего сложного в ней нет. МК питается напряжением 5 В., согласование уровней для USB выполнено при помощи делителей напряжения резистор 68 Ом. + стабилитрон 3.3 В.. Тактовая частота МК – 12 МГц. Это минимальная частота для работы с шиной USB. Так же в схеме присутствуют три светодиода для индикации режимов работы. Один из светодиодов показывает, какй режим работы включен, а два других индицируют прием/передачу данных. Никаких кнопок и переключателей в устройстве не предусмотрено, и все настройки выполняются программно, прямо с ПК. Кроме этого на все выводы, используемые для работы интерфейсов, включены резисторы на 68 Ом. для защиты МК от КЗ. А то перепаивать TQFP копуса не особенно интересное занятие.
Как уже было отмечено выше, устройство представляется ПК как HID и не требует установки драйверов (ОС наивно думает, что работает с устройством ввода). Обеном данными по USB управляет извсетсная многим библиотека V-USB. Она работает как на микроконтроллере, так и на ПК. VID и PID были выбраны из предоставляемых V-USB: VID — 0x16c0 , PID — 0x 05df . В противном случае пришлось бы отдать кругленькую сумму за покупку индивидуального идентификатора для USB устройства, или пользоваться им единолично, не выкладывая на обозрение публики. Но т.к. проект Open Source и некоммерческий, совершенно свободно можно использовать идентификаторы, предложенные V-USB. Все это безобразие собрано на плате размерами 23х34 мм. Выглядит вот так:

А если вытравить ее и немного потыкать паяльником, получится примерно так:

Это была пробная версия устройства, поэтому есть небольшие отличия от чертежа платы, приведенного выше. Дело в том, что я почему-то решил, что вывод SS мне для работы SPI не нужен и не стал его выводить. Как оказалось в последствии я жестоко ошибался, ибо режим Slave без него работать не будет. Ну да ладно, плата исправлена, и все режимы работают нормально.

Итак, со схемой все понятно, он простая до предела и паяется за один вечер. Но, как было сказано выше, получившееся устройство определяется ПК как HID, т.е. ОС подбирает под него драйвер из своей базы. Проще говоря, Windows думает, что работает с устройством ввода. Это делает возможным работу на любом ПК без мороки с драйверами. Но с этим связана одна небольшая проблема, ни одна из существующих программ для обмена данными через USART работать с этим устройством не будет. А значит нужна какая-то специальная программа для работы с модулем, иначе он никакой ценности из себя не представляет. Поэтому я открыл свой любимый C++ Builder (нынче его обозвали CodeGear RAD Studio, что в прочем не меняет смысла), версия 2007, и написал вот такую программу:

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

USART: (прием данных идет все время, пока активен режим, так сказать, на автомате)

  • отправка нескольких HEX чисел, просто пишем их через пробел в неограниченном количестве, например: 01 05 fa aa .
  • отправка строки (текст, числа и т.п.). Тут уже в начале строки пишется идентификатор S (s) , например: s www.cxem.net
  • для отправки данных устройству формат строки такой: Адрес (кому передавать и в какую ячейку памяти) А (а) и Данные D (d) . Например: aa3 dfa
  • для запроса данных с устройства: Адрес (от кого принимать и из какой ячейки памяти) и идентификатор чтения R (r) . Например: aa3 r
  • для отправки данных устройству: Адрес устройства (бит чтения в 0) А (а) Адрес ячейки памяти M (m) Данные D (d) . Например аа2 m03 d15
  • запрос данных выглядит вот так: Адрес устройства (бит чтения в 0) А (а) Адрес ячейки памяти M (m) Адрес устройства (бит чтения в 1) А (а) Идентификатор чтения с количеством ячеек памяти для чтения R (r) . Например: aa2 m03 aa3 r1

Для SPI в режиме Slave никаких команд не предусмотрено, просто сидим и ждем, пока нам что-нибудь пришлют. Для работы с девайсом подключаем его к ПК, ждем некоторое время, пока ОС не сообщит, что драйвера успешно найдены и установлены, запускаем программу и начинаем обмен данными. Все предельно просто, ведь простота и была одним из критериев при создании устройства.

Да, кстати, программа совместима со всеми версиями Windows, начиная с Windows XP и заканчивая Windows 8, и не требует для работы различной экзотики, типа NetFramework и т.п. Как, впрочем, и сам модуль.

Вот, собственно, и все, программа, плата и исходники прилагаются.

Фьюзы выставляются для работы от внешнего кварца с высокой частотой. Выглядят вот так:

На картинке LOW фьюзы в 1, когда не отмечены, и в 0, когда отмечены. HIGH фьюзы наоборот. В шестнадцатеричном виде это выглядит вот так: HIGH: D9 , LOW: FF .

Ну и конечно же видео, а то без него как-то совсем неинтересно получается. (USART работает в режиме эхотест (Rx и Tx соединены), а SPI и I 2 C тестируются с микросхемой RTC PCA2129T, у нее есть и SPI и I 2 C интерфейсы, так что было очень удобно ):

USART, UART, RS232, USB, SPI, I2C, TTL и т. Д. Что все это и как они связаны друг с другом?

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

У меня есть общее представление о том, как все они работают, но я запутываюсь, когда вижу их очень много, и мне трудно понять, как они связаны друг с другом. Например, является ли UART подмножеством USART? В чем разница между RS232 и Serial? Каковы основные различия между всеми этими методами коммуникации: надежность, стоимость, применение, скорость, требования к оборудованию?

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

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

Читайте также  Знаковые целые числа

УАППдля универсального асинхронного приемника-передатчика является одним из наиболее часто используемых последовательных протоколов. Это почти так же старо, как и я, и очень просто. Большинство контроллеров имеют аппаратный UART на борту. Он использует одну линию данных для передачи и одну для приема данных. Чаще всего 8-битные данные передаются следующим образом: 1 стартовый бит (низкий уровень), 8 бит данных и 1 стоповый бит (высокий уровень). Стартовый бит низкого уровня и стоп-бит высокого уровня означают, что всегда есть переход с высокого уровня на низкий, чтобы начать связь. Вот что описывает UART. Нет уровня напряжения, так что вы можете иметь его на уровне 3,3 В или 5 В, в зависимости от того, какой микроконтроллер использует. Обратите внимание, что микроконтроллеры, которые хотят обмениваться данными через UART, должны согласовать скорость передачи, скорость передачи в битах, поскольку у них есть только начальные биты, которые имеют край синхронизации для синхронизации. Это называется асинхронной связью.

Для связи на большие расстояния (это не должно быть сотни метров) 5 В UART не очень надежен, поэтому он преобразуется в более высокое напряжение, обычно +12 В для «0» и -12 В для «» 1″ . Формат данных остается прежним. Тогда у вас есть RS-232 (который вы на самом деле должны называть EIA-232, но никто не делает.)

Временная зависимость является одним из больших недостатков UART, а решение — USART для универсального синхронного / асинхронного приемопередатчика. Это может сделать UART, но также синхронный протокол. В синхронном режиме передаются не только данные, но и часы. С каждым битом тактовый импульс сообщает приемнику, что он должен зафиксировать этот бит. Синхронным протоколам либо требуется более высокая пропускная способность, как в случае манчестерского кодирования, либо дополнительный провод для тактовых импульсов, такой как SPI и I2C.

SPI (Serial Peripheral Interface) — еще один очень простой последовательный протокол. Ведущий посылает тактовый сигнал, и при каждом тактовом импульсе он сдвигает один бит на подчиненный и один бит на вход от подчиненного. Поэтому имена сигналов SCK для часов, MOSI для Master Out Slave In и MISO для Master In Slave Out. Используя сигналы SS (Slave Select), ведущий может управлять более чем одним ведомым на шине. Существует два способа подключения нескольких ведомых устройств к одному ведущему устройству, один из которых упоминался выше, т. Е. Использование ведомого выбора, а другой — последовательное соединение, при этом используется меньше аппаратных выводов (линий выбора), но программное обеспечение усложняется.

I2C(Inter-Integrated Circuit, произносится «I в квадрате C») также является синхронным протоколом, и мы впервые видим, что в нем есть некоторый «интеллект»; другие тупо сдвинули биты внутрь и наружу, вот и все. I2C использует только 2 провода, один для часов (SCL) и один для данных (SDA). Это означает, что ведущий и ведомый отправляют данные по одному и тому же проводу, снова контролируемому ведущим, который создает тактовый сигнал. I2C не использует отдельные ведомые устройства для выбора конкретного устройства, но имеет адресацию. Первый байт, отправленный мастером, содержит 7-битный адрес (так что вы можете использовать 127 устройств на шине) и бит чтения / записи, указывающий, будут ли следующие байты также поступать от мастера или должны поступить от раб. После каждого байта получатель должен отправить «0» для подтверждения приема байта, который мастер фиксирует с 9-м тактовым импульсом. Если мастер хочет записать байт, тот же процесс повторяется: мастер помещает бит за битом в шину и каждый раз выдает тактовый импульс, сигнализирующий, что данные готовы для чтения. Если мастер хочет получить данные, он генерирует только тактовые импульсы. Подчиненное устройство должно позаботиться о том, чтобы следующий бит был готов после подачи тактового импульса. Этот протокол запатентован NXP (ранее Phillips), чтобы сэкономить на стоимости лицензирования, Atmel использует слово TWI (двухпроводный интерфейс), которое точно такое же, как I2C, поэтому любое устройство AVR не будет иметь I2C, но будет иметь TWI. Если мастер хочет получить данные, он генерирует только тактовые импульсы. Подчиненное устройство должно позаботиться о том, чтобы следующий бит был готов после подачи тактового импульса. Этот протокол запатентован NXP (ранее Phillips), чтобы сэкономить на стоимости лицензирования, Atmel использует слово TWI (двухпроводный интерфейс), которое точно такое же, как I2C, поэтому любое устройство AVR не будет иметь I2C, но будет иметь TWI. Если мастер хочет получить данные, он генерирует только тактовые импульсы. Подчиненное устройство должно позаботиться о том, чтобы следующий бит был готов после подачи тактового импульса. Этот протокол запатентован NXP (ранее Phillips), чтобы сэкономить на стоимости лицензирования, Atmel использует слово TWI (двухпроводный интерфейс), которое точно такое же, как I2C, поэтому любое устройство AVR не будет иметь I2C, но будет иметь TWI.

Два или более сигналов на одном и том же проводе могут вызвать конфликты, и у вас возникнет проблема, если одно устройство отправит «1», а другое — «0». Поэтому шина подключена ИЛИ: два резистора поднимают шину на высокий уровень, а устройства посылают только низкие уровни. Если они хотят послать высокий уровень, они просто выпускают автобус.

TTL (Transistor Transistor Logic) не является протоколом. Это более старая технология для цифровой логики, но название часто используется для обозначения напряжения питания 5 В, часто неправильно ссылаясь на то, что следует называть UART.

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

101 применение шлюза UART-to-I2C/SPI/1W (RH-0004). Часть 8. USB программатор микросхем с интерфейсом 1-Wire

Так уж сложилось, что программы для работы через шлюз с I2C и SPI микросхемами сразу были рассчитаны на работу с большим количеством чипов, а если нужно было добавить возможность программировать ещё какую-то микросхему, то я просто расширял функционал этих программ. В то же время ситуация с программированием через шлюз 1-Wire микросхем развивалась иначе, — для каждой конкретной микросхемы я писал отдельную программу.

У такого решения было несколько причин:

  • Во-первых, устройства 1-Wire гораздо сильнее отличаются друг от друга по функционалу и набору команд, чем устройства SPI и I2C.
  • Во-вторых, изначально я полагал, что люди сами будут писать программы для работы со шлюзом, а я только покажу пару примеров. Для этого я полностью открыл API, написал DLL-ку, однако… почему-то не все вокруг оказались программистами (хм, неожиданно).

В общем, в итоге я оказался неправ, люди хотели не писать программы, а пользоваться готовыми. Ну, ок, пусть будет так. Cегодня я представляю вашему вниманию единую программу для работы через шлюз с микросхемами 1-Wire. То есть теперь шлюз RH-0004 можно будет использовать как полноценный USB-программатор различных устройств с интерфейсом 1-Wire.

С точки зрения железа всё стандартно и аналогично USB-программаторам I2C и SPI. Нам понадобится сам шлюз RH-0004 + конвертер USB-to-UART RH-0003. UART-разъём конвертера — это ответная часть UART-разъёма шлюза, поэтому для их соединения вам не придётся ничего изобретать. Конвертер позволяет не только организовать обмен данными между шлюзом и компьютером, но и запитать шлюз (причём любым напряжением: +3,3В или +5В, оба они присутствуют на разъёме конвертера как раз в нужных местах). Всё вместе это выглядит вот так:

Теперь переходим к программной части.

Во-первых, нужно установить на компьютер драйвера для USB-to-UART конвертера. Конвертер сделан на базе чипа cp2102 фирмы silabs, дрова для него (VCP Drivers) можно скачать на их официальном сайте, вот по этой ссылке.

После установки драйверов на USB-to-UART конвертер у вас на компьютере появляется виртуальный com-порт, через который специально написанная программа может общаться со шлюзом. Эта программа сама устанавливает нужный для данного чипа режим 1-Wire и реализует нужные для работы с чипом алгоритмы. Ссылки для скачивания смотрите в конце статьи).

Окно программы показано на картинках ниже.


Работать с программой достаточно просто, — выбираем com-порт, выбираем чип, вводим ROM, подключаемся и можем c этим чипом работать. Либо просто запускаем поиск, который найдёт и отобразит в специальном окне все подключенные к шлюзу устройства 1-Wire, а нам останется только выбрать нужное устройство, щёлкнув по нему правой кнопкой мыши и подтвердив выбор во всплывающем контекстном меню. Для удобства в правом верхнем углу программы отображается схема подключения шлюза к выбранному чипу (к каким ногам что подключать).

Через верхнее меню доступны сохранение / загрузка данных памяти в файлы форматов bin и hex, сохранение логов работы в текстовые файлы, выбор языка (пока только английский и русский). Кроме того, специально добавил возможность ручного ввода ROM, на случай, если вдруг у чипа он окажется нестандартным (я такого ни разу не видел, но пользователи писали, что такое бывает).

Если нужного чипа нет в списке — можно написать на форум или в личку админу (rhf-admin) письмо с указанием того, какой чип вы хотели бы добавить. Если интересно — можете попробовать добавить нужный чип сами, программа выложена с исходниками на C++ Builder.

Протокол 1-Wire подробно описан вот здесь.

Список функций и регистров шлюза можно посмотреть здесь.

Для полнофункциональной работы через шлюз RH-0004 с чипами и ключами, помеченными знаком *, нужно использовать специальную дополнительную схему формирователя импульсов повышенного напряжения, например вот такую.

Архив документации на поддерживаемые программой чипы можно скачать здесь. Для того, чтобы документация на нужный чип открывалась прямо из программы — распакуйте этот архив и поместите папку с документацией (она обязательно должна называться pdf) в папку с программой.