roboforum.ru

Технический форум по робототехнике.

FT245 + D2xx

Re: FT245 + D2xx

Dmitry__ » 10 июн 2013, 14:40

Madf писал(а):Последовательные интерфейсы не подходят как раз в силу ограниченности в скорости МК, я не зря остановился на 245 чипе (из-за параллельности).

Так компьютер же их видит одинаково. Гы, меня это натолкнуло на мысль, проверил :)
Ткнул модуль DLP-USB245M (который безуспешно грыз давно), в вендах конфликт драйверов: "D2XX Recovery PID for XP". Помню, что существует какая-то утилита для перезаписи епром, mprog? Ну да ладна...
Нашел альтеровский кит "MAX II Development Kit", в ней стоит ft245bl, венды определяют как "USB Serial port (COM11)". Это радует. Попробую перепаять ft245 на dlp, если заработает, значит я сам себе буратино :)

Re: FT245 + D2xx

Madf » 10 июн 2013, 15:38

У меня ща устройство сделано чисто под тесты. Саму производительность меряю на стороне компа.
Устройство ждет входную команду "start" + &H0D, как только эта команда приходит, то оно начинает отправку данных 1МБ (1048576 байт), комп принимает их и дальше оценивает скорость передачи... Есть так же команда "stop" + &H0D, чтобы останавливать отправку данных.
Данные отправляются по заполнению 0 - 255 значений, по кругу.
Если есть желание, то можно объединить усилия... ;)

Добавлено спустя 1 минуту 59 секунд:
Устройство у меня весит на COM2, но если использовать D2xx драйвер, то цепляется по имени "FT245R USB Parallel FIFO".

зы: железо вроде настроил "FT_Prog" (прошивалка чипа).

Re: FT245 + D2xx

AndreiSk » 10 июн 2013, 16:48

код на стороне МК покажи тогда чтоли.. может там грабля какая.
Как инициализируешь, как отправляешь.
И покажи как инициализируешь d2xx на vb6
Я сравню со своим...

Re: FT245 + D2xx

Madf » 10 июн 2013, 17:09

Почему грабля в коде МК, если MSCOMM через VCP работает без проблем? :crazy: Я даже стартовать прием не могу, грабля явно в D2хх, код такой на компе (пока всё сумбурно, лишь бы задышало):

Код: Выделить всёРазвернуть
Dim lpszBuffer As String
Dim lngBufferSize As Long
Dim lngBytesReturned As Long
Dim lngBytesWritten As Long
Dim lngBytesToRead As Long

    Dim MyArray(6) As Byte
   
    If FT_OpenEx("FT245R USB Parallel FIFO", FT_OPEN_BY_DESCRIPTION, lngHandle) = FT_OK Then
        LoggerList.AddItem "Open OK"
    Else
        LoggerList.AddItem "Open Failed"
        'Exit Sub
    End If
    ' --------------------------------------------------------
    MyArray(1) = Asc("s")
    MyArray(2) = Asc("t")
    MyArray(3) = Asc("a")
    MyArray(4) = Asc("r")
    MyArray(5) = Asc("t")
    MyArray(6) = &HD
    If FT_WriteByte(lngHandle, MyArray(1), UBound(MyArray), lngBytesWritten) = FT_OK Then
        LoggerList.AddItem "WriteByte OK"
    Else
        LoggerList.AddItem "WriteByte Failed status=" & ftstatus
        'Exit Sub
    End If
    ' --------------------------------------------------------
lpszBuffer = ""

For f = 1 To 200
   If FT_GetQueueStatus(lngHandle, lngBytesToRead) = FT_OK Then
       LoggerList.AddItem "GetQueueStatus OK"
   Else
       LoggerList.AddItem "GetQueueStatus Failed"
       'Exit Sub
   End If
   If lngBytesToRead > 0 Then Exit For
Next f

LoggerList.AddItem "In buffer:" + Str(lngBytesToRead) + " Byte var."

lngBufferSize = lngBytesToRead

If FT_Read(lngHandle, lpszBuffer, lngBufferSize, lngBytesReturned) = FT_OK Then
    LoggerList.AddItem "Read OK"
Else
    LoggerList.AddItem "Read Failed"
    'Exit Sub
End If

If lpszBuffer <> "" Then Text1.Text = lpszBuffer
LoggerList.AddItem "lpszbuffer= " + lpszBuffer + " buffersize=" + Str(lngBufferSize) + " bytesreturned=" + Str(lngBytesReturned)
    ' --------------------------------------------------------
    If FT_Close(lngHandle) = FT_OK Then
        LoggerList.AddItem "Closed OK"
    Else
        LoggerList.AddItem "Close Failed"
        Exit Sub
    End If


