РадиоКот :: Использование микросхемы FT245 для шины USB
Например TDA7294

РадиоКот >Схемы >Цифровые устройства >Примочки к ПК >

Теги статьи: Добавить тег

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

Автор: Юрис Гризанс
Опубликовано 01.11.2011
Создано при помощи КотоРед.

Собирая электронное устройство, в работе которого предусматривается активное участие персонального компьютера, практически невозможно обойтись без шины 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. https://www.ftdichip.com

2.     Internet – FTDI. DLP Modules. https://www.ftdichip.com/Products/Modules/DLPModules.htm

3.     Internet - Подавления дребезга механических контактов. https://www.radioman.ru/teoria/1/mop_drebezg.php

4.     InternetБиблиотека MSDN (по-русски). https://msdn.microsoft.com/ru-ru/library/ms123401

5.     InternetТаблица кодировки символов ASCII. https://arduino.ru/Reference/ASCIIchart

6.     InternetSerial Port Using Visual Basic .NET and Windows. https://www.me.umn.edu/courses/me2011/smartprodcourse/technotes/docs/serial-port-vb.pdf





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


Все вопросы в Форум.


Как вам эта статья?

Заработало ли это устройство у вас?

38 12 9
6 2 2