Jump to content

    

"Быстрый" USB <=> SPI

Добрый день,

 

Что посоветуете в качестве контроллера USB?

Основное требование - возможность опторазвязки со стороны SPI, ну и достаточно высокая скорость обмена.

Share this post


Link to post
Share on other sites
Добрый день,

 

Что посоветуете в качестве контроллера USB?

Основное требование - возможность опторазвязки со стороны SPI, ну и достаточно высокая скорость обмена.

 

Если нужен только мастер:

 

IMHO самое быстрое и дешовое решение использовать FTDI FT232R или FT245R, именно новую R серию там на борту есть и генератор и еепром и замечательный режим Synchro Bit Bang - spi влет реализуется причем на скорости до 48 mbit. (Сам пробовал на 1Mгц на одной плате стоит FT245R и AVR для апдейта прошивки выше не нужно было)

 

Можно купить готовый кабель (баксов за 20 - 25) TTL-232R или TTL-232R-3V3

Edited by KRS

Share this post


Link to post
Share on other sites

С реализацией SPI на переходнике USB_to_COM надо быть осмотрительнее. Использовал переходник на микросхеме Prolific - получилось, но очень медленно.

http://electronix.ru/forum/index.php?showtopic=38836&hl=

Share this post


Link to post
Share on other sites
С реализацией SPI на переходнике USB_to_COM надо быть осмотрительнее. Использовал переходник на микросхеме Prolific - получилось, но очень медленно.

http://electronix.ru/forum/index.php?showtopic=38836&hl=

Так принцип совсем иной - там полинг и частоту выше 1 кгц вообще не получить ( так было и на FTDI старых с обычным bitbang туда скорость огромная, а если надо считывать то все тормозит) а с synchro bit bang у вас синхронный поток скорость завист от длины пакета если передавать большими блоками то КПД к 100% приближается.

Share this post


Link to post
Share on other sites
IMHO самое быстрое и дешовое решение использовать FTDI FT232R или FT245R, именно новую R серию там на борту есть и генератор и еепром и замечательный режим Synchro Bit Bang - spi влет реализуется причем на скорости до 48 mbit. (Сам пробовал на 1Mгц на одной плате стоит FT245R и AVR для апдейта прошивки выше не нужно было)

KRS, а можно на схемку взглянуть (использование FT232RL с SPI)?

Edited by sergeeff Jr.

Share this post


Link to post
Share on other sites
KRS, а можно на схемку взглянуть (использование FT232RL с SPI)?

Да собственно схема то состоит из одной микросхемы FT232RL и пары конденсаторов.

В даташите есть пример example USB to MCU UART interface. Просто вместо MCU выберите 3 ноги (которые могут участвовать в бит банг) это и будет SPI

 

Если делать на FT2232C/D то надо еще генератор ставить и чип дороже стоит ( зато SPI там аппаратный практически не надо преобразовывать в последовтаельность бит)

Edited by KRS

Share this post


Link to post
Share on other sites
Да собственно схема то состоит из одной микросхемы FT232RL и пары конденсаторов.

В даташите есть пример example USB to MCU UART interface. Просто вместо MCU выберите 3 ноги (которые могут участвовать в бит банг) это и будет SPI

 

Если делать на FT2232C/D то надо еще генератор ставить и чип дороже стоит ( зато SPI там аппаратный практически не надо преобразовывать в последовтаельность бит)

 

Если правильно понял у FT2232C/D есть режим "Fast Opto-Isolated Serial Interface". Стоит на него ориентироваться?

Share this post


Link to post
Share on other sites
Если правильно понял у FT2232C/D есть режим "Fast Opto-Isolated Serial Interface". Стоит на него ориентироваться?

Fast Opto-Isolated Serial Interface правильно работает на частоте до 6МГц, выше идут сбои. К тому же в SPI еще преобразовывать надо.

Share this post


Link to post
Share on other sites

Дошли наконец руки поисследовать Synchro Bit Bang

Исследовал на FT245RL.

Для начала с помощью простейшей программки

#include <windows.h>
#include <stdlib.h>
#include <assert.h>
#include "ftd2xx.h"

#define SCK_PIN 5
#define OUT_PIN 6
FT_HANDLE hFtdi;
unsigned buf[4];
int main(int argc, char* argv[])
{
    unsigned tmp;
    unsigned baud;
    DWORD num;

    assert(FT_Open(0,&hFtdi)==FT_OK);
    assert(FT_SetLatencyTimer(hFtdi,2)==FT_OK);
    assert(FT_SetBitMode(hFtdi,(1<<OUT_PIN) | (1<<SCK_PIN),4)==FT_OK);
    assert(argc>1);
    baud = atoi(argv[1]);
    assert(baud);
    assert(FT_SetBaudRate(hFtdi,baud)==FT_OK);
    FT_Purge(hFtdi,FT_PURGE_RX | FT_PURGE_TX);
    tmp = (1<<OUT_PIN) | (1<<SCK_PIN);
    assert(FT_Write(hFtdi,&tmp,1,&num)==FT_OK);
    Sleep(10);
    FT_Purge(hFtdi,FT_PURGE_RX | FT_PURGE_TX);
    Sleep(10);

    while(1) {
        tmp = (((1<<OUT_PIN) | (1<<SCK_PIN))<<8) | (((1<<OUT_PIN) | (1<<SCK_PIN))<<24);
        buf[0] = tmp;
        buf[1] = tmp;
        buf[2] = tmp;
        buf[3] = tmp;
        assert(FT_Write(hFtdi,buf,16,&num)==FT_OK);
        assert(FT_Read(hFtdi,buf,16,&num)==FT_OK);
        Sleep(2000);
    }

    return 0;
}

 

Результаты как и следовало ожидать очень интересные.

Как я уже выяснил давно ( еще и на старых FTDI с обычным bitbang ) баудрейт задает максимальную скорость выдачи семплов иногда возникают существенные задержки в произвольном месте(и это не связно с передачей по USB данные уходят в одном пакете). Что сделало невозможным использование тогда для С2 интерфейса (там клоки на ресет идут). Но тогда я не пробовал ставить бауд рейт выше 1E6/16 = 62500. А сейчас попробовал и вот что получилось:

 

Для баудрейта 62500 частота выдачи должна быть 1 mhz, так и получается, но произвольные задержки в разных местах иногда возникают.

Ставлю бауд рейт 187500 (187500*16 = 3 Mhz = 0.33 mks) на оцилографе вижу минимум ~ 0.66

Вообще судя по всему получается для бауд рейтов выше 62500 ( 1 mhz) частота выдачи получается странная и по осцилографу не получается выше 0.5 с маленьким хвостиком mks т.е. практически 2 mhz. Но произвольные паузы присутсвуют :(

 

Но самое интересное получается если баудрейт установить 3 000 000.

Получается идеальная картинка с частотой практически 1 Mhz ( т.е. частота выдачи 2 mhz) и никаких пауз.

 

Для баудрейта 1 000 000 тоже пауз не заметил частота практически та же что и для 3 000 000, но клоки немного не симмитричные в разных посылках по разному.

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
Sign in to follow this