FT_WriteByte - работает, данные/команда отправляется.
FT_GetQueueStatus - информация о буфере приходит, длина определяется (наличие данных).
FT_Read - не возвращает буфер (сама операция проходит успешно).

зы: "D2XX_Module" размещать?

Re: FT245 + D2xx

AndreiSk » 10 июн 2013, 17:35

If FT_Read(lngHandle, lpszBuffer, <- по идее сюда надо байтовый массив, а не строку...
MyArray2 попробуй, только сделай ему
Dim MyArray2(8191) As Byte

Re: FT245 + D2xx

Madf » 10 июн 2013, 17:44

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

Код: Выделить всёРазвернуть
Public Declare Function FT_Read Lib "FTD2XX.DLL" (ByVal lngHandle As Long, ByVal lpszBuffer As String, ByVal lngBufferSize As Long, ByRef lngBytesReturned As Long) As Long


Есть у меня предположение, что перед считыванием данных надо может нормально указать скорость считывания из буфера (баундрейт) и с переменной "lngBytesReturned" непонятно..?

Re: FT245 + D2xx

AndreiSk » 10 июн 2013, 17:55

а что возвращает lngBytesReturned ?

Re: FT245 + D2xx

Dmitry__ » 10 июн 2013, 18:12

Ужос, оживил свой dlp модуль, спасибо тебе Madf за убитый день :crazy:
А 10 лет назад не смог его запустить :)
Оказалось, что какая-то древняя программа типа FTXPRCVR.exe поменяла pid с 6001 на 6006. После чего драйвер отказывался вставать на этот модуль. В файле ftdiport.inf поменял все PID_6001 на PID_6006, после чего драйвер увидел модуль. А потом MProg-ом поменял pid устройства на 6001.
Madf писал(а):Почему грабля в коде МК, если MSCOMM через VCP работает без проблем?

У тебя и прием и передача работает через VCP?

Re: FT245 + D2xx

Madf » 10 июн 2013, 22:28

Через VCP у меня всё работает. В семерке винде автоматом стоит драйвер VCP под обычный последовательный порт и всё прекрасно работает через MSCOMM (могу даже видюшку снять :D ).

(не, странное у меня чувство возникает, что меня никто не слышит, наверное надо ещё раз повторить, может непонятно пишу)
Через стандартный обмен (MSCOMM/VCP (в дровах галка стоит по умолчанию)) - всё работает (раз удалось даже скорость померить обмена). Через API напрямую пытаться работать с VCP не стал (даже в голову не приходило, ибо хочется попробовать возможности от самого производителя FTDI).
Пытаюсь тоже самое сделать через D2xx - работает только отправка данных, приём - нет.

AndreiSk, ща ещё поиграюсь с новыми идеями и отпишу...

Добавлено спустя 38 минут 45 секунд:
lngBytesReturned - возвращает 0.
lngBufferSize - сегодня возвращает 65536 (вчера вроде больше 4096 не поднималась).
Вместо "lpszBuffer" строковой пробовал создавать массив - он весь равен 0 (пустой). Естественно 8191 создать не удалось (крашится всё).

Добавлено спустя 39 минут 29 секунд:
Аааааааааа!!! Получилось хоть что-то!!! И так:

lngBytesReturned - возвращает значение принятых данных, т.е. если "lngBufferSize" равен каком-нить числу (данных в буфере), то "lngBytesReturned" итоговый результат операции. Видимо это нужно для защиты от ошибок, видимо могут данные не все прилететь...
Далее...
Вместо "FT_Read" решил использовать "FT_ReadByte" и всё заработало!
FT_ReadByte - работает с массивами (работает).
FT_Read - работает с строками (чот не работает).
С командами: FT_WriteByte и FT_Write - нет проблем, работают как заявлено (массив и строки).

Уже какой-то прогресс..)

Добавлено спустя 1 час 52 минуты 17 секунд:
Хех, результат что-то не принципиально отличающийся:

d2xx.gif
d2xx.gif (10.11 КиБ) Просмотров: 4777

