Jump to content

    

CYUSB3014 в режиме FIFO

Recommended Posts

BSACPLD

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

Начал понемногу ковырять 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 и так глубоко не лез.

Share this post


Link to post
Share on other sites

k155la3
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.

Share this post


Link to post
Share on other sites

BSACPLD
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 и логика работы была точно такая же.

Share this post


Link to post
Share on other sites

k155la3
3 hours ago, BSACPLD said:

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

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

 

Share this post


Link to post
Share on other sites

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

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

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

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

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

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

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

Share this post


Link to post
Share on other sites

BSACPLD

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

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

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

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

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

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

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

Share this post


Link to post
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.