Skocz do zawartości

[C] komunikacja pomiedzy TFDI <> ATxmega128


Pomocna odpowiedź

Napisano

witam

posiadam taki oto moduł FTDI UMFT240XA . moduł ten od strony uC ma 8 bitową szynę danych i 4 sygnały sterujące:

D0-D7 - I/O - 8 bitów danych

RXF# - output - Transmit Control Line

TXE# - output - Receive Control Line

RD# - input 245 FIFO Write Status Line

WR# - input 245 FIFO Read Status Line

Czy ktoś już podpinał taki kontroler USB do uC i mógłby mi wyjaśnić jak tym sterować?

Nie podłączałem tego czegoś do niczego innego ale mimo to spróbuję Ci odpowiedzieć na podstawowe pytanie: jak to zrobić mimo, iż nawet nie chciało Ci się zajrzeć do tego dokumentu, wskaznego w instrukcji do modułu UMFT240XA:

http://www.ftdichip.com/Support/Documents/DataSheets/ICs/DS_FT240X.pdf

na stronę 12 i 13.

Z danych zawartych w powyższym dokumencie wynika, że:

1. Scalak służy do komunikacji dwukierunkowej. Z jednej strony ma USB a z drugiej 8-bitową, dwukierunkową szynę danych. Pomiędzy tymi interfejsami stoją dwie FIFO czyli tzw. kolejki - pamięci które potrafią zbuforować do 512 bajtów niezależnie w każdą stronę.

2. Załóżmy, że podłączyłeś to do procesora w najprostszy możliwy sposób, czyli linie D0-7 do jakiegoś pełnego portu a pozostałe 4 sygnały do jakichś 4 linii innych portów. Ustawiasz swój port "danych" na wyjście (żeby w stanie "nieużywania" linie były czymś sterowane), to co podłączone do RXF i TXE ma być wejściami procesora a RD i WR wyjściami. Na RD wystawiasz stan 1 a na WR stan 0.

3. Jeżeli chcesz coś przez USB wysłać to:

a. Sprawdzasz stan linii TXE, która musi być zerem co oznacza, że FIFO nadajnika nie jest "zapchane" i masz w niej miejsce na conajmniej 1 bajt danych.

b. Wystawiasz bajt do wysłania na port "danych" (D0-7).

c. Robisz krótki impuls 1 na linii WR (0-1-0).

4. Jeżeli chcesz coś odebrać z USB to:

a. Sprawdzasz stan linii RXF która musi być zerem co oznacza, że conajmniej jeden bajt jest gotowy do odczytu z FIFO odbiornika.

b. Przestawiasz port "danych" (D0-7) na wejście.

c. Wystawiasz stan niski na linii RD.

d. Odczytujesz co się pojawiło na liniach D0-7 przez port "danych".

e. Podnosisz linię RD do stanu wysokiego

f. Przestawiasz port z powrotem na wyjście.

Oczywiście wykonując pkt 4 w pętli - w przypadku odczytu większej liczby bajtów - nie musisz za każdym razem machać kierunkiem portu danych. Wystarczy, gdy raz na początku zrobisz go "wejściem" i raz na końcu zostawisz go w stanie wyjściowym.

W przypadku procesora mającego EBI możesz podłączyć linie D0-7 do szyny danych pamięci i traktować obie FIFO jak "jednokomórkową" pamięć. W tym przypaku o kierunek pracy bufora szyny procesora będzie sią martwiło EBI. Niestety w przypadku gdy na magistrali będzie jeszcze jakaś pamięć (np. SRAM) musisz bramkować sygnały RD/WR sygnałem wyboru przestrzeni adresowej CS ponieważ - w odróżnieniu od pamięci - takiego kwalifikatora układ FT240X nie ma.

@Marek

Wszystko pięknie ładnie, widziałem te strony z timingami co nie do końca było dla mnie jasne.

Jeżeli chodzi o odbiór danych z FTDI to sprawa wydaje się prosta ... wysyłam z PC powiedzmy paczkę 256 bajtów i ja odczytuje tą paczkę bajt po bajcie w tej kolejności jak je wysłałem z PC. Tutaj trzeba zaznaczyć ze softwerowo musze sprawdzać czy dane są kompletne czy tez nie i czekać aż jakieś bajty znajda się w buforze FIFO. OK sprawa jasna.

Gorzej wygląda sprawa wysyłania bajtów do bufora FIFO gdyż jeżeli chce wysłać powiedzmy 190 bajtów i wyśle je bajt po bajcie to kiedy je wyśle TFDI? wyśle to w jakiejś paczce za jednym razem czy osobno każdy bajt, USB ma jakieś przecież ramki) i choć PC widzi układ jako wirtualny com to jakoś te dane chyba są pakowane ... to mnie tylko zastanawiało 🙂

No ale skoro nie mam na to wpływu jak to jest wysyłane, być może niepotrzebnie się tym martwiłem... to wszystko jasne wysyłam na FTDI bajt po bajcie i on trafia do PC w tej samej kolejności przed wysłaniem sprawdzam czy mam wolne miejsce w buforze... natomiast gdy odbieram dane sprawdzam czy bufor jeszcze ma cos u siebie czy już jest pusty.

