Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: EZ-USB FX3 в режиме ФИФО
Форум разработчиков электроники ELECTRONIX.ru > Сайт и форум > В помощь начинающему
billidean
Добрый день всем.

Пытаюсь запустить обмен ПЛИС с EZ-USB FX3 в режиме синхронного Slave FIFO.
На данный момент добился того, что ПЛИС читает данные из этого ФИФО...но только одни ноли )

Очень нужна помощь опытного пользователя данных типов USB-мостов.

В-общем, я опишу, что и как я сделал, а вы, если в теме, подскажите (плзз), что я делаю не так

1. Из фирменного архива AN65974.zip ввзял примерный проект для настрой GPIF II "GPIFII_Designer_sync_SlaveFIFO.cydsn" и доработал его
следующим образом
Нажмите для просмотра прикрепленного файла

Все флаги имеют активный уровень 1, а инициализацию 0.

2. Полученный после компиляции файл cyfxgpif2config.h копирую в папку с фирменным примером "SlaveFifoSync" из того же архива.
Что там где изменять в проекте под Еклипсом, я не знаю...поэтому просто компилю его.

3. Результирующий файл SlaveFifoSync.img из папки "Release" заливаю в EEPROM платы EZ-USB FX3.

4. Для ПЛИСки написал управление ногами GPIF ФИФО. По циелограмме работы требуется сначал почитать одно слово из ФИФО,
проанализировать его и уже потом продолжить чтение остальных слов из ФИФО.
Когда подключал плату с ПЛИС к плате USB моста, у меня кончились проводнички, поэтому я вынужден был ограничиться
подключением только двух линий ДАННЫХ от ФИФО, поэтому анализировать по SignalTap'у можно только два разряда cy_fd[6] и cy_fd[7].
В-общем, запускаю SignslTap на ПЛИСке, подаю данные на USB-мост, и вижу такую картину

Нажмите для просмотра прикрепленного файла

Нажмите для просмотра прикрепленного файла

...читаются НОЛИ...

По картинке вижу что сначала вычитывается одно слово, затем пауза в один такт, затем читается все остальное.
Тактирование обмена с ФИФО ведет ПЛИС с чатотой около 25 кГц (системную тактовую ПЛИС 50 МГц поделил на 2000...для опытов).

То, что данные вычитываются из ФИФО - это факт. Если данные из ФИФО не вычитываются (если ПЛИС не подключать к ФИФО),
то после нескольких подач данных с компа мост вешается намертво и со стороны компа выдаются ошибки. А с моей прошитой ПЛИСкой мост не зависает при многократных подачах данных.


Кто что может сказать о правильности моих действий?
k155la3
Как чип маркирован ?
На какой линии идет стробирование читаемых байтов ?
Почему CS снимается, он же должен сниматься после чтения пакета из буфера ?
Для упрощения попробуйте сперва запустить асинхронный режим.
ps
Аппаратные линии задания номера FIFO выставляются правильно ?
psps
синхронный режим предполагает кроме стробов RD-WR наличие тактов CLK, которые подаются на FX.
billidean
Цитата(k155la3 @ Nov 9 2017, 20:25) *
Как чип маркирован ?
На какой линии идет стробирование читаемых байтов ?
Почему CS снимается, он же должен сниматься после чтения пакета из буфера ?
Для упрощения попробуйте сперва запустить асинхронный режим.
ps
Аппаратные линии задания номера FIFO выставляются правильно ?
psps
синхронный режим предполагает кроме стробов RD-WR наличие тактов CLK, которые подаются на FX.

Маркировка чипа - CYUSB3014-BZX (или 8ZX - очень плохо читается) CYP 623831
Стробирование по линии PCLK, у чипа она настроена как вход (без этих тактов даже флаг С не изменяется)
CS настроен на активный уровень 0...пробовал его чуть ранее выставлять в 0 и не снимать вообще...никакой разницы.
Номер ФИФО выставлен в "11" (т.е. 3) (с другими номерами никакой реакции чипа не наблюдается)
CLK как писал выше подается на PCLK (25 кГц)

