FTDI FT2232H Ускорение обмена по SPI (удаление задержки в 2 ms).
Наткнулся на статью РЕАЛИЗАЦИЯ SPI С ПОМОЩЬЮ МИКРОСХЕМ ФИРМЫ FTDI в которой автор
рассказывает о том, что библиотека libMPSSE.dll содержит следующею особенность.
Перед тем как поднять сигнал CS, библиотека делает задержку в 2 мс , цитирую:
В оригинальной библиотеке в режиме 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 раз Карл !!!
Внимание: Файл LibMPSSE-SPI_source.zip содержит не тронутые исходники библиотеки.
Москва 2021