Pozostaje jeszcze jakaś konfiguracja ... ten układ pozwala na przesyłanie z prędkością do 8Mbps nie trzeba gdzieś ustawić konfiguracji z jaka prędkością maja być przesyłane dane ?

Pamiętam jak dawno temu pisałem w assemblerze wysyłanie po RS232 na PIC16F84 to w zależności od tego z jaka prędkością chciałem wysyłać dane (9600 lub 19200) to musiałem odpowiednio ustawić programowo czas każdego bitu.

Wiec chyba tutaj tez musze chyba ustawić prędkość by od strony PC ustawić dane w porcie COM na odpowiednia i taką samą abym dobre dane odczytywał, no chyba ze konfiguracje FT240 od strony PC robi się za pomocą sterownika.

A tak po za tym to bardzo dziękuje za obszerna odpowiedz 🙂

To może po kolei:

Opisałem Ci tylko piny o kóre pytałeś. Twój moduł ma jeszcze kilka innych fajnych sygnałów:

SI/WU - Send Immediate/WakeUp czyli "Wyślij natychmiast/ Obudź" służy właśnie do wymuszenia wysłania tego, co już jest zgromadzone w FIFO nadajnika. Drugą funkcją jest wybudzenie tej gałęzi USB w przypadku, gdy komputer ją uśpił. Jeśli ten sygnał podłączysz do procesora, to normalnie wystaw tam stan wysoki. Jeśli nagle zapragniesz by dane właśnie wepchnięte do FIFO znalazły się jak najszybciej w PC, to robisz tu krótki impuls do stanu 0 i.. poszło.

CBUS5, CBUS6 - Dwa sygnały, których funkcje możesz sam ustawić przy pomocy specjalnego programu zmieniającego zawartość wewnętrznej, nieulotnej pamięci konfiguracyjnej scalaka FTDI. Soft ściągasz ze strony producenta i masz tam mnóstwo opcji dotyczących np. wpisania numeru seryjnego, nazwy urządzenia jaka będzie prezentowana podczas enumeracji, trybu pracy (self- lub bus-powered) oraz m.in. właśnie funkcji tych dwóch sygnałów. Opis możliwości sygnałów CBUSn jest w tabelce jest na stronie 11 w pdf. Domyślne ustawienia po wyjściu z fabryki są takie:

CBUS5: VBUS_SENSE - podłączasz do VBUS USB w trybie self-powered, dzięki czemu układ wie, że został do USB podłączony i może rozpocząć procedurę "zgłaszania się" do hosta,

SBUS6: Keep_Awake# - wymuszając tu stan niski możesz tu zabronić scalakowi wejście w tryb suspend po odłączeniu od USB

Jeśli czegoś tu nie rozumiesz, pytaj.

Jaką prędkość? To, że od strony PC interfejs "wygląda" jak port szeregowy to tylko ukłon w stronę ludzi umiejących go obsługiwać programowo. Tu nigdzie na drodze danych nie masz rzeczywistego asynchronicznego UARTa więc cokolwiek ustawisz, i tak będzie wykorzystywana maksymalna przepustowowość USB. Inaczej w przypadku układów typu FT232 i podobnych, gdzie rzeczywiście na "końcu" był port szeregowy i dane "wypadały" z tego końca z taką prędkością jaką ustawiłeś w setupie portu szeregowego PC. Na szczęście to nie jest ten przypadek.

no to w takim razie mam pytanie ...

skoro TFDI widzę jak com port a ja pisze aplikacje to w aplikacji musze ustawić polaczenie, podaje nr com portu no i musze podać jakieś ustawienia prędkość, bit stopu i etc.

wiec co mam tam wpisać ? aby odbierane dane były poprawne ?

Numer portu to jasne bo to definiuje konkretny interfejs ale reszta ustawień formatu danych jest nieistotna - ma nadzieję, że już zrozumiałeś tę abstrakcję portu szeregowego. Dane nie przechodzą nigdzie przez łącze asynchroniczne z bitami startu, stopu i jakimś baudrate'm na który umówiły się obie strony więc transfer zawsze będzie poprawny. Czy flashdisk na USB umawia się z kompem na jakąś prędkość transmisji? No właśnie... Jeśli wciąż potrzebujesz konkretny zestaw to proponuję: 9600,n,8,1 - to jeden z moich ulubionych 🙂

Oki Marek ... załapałem ... później na to wpadłem tez 🙂 ze na wyborze coma się kończy , reszta mnie nie interesuje 🙂 w sumie fajnie 🙂 mniej problemów 🙂

wielkie dzięki za wyczerpującą pomoc.

pozdrawiam

Ultimion

Bądź aktywny - zaloguj się lub utwórz konto!

Tylko zarejestrowani użytkownicy mogą komentować zawartość tej strony

Utwórz konto w ~20 sekund!

Zarejestruj nowe konto, to proste!

Zarejestruj się »

Zaloguj się

Posiadasz własne konto? Użyj go!

Zaloguj się »
×
×
  • Utwórz nowe...