И это на макс настройке драйверов (FT_SetBaudRate): 3 000 000 и как после этого можно верить доке? :( Правда у меня шлейф проводов весит, возможно если плату красиво сделать, то скорость повысится, но это далеко не 12Мбит.

Единственный плюс, который вижу у D2xx - это привязка к устройству по имени, очень упрощает всё..

Re: FT245 + D2xx

Dmitry__ » 10 июн 2013, 22:40

Проверь мои функции на API, работай только с буферами. Говорю же, 960кбит/с работает на vcp. Это как с графикой работать, если будешь рисовать картинку точками, то умрешь, а если через апи функции, то можно на vb6 мультики рисовать

Re: FT245 + D2xx

Duhas » 10 июн 2013, 22:47

у него килобайты.. а не килобиты..

Re: FT245 + D2xx

AndreiSk » 10 июн 2013, 23:01

давай код на стороне МК, как отсылваешь данные... грабля там валяется походу... :roll:

Re: FT245 + D2xx

Madf » 11 июн 2013, 00:07

код на отправку весьма примитивный:

Код: Выделить всёРазвернуть
Dim Ptmp1 As Byte
Dim Pbuff_flag As Bit
Dim Pbuff_s As String * 10
Dim Pbuff_b(11) As Byte At Pbuff_s Overlay
Dim Pbuff_pos As Byte

Dim Pw_counter As Dword
Dim Pw_counter_byte As Byte At Pw_counter + 0 Overlay
Dim Pw_flag As Bit
Reset Pw_flag

Reset Pbuff_flag
Pbuff_s = ""
Pbuff_pos = 1

Disable Interrupts

Do
   Gosub P_read
   If Pbuff_flag = 1 Then
      If Pbuff_s = "led" Then Toggle Led
      If Pbuff_s = "start" Then
         Set Pw_flag
         Pw_counter = 1048575                               ' количество байт отправляемых данных
      End If
      If Pbuff_s = "stop" Then
         Reset Pw_flag
      End If

      ' очистка/подготовка буфера к приёму
      Reset Pbuff_flag
      Pbuff_s = ""
      Pbuff_pos = 1
   End If

   If Pw_flag = 1 Then
      Gosub P_write
   End If
Loop
End

P_read:
   If P_rxf = 0 Then
      Ddra = 0                                              ' порта на вход/приём
      ...
      ...
   End If
Return

P_write:
   If P_txe = 0 Then
      Ddra = 255                                            ' порт на выход/отправка

      Porta = Pw_counter_byte                               ' отправка байта в USB
      Reset P_wr

      If Pw_counter = 0 Then                                ' отправляется даже 0
         Reset Pw_flag                                      ' всё передали, останавливаемся
      Else
         Decr Pw_counter
      End If
      Set P_wr
   End If
Return

И это всё крутится на XMega32A4 (32MHz).
Максимум можно оптимизировать переключалку порта, чтобы по умолчанию всегда был выход, но это капьё.

Добавлено спустя 4 минуты 14 секунд:
Dmitry__ писал(а):Проверь мои функции на API, работай только с буферами. Говорю же, 960кбит/с работает на vcp. Это как с графикой работать, если будешь рисовать картинку точками, то умрешь, а если через апи функции, то можно на vb6 мультики рисовать

У меня нет понятия киллобит, есть только БАЙТ, 280 КиллоБайт - это можно преобразовать в киллобиты (умножив как минимум на 10), получаем 2800Кбит/сек.
1 МегаБайт отправляется около 3.7 секунд, мне нужно (в идеале) сократить это время в 3 раза. :oops:

Re: FT245 + D2xx

Dmitry__ » 11 июн 2013, 00:38

Блин, я угораю с вас. Спасибо кэпы :)
Кидай свой ехешник для тестирования скорости.

Re: FT245 + D2xx

Madf » 11 июн 2013, 11:33

А зачем тебе exe-ник? Он привязан к моему устройству по имени, гибкую систему с выбором устройства - не делал. Как будешь подцепляться? Выложил (D2xx.zip), но он возможно потребует библиотеку VB-ую (если офиса не стоит) и дрова D2xx..

Сегодня утром не удержался перед работой и глянул на осциллографе:

t245.gif
t245.gif (4.04 КиБ) Просмотров: 4673

Из картины видно, что МК легко "ддос"-ит FT245 и она перегружена, раз TXE находится всегда не в 0 и принимает всё только по 1 байту (внутренний буфер переполнен), комп не успевает принимать данные. Т.ч. проблема в связке PC+FT245.

зы: кстати D2xx принимает данные по 64К, но этого не достаточно, возможно упирается всё в язык/код с стороны компа, кто бы на Сии попробовал такое за бацать, может быстрее бы вышло...

Добавлено спустя 8 минут 17 секунд:
Забыл добавить: в D2xx.exe запуск осуществляется правой кнопкой "V1+", кнопка "led", это чтобы у меня светодиодом можно было поморгать на плате, левая самая кнопка "ListDev" выводит список девайсов, которые есть в системе и их видит или нет.
Запускать тест для верности надо пару тройку раз (кнопкой "V1+").

И не спрашивай почему "V1+" кнопка называется. :D Это всё чисто "рабочий/сырой" материал..
Вложения
D2xx.zip
(8.03 КиБ) Скачиваний: 0


Rambler\'s Top100 Mail.ru counter