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

Zynq USB. Проблема с BulkIn

Добрый день!

Только начинаю осваивать Zynq. Пытаюсь запустить USB Device на плате MYIR Z-turn board (xc7z020, usb phy USB3320) в baremetal. Сгенерировал BSP, в качестве основы для проекта использовал поставляемую библиотеку xusbps и пример работы с ней xusbps_intr_example.c. На этом этапе вроде все нормально. Затем в этом примере подправил дескрипторы под стандартные от Cypress и пытаюсь работать с устройством из Cypress Control Center. Передача по BulkOut (из ПК в Zynq) работает нормально. С передачей BulkIn возникли вопросы, которые решить пока не получилось. Вкратце, что я пытаюсь делать: после инициализации и ренумерации USB посылаю по BulkOut посылку, которая служит сигналом для начала передачи из Zynq в ПК по BulkIn. Со стороны ПК из Cypress Control Center начинаю инициировать чтение единичных пакетов по BulkIn. До какого-то момента такие передачи проходят, затем возникает исключение - отсутствие ответа на BulkIn-запрос от ПК. Количество успешно переданных пакетов до возникновения ошибки случайно. Вопрос - что я делаю не так? Как правильно работать с библиотекой xusbps? На первый взгляд все что в ней написано - правильно и соответствует документации Zynq TRM(ug585). После того как попали в ошибочное состояние соответствующий дескриптор dTD находится в активном состоянии (т.е. выполнена запись в регистр XUSBPS_EPRIME_OFFSET и мы "отдали" железу этот дескриптор), но передача не проходит. Есть подозрение, что это может быть связано с неправильной работой  с кэшем. В приложении - код с которым работаю. По сравнению с оригиналом изменил настройки enpoint1 в main, основной цикл в main и обработчик Ep1EventHandler.

Мои настройки Endpoint1

	DeviceConfig.EpCfg[1].Out.Type		= XUSBPS_EP_TYPE_BULK;
	DeviceConfig.EpCfg[1].Out.NumBufs	= 2;//16;
	DeviceConfig.EpCfg[1].Out.BufSize	= 64;//512;
	DeviceConfig.EpCfg[1].Out.MaxPacketSize	= 512;
	DeviceConfig.EpCfg[1].In.Type		= XUSBPS_EP_TYPE_BULK;
	DeviceConfig.EpCfg[1].In.NumBufs	= 1;//16;
	DeviceConfig.EpCfg[1].In.MaxPacketSize	= 64;//512;

Новый основной цикл

	XUsbPs_EpIn	*Ep1In;
	Ep1In = &UsbInstancePtr->DeviceConfig.Ep[1].In;
	while (NumReceivedFrames < 1) //There was no errors
	{ 
		if (flagRcv == 1) // Ep1 BulkIn operations are enabled
		{
			//XUsbPs_dTDInvalidateCache(Ep1In->dTDHead);
			if (!XUsbPs_dTDIsActive(Ep1In->dTDHead))
			{
				memset(sendBuf1,cnt,64);
				Status = XUsbPs_EpBufferSend(UsbInstancePtr, 1,	sendBuf1, 64);
				cnt++;
			}
		}
	}

 

xusbps_intr_example.c

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


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

С ходу получилось около 8Мбайт/с. Но за скоростью пока не гонюсь, хочу получить стабильную работу. После этого можно будет и пооптимизировать.

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


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

6 minutes ago, Alex_AZ said:

С ходу получилось около 8Мбайт/с. Но за скоростью пока не гонюсь, хочу получить стабильную работу. После этого можно будет и пооптимизировать.

Спасибо

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


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

Забыл сразу написать, но может кому-то пригодится. Все заработало нормально после замены кабеля USB. Причем сбоил тот, который шел в комплекте с платой :-) Со штатным драйвером скорость bulk out удалось получить на уровне 10МБ/с, bulk in - 8..9 МБ/с. Думается, что скорость можно еще увеличить, если переписать драйвер под собственное применение без проверок на ошибки.

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


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

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

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

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

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

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

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

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

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

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