FTDI FT2232H Ускорение обмена по SPI (удаление задержки в 2 ms).

 

Наткнулся на статью РЕАЛИЗАЦИЯ SPI С ПОМОЩЬЮ МИКРОСХЕМ ФИРМЫ FTDI в которой автор

рассказывает о том, что библиотека libMPSSE.dll содержит следующею особенность.

Перед тем как поднять сигнал CS, библиотека делает задержку в 2 мс frown, цитирую:

 

В оригинальной библиотеке в режиме SPI после того, как закончилась передача данных и деактивируется сигнал выбора ведомого CS, присутствует задержка около 2 мс. Это сделано разработчиками библиотеки libMPSSE.dll намеренно для исключения возможных проблем при сопряжении с медленными устройствами.

 

В одном из проектов, обмен между ПК и ПЛИС осуществлялся по SPI.

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

Данная пауза явно ограничивала скорость обмена, но в тот момент причина была не известна и пришлось

пользоваться тем что есть.

Библиотека libMPSSE.dll доступна в виде бинарника, а также в виде исходников.

Остается найти нужное место и внести изменения.

Итак, изучив исходники в коде библиотеки была обнаружена задержка в 2 мс.

 

В файле ftdi_spi.c есть функция SPI_ToggleCS

 

Оригинальный файл:

FT_STATUS SPI_ToggleCS(FT_HANDLE handle, bool state)
{
	ChannelConfig *config=NULL;
	bool activeLow;
	FT_STATUS status=FT_OTHER_ERROR;
	uint8 buffer[5];
	uint32 i=0;
	uint32 noOfBytesTransferred;
	uint8 value, oldValue, direction;

	FN_ENTER;
	if(!state)
	{
		INFRA_SLEEP(2);
	}

INFRA_SLEEP(2); - это и есть задержка, в виде макроса.

Закоментируем данный участок кода и пере собираем библиотеку.

 

Изменения:

FT_STATUS SPI_ToggleCS(FT_HANDLE handle, bool state)
{
	ChannelConfig *config=NULL;
	bool activeLow;
	FT_STATUS status=FT_OTHER_ERROR;
	uint8 buffer[5];
	uint32 i=0;
	uint32 noOfBytesTransferred;
	uint8 value, oldValue, direction;

	FN_ENTER;
//	if(!state)
//	{
//		INFRA_SLEEP(2);
//	}

 

Применяемая библиотека LibMPSSE-SPI_source.zip версии 0.41 устарела сейчас доступна более свежая,

версии 0.6, но в ней также присутствует данная задержка...

 

Сборка библиотеки под Windows 7 (64).

 

Сборка осуществляется при помощи компилятора mingw, который можно поставить отдельно, если еще

не установлен. После установки компилятора, необходимо прописать пути к компилятору в PATH.

В проекте используется 32 разрядная версия DLL, поэтому библиотеку нужно собирать 32 разрядной

версией mingw или указать компилятору для какой системы собираем (32 vs 64)...

Сборка осуществляется запуском командного файла

\LibMPSSE-SPI_source\LibMPSSE-SPI\LibMPSSE\Build\Windows\b.bat

Готовая DLL будет находится тут же.

 

Тест скорости обмена.

 

Предыдущая версия (с задержкой 2 мс) скорость 67 КБ/сек.

Новая версия (без задержки 2 мс) скорость 342 КБ/сек.

Разница 342 / 67 = 5.

Скорость выросла в 5 раз Карл !!! wink

 

Внимание: Файл LibMPSSE-SPI_source.zip содержит не тронутые исходники библиотеки.


 Москва 2021