Реклама на сайте | Помощь сайту   English version | Datasheets 
KAZUS.RU - Электронный портал. Принципиальные схемы, Datasheets, Форум по электронике

Использование микросхемы FT245 для шины USB

Использование микросхемы FT245 для шины USB



Раздел: Интерфейсы

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

Во времена, когда я собирал свою первую приставку к РС, в любительских конструкциях царствовал последовательный порт RS232 и с помощью вставок из ассемблерного кода в программах легко реализовывался примитивный драйвер. Ситуация изменилась – на ноутбуках только USB, а „глумиться“ над регистрами операционная система не позволит (имеется в виду Windows2000 и выше).

Для отработки технологии я составил простую схему (нажмите на картинку для ее увеличения) которая выполняет две функции: после нажатия кнопки отправляет в компьютер однобайтное число (которое компьютер отображает на экране); в свою очередь присланное число из компьютера выводит в двоичной форме на встроенный дискретный индикатор. 

 

Не надо обращать внимание на ромбики в схеме (один нарисован у резонатора, другой – у выводов питания микроконтроллера) – это особенность программы KiCAD, которая имеет чисто условное значение. Чтобы не дергать микросхему из макетной платы, предусмотрено внутрисхемное программирование. В таком случае между выводами микроконтроллера (RB6 и RB7, к которым подключается программатор) и остальной схемой необходим разместить разделяющие резисторы (на схеме R1 и R2). Все устройство удобно размещается на макетной плате.

 

Для решения проблемы связи с РС я когда-то выбрал продукцию фирмы FTDI [1]. Не буду утверждать, что и сейчас это лучший вариант, но просто необходимости нового поиска у меня пока не возникало. Для экспериментов взял модуль DLP USB245M [2]. Это старый модуль, но перед более новым у него есть одно преимущество – выводы шины данных расположены рядом, один за другим. Сильно упрощенная структура модуля выглядит следующим образом. 
 

 

Все данные проходят по общей шине. Используются также два управляющих (WR и RD) и два сигнализирующих сигнала (TXE и RXF). 

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

Если в буфере приема есть хотя бы один байт, то для его считывания необходимо переключить сигнал RD с лог.1 в лог.0. Тогда один байт выведется на выводы шины данных. Для отправки данных в компьютер необходимо выставить байт на выводах шины и переключить сигнал WR с лог.1 в лог.0. В алгоритме работы программы, которая сначала принимает байт из компьютера (если есть), а затем передает туда сама, SB1 – кнопка (если кнопка нажата, то SB1=1 ).

 


Текст программы приведен в приложении. Надо отметить, что для уменьшения объема текста проигнорированы некоторые особенности конструкции. Во-первых, при нажатии кнопки клавиатурного типа происходит дребезг контактов [3], в результате чего микроконтроллер получает не один импульс, а несколько десятков. Во-вторых, пока кнопка нажата программа успеет пройти весь цикл тысячи раз. В результате всего этого при однократном нажатии кнопки компьютер получит не один байт, а несколько тысяч. Это довольно просто устраняется программным путем, но так как сейчас это не принципиально, я не стал усложнять программу.

На первых порах даже нет необходимости писать собственную программу для компьютера – можно использовать стандартные для работы с последовательным портом. Могу порекомендовать две: „DLP Test“ от фирмы FTDI и программу стороннего автора „RH_com“.

 

Для "DLP Test" следует использовать следующую последовательность работы: 1) в окне „Select Driver“ выбрать пункт „VCP“; 2) в окне „Port“ установить нужный номер (если все правильно, то рядом появится надпись „Port Ready“). Все, устройство подключено. Одно замечание – перед тем как отправить число в Ваше устройство, не забудьте установить номер конкретного байта в окне „Xmit“ (фактически, в окошках „Send To target“ записываются возможные варианты чисел и именно „Xmit“ указывает какой конкретно байт будет использован). 

Теперь вторая половина – компьютер. Для программирования использовалась среда Microsoft Visual Basic 2008 Express Edition. Если используется операционная система Windows7, то при первом подключении USB модуля компьютер сам поставит драйвер эмулирующий СОМ-порт. В противном случае необходимо скачать драйвер с сайта производителя или его представителей. 

 


 

Для использования последовательного порта его с начала необходимо открыть. Один из вариантов подробно описан в русскоязычной версии MSDN [4]. Ниже приведен текст, оформленный в виде самостоятельной подпрограммы, которая открывает порт, записывает байт в порт и закрывает его. Вызов подпрограммы осуществляется командой SendSerialData(32), где 32 – число, которое необходимо отправить в порт. 

"ПЕРВЫЙ ВАРИАНТ" инициализации последовательного порта 
     Sub SendSerialData(ByVal cifra As Integer) " Отправляет в порт значение переменной "cifra" (при вызове подпрограммы указывается в скобках)
         Dim cifra2(1) As Byte " Описывается массив
         " Открывается порт и указываются параметры его работы
        Using SelectedPort As IO.Ports.SerialPort = My.Computer.Ports.OpenSerialPort("COM3", 9600, IO.Ports.Parity.None, 8, IO.Ports.StopBits.One)
             SelectedPort.WriteTimeout = 3000
             cifra2(0) = cifra
             SelectedPort.Write(cifra2, 0, 1) " В порт отправляется байт данных (из массива "cifra2" ; смещение 0 (от нулевого байта); один байт)
             SelectedPort.Close() " Порт закрывается
         End Using
     End Sub

Необходимо немного подробнее рассмотреть команду “SelectedPort.Write “. Если написать просто SelectedPort.Write(cifra), то в порт уйдет номер символа из таблицы кодировки (например, вместо числа 32 программа отправит код символа «3»). Причем по-умолчанию используется 7-ми битная таблица ASCII – максимальный код 127 [5].
В подпрограмме считывания данных из внешнего модуля я применил немного другой способ, который отлично описывается в [6] (хотя, в принципе, разница там микроскопическая). Надо принимать во внимание, что компьютер примет только те байты, которые были отправлены микроконтроллером в USB-модуль уже после открытия порта, все остальные он проигнорирует (для данной программы это означает, что сначала надо нажать виртуальную кнопку „Загрузка“, а потом кнопку микроконтроллера).

Литература:

1. Internet – FTDI. http://www.ftdichip.com 
2. Internet – FTDI. DLP Modules. http://www.ftdichip.com/Products/Modules/DLPModules.htm
3. Internet - Подавления дребезга механических контактов. http://www.radioman.ru/teoria/1/mop_drebezg.php
4. Internet – Библиотека MSDN (по-русски). http://msdn.microsoft.com/ru-ru/library/ms123401
5. Internet – Таблица кодировки символов ASCII. http://arduino.ru/Reference/ASCIIchart
6. Internet – Serial Port Using Visual Basic .NET and Windows. http://www.me.umn.edu/courses/me2011/smartprodcourse/technotes/docs/serial-port-vb.pdf

Файлы в архиве

  • Ассемблерная программа для МК
  • Весь проект в Visual Basic 

Сертификация средств измерений http://proryvnpp.ru/stati/trebovaniya-ems/. || roxtec аналог || коническая зубчатая передача с круговым зубом
 © 2003—2017 «Электронный портал»Обр@тная связь