В целом моя циклограмма похожа на те, что приводятся в документации, но результат совсем не тот.

Очень большие подозрения, что нужно что-то сделать с процессором чипа, но что там и как...очень грустно лезть в эти изучения, да и времени уйдет не один месяц (
Очень надеялся, что будет, как с FTDI...настроил в FT_PROG галочки, зашил и забыл про этот чип...только и пиши программы для устройств, использующих его.

Асинхронный режим попробую...но он мне не нужен, в дальнейшем нужна максимально возможная скорость обмена.
k155la3
Я использую FX2 в асинхронном режиме (CY7C68013).
Если есть режим запустите чип в "стандартном" режиме (без GPIF) и асинхронном (стробирование только RD/WR, без CLK)
-------
Помню, на CLK есть ограничение по частоте снизу (и сверху естественно). И нижний предел - не 25 кГц.
Проверьте по DS.
А где на красненькой диаграмме эта линия ? (PCLK)
-------
По воспоминаниям "полетов" с FX2 надо очень внимательно проверять исходник FW.
А именно - конфигурационный файл, в котором есть #def определяющие алгоритм работы чипа.
Одно неловкое движение, и .... sm.gif
billidean
Цитата(k155la3 @ Nov 9 2017, 21:39) *
Я использую FX2 в асинхронном режиме (CY7C68013).
Если есть режим запустите чип в "стандартном" режиме (без GPIF) и асинхронном (стробирование только RD/WR, без CLK)
-------
Помню, на CLK есть ограничение по частоте снизу (и сверху естественно). И нижний предел - не 25 кГц.
Проверьте по DS.
А где на красненькой диаграмме эта линия ? (PCLK)
-------
По воспоминаниям "полетов" с FX2 надо очень внимательно проверять исходник FW.
А именно - конфигурационный файл, в котором есть #def определяющие алгоритм работы чипа.
Одно неловкое движение, и .... sm.gif

Да, кстати про нижний предел тактовой...он 5 МГц! Но я пробовал и на 10-50 МГц - результат примерно тот же.
Про #def'ы спасибо, посмотрю.
На диаграмме тактирование идет самой тактовой PCLK.
k155la3
Вот диаграмма для синхронного чтения CY7. Подобная дб и для Вашего чипа.

ps - это "стандартный" интерфейс, без GPIF.
Если что не идет, я бы запустил в этом режиме, а затем при тойже прошивке FPGA
перешел на GPIF. Далее - доправлять-изменять напильником до требуемой формы.
billidean
Цитата(k155la3 @ Nov 9 2017, 23:02) *
Вот диаграмма для синхронного чтения CY7. Подобная дб и для Вашего чипа.
ps - это "стандартный" интерфейс, без GPIF.
Если что не идет, я бы запустил в этом режиме, а затем при тойже прошивке FPGA
перешел на GPIF. Далее - доправлять-изменять напильником до требуемой формы.


Был очень занят, некогда было пока этим заниматься...
Я не совсем понял, что значит без GPIF? Можете подробнее сказать?
Нажмите для просмотра прикрепленного файла
глядя на эту картинку из даташита, без GPIF никак не получится.
k155la3
FX2 настройка дает возможность использования fifo как отдельного/автономного узла,
со стандартными управляющими линиями (я в этом смысле, "без GPIF"), или же в режиме конфигурирования GPIF.
Посмотрел даташит FX3.
Да, FX3 только GPIF. Но насколько понял, его можно настроить и на стандартное fifo как в FX2
(001-52136_CYUSB301X_CYUSB201X_EZ-USB_R_FX3_SUPERSPEED_USB_CONTROLLER.pdf)

Эта схема один-в-один какую я реализовывал на FX2.
Асихнронный режим в FX3 есть. Если не надо максимизировать пропускную способность, можно использовать его.
А если надо - запустить/отладится на асинхронном, перейти на синхронный.
По крайней мере диаграмма проще и нет ограничения на частоту стробов RD "снизу".
В FX3 это Figure 15/16. Asynchronous Slave FIFO Read/Write Mode.
Проверьте соответствие в FX3 и ПЛИС активных Rais/Fail.
billidean
На днях попробую асинхронный режим (времени вообще нет).
Но в чем меня убивает текущий синхронный режим, так это то, что флаги-то от ФИФО идут какими и должны быть при чтении. Когда данные кончаются, т.е. все вычитаны, то они возвращаются в исходное состояние...но данные = 0.
k155la3
Цитата(billidean @ Nov 13 2017, 22:22) *
.... Когда данные кончаются, т.е. все вычитаны, то они возвращаются в исходное состояние...но данные = 0.

те Вы записываете в fifo, скажем, 10 байт, и "флаговая" линия "фифо пусто" отрабатывает после 10 чтений ?
--
Если испытания проводите на малой тактовой - то это не соответствует требованиям DS (не менее 5 Мег)
Если на допустимой - 5 и более - то чем смотрите аппаратную осцилограмму ?. Там для синх. режима,
обратите внимание на тактирующие стробы, их Raise-Fail, и их привязку на выдаваемые на шину данные,
их задержку относительно CLK. Вообще на лог. анализаторе должно быть сразу видно, где собака порылась.
В качестве данных в фифо заливайте "бегущую единицу". Так будет хорошо виден момент перевыставления
данных по линиям FX3.

Если работу надо сделать-сдать, и скорости асинхронного режима будет достаточно - делайте на нем.
По крайней мере выполните работу и отладите цепочку <софт_PC> <HW/софт_FW3> <HW-"софт" ПЛИС> < XXX >
Если это будет работать - допиливайте до синхронного.
А так может оказаться, что ошибка в софте на PC, а "виновата невестка" sm.gif
А какой лог.анализатор (HW) Вы используете ?



billidean
Цитата(k155la3 @ Nov 14 2017, 12:51) *
те Вы записываете в fifo, скажем, 10 байт, и "флаговая" линия "фифо пусто" отрабатывает после 10 чтений ?

Да, все так и получается...данные типа вычитываются, флаги меняются как надо...но самих данных нет...

Попробовал асинхр. режим...толку ноль.

Здесь самая беда в том, что я почти не понимаю проекты для МК cypress, которые пишутся на эклипсе.
Я не понимаю, где и что надо изменить или добавить, чтобы перевести чип в режим работы СлейвФИФО без вмешательства МК, т.е. в режим AUTO (где-то вычитал, что такое можно).

Огромная просьба поделиться прошивкой для чипа cypress...я просто не могу ничего понять (((

Блинн...........
Что вообще надо этой фигне сделать?????

Все примеры перепробовал...

Про всякие там "длительность управляющих сигналов, синфазность и т.п." рассуждать нет смысла, т.к. в доках все делается просто, на CS подается 0, на OE подается 0, на RD подается 0. На остальные подается 1...всё, чтение сделано.

С другой стороны, если бы данные с компа не записывались в буферы чипа, то флаги не устанавливались бы...и т.д.

ПЛЗЗЗ!!! Памагите люди добрые!!!
toweroff
А кто-то еще на параллельной шине висит на другом CS?
k155la3
Цитата(billidean @ Nov 19 2017, 18:10) *
. . .
Попробовал асинхр. режим...толку ноль.
. . .

Поделиться прошивкой не могу, тк. "немое". Да и сделана она в Keil/FX2 и привязана на inf-конфигурацию, опятьже "немою".
Отличается от примера только парой строк в ассемблерно файле прошивки и-или в опциях поекта.
Пороюсь в архивах, цитаты выложу (для работы в асинхр. режиме).
----
Повторяю свой вопрос, чем смотрите линии данных ? (осцилограф, или что)
Проверьте настройки полярностей, в частности OE.
Если есть возможность - вместо ПЛИС прикрутите на кипариса эмулятор ПЛИСы в виде любого процессора,
который позволяет делать отладку (это если нет нормальных средств чтоб нормально аппаратно мониторить - осцилограф и лог.анализатор). Это всего-то 10 линий подключить (всю шину данных не надо, достаточно 1-4 линии).
Запустить "с лету" такую систему можно если, как предлагается у кипариса, взять 2 ихних кита и сделать кольцевой канал fifo.
Если китов нет (я стартовал без них), то самое оптимальное - это
- Консольное win32 утилита на базе ихней библиотеки
(за основу можно взять ихний исходник, не помню чего, но назывался cydesc)
- собственно fifo
- процессор "клиент/сервер" для fifo.

Вот код тестилки, которую я использовал (для приема).
Код
#include <windows.h>
#include <stdio.h>
#include "cyapi.h"
#include <conio.h>
#include <time.h>

int main()
{
    CCyUSBDevice *USBDevice;
    USB_DEVICE_DESCRIPTOR descr;
    USBDevice = new CCyUSBDevice(NULL);  

    printf("device count = %d \n",USBDevice->DeviceCount());
    for (int i=0; i < USBDevice->DeviceCount(); i++)
    {
        if (USBDevice->Open(i))
        {
            USBDevice->GetDeviceDescriptor(&descr);
            printf("bLength \t\t 0x%02x\n",descr.bLength);
. . . . .
            printf("iSerialNumber \t\t 0x%02x\n",descr.iSerialNumber);
            printf("bNumConfigurations \t 0x%02x\n\n",descr.bNumConfigurations);
            USBDevice->Close();
        }
        else  
         {    printf("unable to open device\n");  
            exit(-1);
         }
    }

  USBDevice->Close();

OVERLAPPED outOvLap, inOvLap;
CCyUSBDevice  *USBDevice1 = new  CCyUSBDevice(NULL);
int n_devices = USBDevice1->DeviceCount();

if ( n_devices <= 0 )
{    printf("\nINFO:  Unable to open device CYPRESS;\n");  
    exit(-1);
}

outOvLap.hEvent  = CreateEvent(NULL, false, false, "CYUSB_OUT");
inOvLap.hEvent   = CreateEvent(NULL, false, false, "CYUSB_IN");

static unsigned char inBuf[100000];
LONG  length = 65000; //128;
ZeroMemory(inBuf, sizeof(inBuf));

clock_t start, stop;
double  duration;

while( !kbhit() )
{
    length = 65000;
    start = clock( );    // метка времени старта цикла опроса
    UCHAR  *inContext = USBDevice1->BulkInEndPt->BeginDataXfer(inBuf, length, &inOvLap);
    USBDevice1->BulkInEndPt->WaitForXfer(&inOvLap,5000);
    USBDevice1->BulkInEndPt->FinishDataXfer(inBuf, length, &inOvLap,inContext);
    stop = clock( );    // метка времени стопа
    duration = (double)(stop - start) / CLOCKS_PER_SEC;
    printf("\nLen = %lu PacketInterval = %02.2f sec", length, duration);
    display_hex( inBuf, 100, "=== Packet In =====");
    ZeroMemory(inBuf, sizeof(inBuf));
    Beep(6000, 10);
}
CloseHandle(outOvLap.hEvent);
CloseHandle(inOvLap.hEvent);
exit(0);
} // main


Update:
В оригинале было так (переключение через установку в опциях компилятора - #defaine)
Код
#ifdef FREE
IFCONFIG = 0x03; // IFCLK Source external (i.e.) connected to MPEG_CLK minimum should be 5 MHz
                 // Synchronous Mode, Free Running MPEG_CLK,  MPEG_VALID is used as SLWR strobe
                 // FX2LP in SLAVE FIFO Mode
SYNCDELAY;
#endif

#ifdef GATED
IFCONFIG = 0xCB; // IFCLK Source internal (i.e.) Gated MPEG_CLK,  MPEG_CLK is connected to SLWR
                 // FX2LP in SLAVE FIFO Mode
SYNCDELAY;
#endif


Чтоб заработало (асинхронный режим) - переделал так (и убрал переключатель)
Код
IFCONFIG = 0xCB; // IFCLK Source internal (i.e.) Gated MPEG_CLK,  MPEG_CLK is connected to SLWR
                 // FX2LP in SLAVE FIFO Mode
SYNCDELAY;

// стробирующие сигналы с активным отрицательным уровнем

// FIFOPINPOLAR = 0x04; // SLWR is configured as active HIGH : Can be changed to 0x00 for SLWR to be active Low
FIFOPINPOLAR = 0x00;
billidean
Цитата
А кто-то еще на параллельной шине висит на другом CS?

Нет, работа будет только с одним девайсом. Я пробовал ставить CS=0 на постоянку.

Цитата
Повторяю свой вопрос, чем смотрите линии данных ? (осцилограф, или что)

Это SignalTap, инструмент отладки прям внутри ПЛИС, встроенный отладчик (анализатор внутренних сигналов проекта ПЛИС).

Цитата
Вот код тестилки, которую я использовал

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

Да я бы понял, если бы вообще не работало ничего, значит косяк СИЛЬНЫЙ в кодах. Но здесь же, когда ПЛИС вычитывает ФИФО, то оно после чтения данных опустошается, количество считываемых данных, после которого ФИФО становится пустым, совпадает с количеством подаваемых с компа данных.

Цитата
В оригинале было так (переключение через установку в опциях компилятора - #defaine)...
Чтоб заработало (асинхронный режим) - переделал так (и убрал переключатель)

Это вы в каких кодах переделывали? Наверное для FX2?
Для FX3 примеры идут под Эклипс. Пробовал найти в этих проектах похожие слова...нашел только такое:
Нажмите для просмотра прикрепленного файла
т.е. типа нет в этих проектах таких макросов...


Нажмите для просмотра прикрепленного файла
Вот автомат состояний FX3 из одного из примеров, который я использовал (из программы GPIF II Designer).

Там видно условие перехода в режим чтения...прям как у меня сделано...
billidean
Сегодня немного продвинулся...получил пару битиков "правильных" данных )))
Но в том-то и дело, что всего лишь пару битов из слова:
Вот, какие данные я подавал:
Нажмите для просмотра прикрепленного файла

И вот, какая циклограмма получилась:
Нажмите для просмотра прикрепленного файла

Сейчас у меня проводками подключены только 4 разряда данных (DQ0..DQ3) и они на картинке cy_fd7..cy_fd4.

4-й и 7-й биты при активации кипариса падают в 0 и не дышат...а два других что-то кажут, но тоже пока не понятно...как-то неуверенно это делают.

Бедаааа.....

Мне бы кто подарил прошивочку бодрую/рабочую на этот cypress crying.gif
k155la3
Цитата(billidean @ Nov 20 2017, 22:00) *
. . . .
Бедаааа.....
Мне бы кто подарил прошивочку бодрую/рабочую на этот cypress crying.gif

Прям Шура Балаганов с его "счастьем" sm.gif
Вы всетаки расталкиваете проект на синхронном режиме.
Тактировка, теперь я понимаю, на верхней "линейке".
То что Вы видите на диаграмме может быть "дезой", по той причине, что там
отображаеся только "логика" изнути ПЛИС привязанная к ейным тактам.
Если частота тактов 25 кГц - как Вы указывали в начале, то работать и не будет, тк это
не соответствует требованиям DS по минимальной частоте - 5 МГц.
Смотрите аппаратно (осцилографом или логическим анализатором) что творится на шине (данных и управления)
Возможно ТАМ все и передается правильно. А так - гадание на черном ящике (и не одном).
Это скорее всего.

--------
То, что в приведенных листингах - это не макросы, а настроечные РЕГИСТРЫ FX2.
Для запуска асинхронного режима - ключевые слова GATED (это как раз макрос)
который "включает" блок кода, обеспечивающий настройку в асинхронный режим.
Поищите по всему проекту этот литерал и наименования упомянутых регистров.
Или шлите проект в личку - посмотрю.

PS
Цитата
Да я бы понял, если бы вообще не работало ничего, значит косяк СИЛЬНЫЙ в кодах. Но здесь же, когда ПЛИС вычитывает ФИФО, то оно после чтения данных опустошается, количество считываемых данных, после которого ФИФО становится пустым, совпадает с количеством подаваемых с компа данных.

Это как раз подтверждает, что фифо свою информацию выдает правильно (каким-то образом как-бы "понимая" чевой он него
хочет ПЛИС). А вот с приемом внутрь ПЛИСа - возможно проблема. Надо провести его психоанализ.
"Вы хотите об этом поговорить .... ?" biggrin.gif
billidean
Тааак...вот, что нарыл еще:
сделал запись тем же самым внутренним анализатором, но записывал на частоте 50 МГц. Т.е. верхняя шкала, это такты частоты 50 МГц.
Нажмите для просмотра прикрепленного файла
Данные должны чередоваться 0xA - 0x5 - 0xA - 0x5... всего 8 слов (четыре Ф, четыре 5)

Два средних бита нормально ставятся, а вот два крайних (страший и младший) какие-то неуверенные. Старший вроде становится в 1, когда должно быть А, но только в самом конце удержания слова и то...на очень короткое время. Хотя может быть это просто наводки с проводов.

Верхний сигнал - это тактовая, которую я подаю на EZ, она 50 МГц деленная на 4. Её я подаю инверсной по отношению к той на которой работает ПЛИСка. Кстати, пробовал и не инверсную подавать - результат тот же.

З.Ы.: лучше пока не становится ((
k155la3
1. проверяйте фазировку тактирующего синлала CLK которая подается на fifo из ПЛИС
2. учитывайте задержки выставления данных на шину fifo относительно тактов (то что на диаграмме в DS)
3. проверяйте момент защелки данных в ПЛИС относительно (1) и (2)
(я на это в верхних постах уже намекал)
4. если 1-2-3 все правильно, то надо смотреть как настраивается fifo - программа инициализации и установки GPIF

ps
Вы серьезно работаете без аппаратного лог. анализатора ?
Не траттье свое время, оно очень дорого. А потраттье 8-10 кваксов, будете иметь отличный инструмент
и решите "проблему" за полдня, а может и за 5 минут.
billidean
Я пока не захватываю данные внутрь ПЛИСки вообще. Пока просто выставляю управляющие сигналы на входы EZ, и снимаю картинку встроенным анализатором прям на ногах ПЛИС (ну почти на ногах, внутри ПЛИС рядом с ногами).
Сегодня снял картинку, тактируя анализатор 150 МГц:
Нажмите для просмотра прикрепленного файла
Можно сказать, что это на ногах EZ.

На EZ с компа записываю все 0хЕЕ, на ногах должно быть:
cy_fd(7) = 0
cy_fd(6) = 1
cy_fd(5) = 1
cy_fd(4) = 1
...но это не получается (


UPD:
Если кто-нибудь сможет разобраться в проекте на эклипсе, будет клёвооо!!!
Нажмите для просмотра прикрепленного файла
k155la3
см. cyfxslfifosync.h (название вроде для синхронного)
а внути
#ifndef _INCLUDED_CYFXSLFIFOASYNC_H_
#define _INCLUDED_CYFXSLFIFOASYNC_H_
billidean
Да, увидел.
Возможно это просто опечатка в названии...
billidean
Спасибо, что помогаете мне a14.gif

Вы еще что-нибудь обнаружили в проекте плохое?
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.