Hallo,
ich versuche einen FT2232H über den synchronen FIFO Mode mit einem FPGA
zu verbinden um zum FPGA Daten zu senden. Mein Problem ist, das bei dem
FT ständig irgendwelcher Datenmüll raus kommt und zudem das RXF#
(scheinbar) verzögert ist.
Ich habe über FT_PROG den FIFO Mode aktiviert und sehe auch im Logic
Analyzer den 60MHz Takt.
Für mein Testsetup habe ich OE# und RD# konstant auf Ground gezogen.
SIWU# und WR# sind konstant auf VCC. Somit sollte ich in der Lage sein
Readbursts zu erzeugen die ich dann mit dem Logic Analyzer lesen kann.
Ich habe sonnst nichts an den FT angeschlossen. Nur den Logic Analyzer
ohne FPGA.
Ich habe das Beispiel in TN_167_FIFO_Basics verwendet mit einer kleinen
Modifikation: Ich erzeuge ein Array mit 32 Elementen, die ersten 16
Elemente werden von 0-15 durch nummeriert und die letzten 16 sind 0.
Somit bin ich in der Lage einfach zu verifizieren, ob die gesendeten
Daten korrekt sind.
Ich habe ein Screenshot von meinem Logic Analyzer hochgeladen (die
letzten drei Bits vom Datenbus fehlen, da ich nur 8 Ports habe, soll
aber nicht weiter stören). Man sieht die Wellenformen, wo das RXF# noch
high ist, das die korrekten Daten (scheinbar) empfangen wurden.
Zumindest würde ich genau das auf dem Bus erwarten, wenn RXF# auf low
geht.
Die Realität sieht aber anders aus. Ich lese für x Takte in dem
Readburst einfach irgendwas, die letzten 32 Takte von dem Burst sehen
aber meist ganz gut aus, so das ich dann meine Daten wieder erkenne.
Ich habe auch schon mit FT_Purge() versucht die FIFOs zu clearen,
allerdings ohne erfolg. Wenn ich die gleichen Daten ein zweites mal
sende (2. Readburst), bekomme ich etwas, was halbwegs nach dem aussieht,
was ich erwarte, aber trotzdem nicht korrekt ist.
Jetzt bin ich natürlich etwas ratlos. Ich hätte nicht erwartet, das man
da so viel falsch machen kann, und mir fehlt auch tatsächlich die
Fantasie, was da falsch ist und frage daher, was ich da falsch gemacht
haben könnte :(
Hier auch der Code:
1
intmain(intargc,char*argv[])
2
{
3
FT_HANDLEfthandle;
4
FT_STATUSstatus;
5
status=FT_Open(0,&fthandle);
6
if(status!=FT_OK)
7
{
8
printf("open status not ok %d\n",status);
9
return0;
10
}
11
status=FT_ResetDevice(fthandle);
12
if(status!=FT_OK)
13
printf("reset status not ok %d\n",status);
14
UCHARMask=0xFF;// Set data bus to outputs
15
UCHARmode=0;
16
UCHARmode1=0x40;// Configure FT2232H into 0x40 Sync FIFO mode
Ja TXE# und RXF# reagieren etwas spät, das muss man korrekt auswerten.
Und sonst wenn RXF# high ist ... dann ist doch schlicht nicht definiert
was auf dem Bus ist. Das musst du ignorieren. Könnte hochohmig sein oder
so, dann sieht man da auch Flanken.
Daten sind nur sicher valide wenn RD# und RXF# zur steigenden Flanke von
CLKOUT low sind.
Gustl B. schrieb:> Ja TXE# und RXF# reagieren etwas spät, das muss man korrekt auswerten.
Was heißt etwas spät? Wenn RXF# low ist zur steigenden Flanke, dann
erwarte ich korrekte Daten. Was kann ich da anders auswerten? Das es ein
wenig Zeit braucht (max 9ns), habe ich im Datenblatt gelesen, aber bis
zur steigenden Flanke sollte es sich doch stabilisiert haben.
> Und sonst wenn RXF# high ist ... dann ist doch schlicht nicht definiert> was auf dem Bus ist. Das musst du ignorieren. Könnte hochohmig sein oder> so, dann sieht man da auch Flanken.
Logisch, wahrscheinlich ist das wirklich Zufall, trotzdem haben die
Zufallsdaten da die Werte, die ich erwarten würde, wenn RXF# low ist. Es
erspart mir gerade nur das manuelle Zeichnen :)
> Daten sind nur sicher valide wenn RD# und RXF# zur steigenden Flanke von> CLKOUT low sind.
Und genau das ist mein Problem. RD# ist dauerhaft auf low, was korrekt
sein sollte, wenn ich bursten will. RXF# sollte dann 32 Takte low sein
und meine 32 bytes an Daten ausgeben. In der Realität bleibt es aber für
hunderte Takte low und sendet irgendwas.
Dann würde mich die Hardwarebeschreibung interessieren. Der Bus ist ja
bidirektional, da kann man auch Konflikte bauen ...
Wenn du das HDL hier anhängst simuliere ich dir das gerne.
Das ist sehr nett, aber sowas habe ich noch nicht. Ich habe erstmal mit
der Software angefangen um den Chip ein wenig kennen zu lernen. Ich habe
hier das FT2232H Mini Module.
Wie gesagt, OE# ist konstant auf low, habe daher keine Bus turnarounds.
WE# ist konstant auf high um das Schreiben zu unterbinden. RD# ist
konstant auf low um Readbursts zu simulieren.
Müsste das nicht im synchronen Modus ausreichend sein?
Sonnst sollte es sich ja recht simpel auf einen AXI Stream bus mappen
lassen, s_tvalid = !RXF#, RD# = !s_tready und s_tdata = data. Dazu noch
ein FIFO fürs Clock Domain Crossing und der Prototyp sollte laufen.