Перейти к содержанию
    

CYUSB3014 в режиме FIFO

Добрый день, коллеги.

Начал понемногу ковырять CYUSB3014.

Запустил стандартный пример с FIFO из SDK.

Thread 0 на запись, Thread 3 на чтение.

На ПЛИС сделал мост с параллельного интерфейса GPIF2 на AXI4-STREAM.

Сделал loopback со стороны AXI4-STREAM.

Протестировал через C++ Streamer из SDK - все ОК.

Но низкая скорость.

Увеличил DMA_BUF_SIZE до 8, вместо MANUAL каналов DMA поставил AUTO (закомментировал #define MANUAL в примере из SDK).

Получил порядка 97 МБ/с в каждую сторону по 16 бит шине.

Т.е. почти теоретически достижимый максимум.

Однако при увеличении DMA_BUF_SIZE столкнулся с непонятной проблемой.

Если я отправляю через Control Center пакет меньше размера Endpoint (1024 байта), то он появляется на выходе GPIF2 сразу, если больше, то только когда полностью заполнится буфер DMA (8 КБ).

Можно ли как-то сделать так чтобы данные всегда выдавались сразу?

Пробовал ставить в Control Center галочку Pkt Mode - не помогло.

Меньше 1024 байт флаг DMA Ready взводится сразу, больше 1024 байт только когда заполнятся все 8192 байта.

И ещё вопрос.

В примере из SDK только 2 Endpoint.

Можно ли его как-то сконфигурировать на 4 Endpoint тем самым организовать 2 канала передачи данных в каждую сторону вместо одного?

Или придется весь пример переделывать?

Заранее прошу прощения за возможно глупые вопросы, т.к. с USB до этого работал только с FTDI и так глубоко не лез.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

1 hour ago, BSACPLD said:

. . . Можно ли как-то сделать так чтобы данные всегда выдавались сразу?

Пробовал ставить в Control Center галочку Pkt Mode - не помогло. . . . 

По опыту работы с CY7C68013, за принудительную отправку пакета аппаратно отвечает линия PKT_END. (CYPRESS-->PC)

Если идет затяжка в пересылке (PC-->CYPRESS), то там в API/SDK должна быть аналогичная программная ф-ия или настройка.

(принудительная отправка недозаполненного буфера, даже если в нем 1 байт).

Утилита-монитор с IDE может не обеспечивать гибкости и полной функциональности настроек, надо раскуривать soft-API и настройки/устройство чипа.

Сложность в том, что раскуривание-стыковку надо делать синхронно-одновременно и со стороны PC, и со стороны CYPRESS.

Думаю, в данном случае причина - во включении "Auto".  Отключить "Auto" и делать настройки "наразвес в-розницу".

(те писать утилиты-код, в моем случае делалось на Win32API для гибкости и компактности).

IMHO.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

1 hour ago, k155la3 said:

По опыту работы с CY7C68013, за принудительную отправку пакета аппаратно отвечает линия PKT_END. (CYPRESS-->PC)

Это у меня уже сделано.

Вопрос как раз в обратную сторону:

1 hour ago, k155la3 said:

Если идет затяжка в пересылке (PC-->CYPRESS), то там в API/SDK должна быть аналогичная программная ф-ия или настройка.

При беглом просмотре не нашел.

Буду внимательнее смотреть.

1 hour ago, k155la3 said:

Думаю, в данном случае причина - во включении "Auto".  Отключить "Auto" и делать настройки "наразвес в-розницу".

Auto влияет только на скорость.

Изначально было с Manual и логика работы была точно такая же.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

3 hours ago, BSACPLD said:

Буду внимательнее смотреть. . . . 

Я отлаживал режимы компилируя самописные утилиты Win32/console/MSVS2008.CPP (на базе примеров), отлаженный код встраивал потом в программу. Пришлось к томуже перекомпилировать fw чипа для установки кажется, режима синхронный/асинхронный (для СУ7С68013).

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

On 5/29/2022 at 2:32 PM, BSACPLD said:

При беглом просмотре не нашел.

Буду внимательнее смотреть.

Просмотрел всю библиотеку libcyusb.cpp из SDK для Linux.

Нигде не нашел как принудительно отправить пакет на выход CYUSB3014 если буфер заполнен не до конца.

Да и сама библиотека это просто обертка поверх стандартной libusb.

Там только вызов libusb_bulk_transfer и больше ничего относящегося к отправке данных нет.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Удалось победить отправку неполного буфера :)

Вместо одного большого буфера 8 КБ поставил 8 буферов по 1 КБ каждый (размер endpoint) и отправка пакетов произвольной длинны заработала автоматически.

Теперь у меня следующий вопрос.

В каком месте нужно править пример Slave FIFO от Cypress чтобы сделать многоканальный FIFO?

Т.е. сделать с разделением потоков данных на два endpoint в каждую сторону вместо одного endpoint как сейчас.

И чтобы выбирать нужный канал через линии ADDRx.

Правильно ли я понимаю, что заменить CyU3PDmaChannelCreate на CyU3PDmaMultiChannelCreate при настройке endpoint недостаточно чтобы сделать многоканальный FIFO?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...