Forum: Compiler & IDEs FTDI D2XX problem


von Patrick K. (kaplan)


Lesenswert?

Hallo, ich bin fast am verzweifeln.
ich versuche eine kommunikation aufzubauen mit dem ftdi.
mein uC soll Daten zum PC senden. Am Besten sagt der mikrocontroller am 
anfang wieviele Byte, sodass der PC etwas Ahnung hat.

Momentan versuche ich erstmal einzelne Byte zu verschicken.

AVR Code:
1
while (1) {
2
    uart_putc (0xFF); //255
3
    uart_putc (0xEE); //238
4
    uart_putc (0xAB); //171
5
    uart_putc (99); //anzahl pakete
6
    for (i=0;i<99;i++) {
7
      uart_putc(i);  
8
      
9
    }
10
  }

auf PC seite geh ich nach der D2xx programmers guide vor.
1
int FTDI_COMM::receive(unsigned char* message, FT_STATUS &ftStatus, FT_HANDLE &ftHandle1, bool debuginfo){    
2
    // receive a message
3
    DWORD RxBytes;
4
    DWORD RxBytes_man =1;
5
    DWORD TxBytes;
6
    DWORD EventDWord;
7
    DWORD BytesReceived;
8
    unsigned char RxBuffer[1];
9
    
10
    int var_int;
11
    
12
13
    ftStatus = FT_GetStatus(ftHandle1,&RxBytes,&TxBytes,&EventDWord);
14
    if ( ftStatus != FT_OK ) {
15
      cout<<"Could not get status!";
16
      return -1;
17
    }
18
  
19
  
20
21
    if (RxBytes = 1) {
22
      ftStatus = FT_Read(ftHandle1,RxBuffer,RxBytes_man,&BytesReceived);
23
      if (ftStatus == FT_OK) {
24
    
25
26
        *message = RxBuffer[0];
27
                
28
      
29
      }
30
      else {
31
        // FT_Read Failed
32
        cout<<"Read Buffer Failed!";
33
        return -1;
34
      }
35
    }
36
37
    else return -1;
38
39
    return 1;
40
}


Das Problem ist: wenn ich AVR und PC Seite mit 57600 Baud konfiguriere 
klappt das noch. Der AVR macht keine Delays und Codeoptimierung ist auf 
0.
wenn ich auf 115200 Baud erhoehe dann verlier ich ne Menge pakete.

1
struct ftdi_paket {
2
  unsigned char a;
3
  unsigned char b;
4
  unsigned char c;
5
};
6
7
...
8
9
...
10
int main...
11
12
while (1){
13
    myFTDIobject.receive(&act_char,ftStatus,ftHandle,0);
14
    paket.a = act_char;
15
    paket.c = paket.b;
16
    paket.b = last_char;
17
    
18
/*
19
    printf("ausgelesen 1 : %d ",paket.a);    
20
    printf("  ausgelesen 2 : %d ",paket.b);
21
    printf("  ausgelesen 3 : %d \n",paket.c);
22
    */
23
24
    if ((last_char+1) != act_char) {
25
      printf(" Error: Aktueller Wert: %d  Letzter Wert: %d  OK:%i \n", act_char, last_char, ok);
26
      ok=0;
27
    }
28
    else  {      
29
      ok++;
30
    }
31
    
32
    if ((paket.a == 0xAB) && (paket.b==0xEE)&&(paket.c==0xFF)){
33
        printf (">>>>>>>>>>> HEADER GEFUNDEN!!!!!! <<<<<<<<\n");
34
        ok++;
35
    }
36
37
    last_char= act_char;
38
  }



Hat jemand n Beispiel wie man mit D2XX wirklich schnell daten 
transferieren kann? wenn ich auf 57600 beschraenkt bin, kann ichs grad 
vergessen. und den ftdi hab ich extra wegen der schneller uebertragung 
geholt.

danke fuer die hilfe
Pak

von Patrick K. (kaplan)


Lesenswert?

oder einfach mal ganz anders:

wie kann man mit dem FTDI 232R daten schnell vom uC zum PC uebertragen?
eine recht grosse menge in kuerzester zeit...

ich such einfach nur ein gescheites codebeispiel und nicht den muell der 
FTDI Seite.

von Andreas K. (a-k)


Lesenswert?

230Kbps mit Mega168 und FT232R ist überhaupt kein Problem. Vorausgesetzt 
die Bitrate passt. Woher kriegt der AVR denn den Bitratentakt?

von Patrick K. (kaplan)


Lesenswert?

hmmm keine ahnung. Ich nutz die UART Library vom Peter Fleury !???!
dort drin setz ich die baudrate auf den gewuenschten wert. ich benutze 
einen externen 16 mhz takt.
aber spaeter wollte ich auf einen Atmega644 mit 20mhz umsteigen.

kannst du etwas code bereitstellen? ich dreh hier noch am rad mit der 
miesen dokumentation

von Andreas K. (a-k)


Lesenswert?

Tip: Baudratenquarz

Bei Taktraten immer dran denken, dass die Bitraten auch sauber erzeugt
werden können. So sind 18,432 MHz für hohe Bitraten geeignet, 16 MHz
oder 20 MHz jedoch nicht.

von Patrick K. (kaplan)


Lesenswert?

ok,

wie siehts mit der Konfiguration der FTDI Kommunikation aus?

ich kann Latency, Baudrate, FlowControl, TimeOuts, Datacharacteristics 
usw setzen...
ist da etwas spezielles empfehlenswert?

von Andreas K. (a-k)


Angehängte Dateien:

Lesenswert?

Beispiel für Initialisierung mit Flow-Control.

von Patrick K. (kaplan)


Lesenswert?

Ok die initialisieung war schon recht aehnlich.

ich hatte die Timeouts auf 100,100
Die flow control auf "none"
LATENCYTIMER hab ich auf 50!! ????
FT_SetDataCharacteristics war gleich.
mit 57600 baud ist das ergebnis ok. !!!

wenn ich die baudrate erhoehe (115200), geht wieder mal alles schief.

im moment benutze ich:
1
ftStatus = FT_Read(ftHandle1,RxBuffer,RxBytes_man,&BytesReceived);
zum empfangen wobei:
1
DWORD RxBytes_man =1;
2
DWORD BytesReceived;
3
unsigned char RxBuffer[1];

ist das ok? wenn ich die bytes nicht einzeln empfange hatte ich das 
problem dass sich die pakete untereinander verschieben. Beim 
mikrocontroller sende ich z.b. A,B,C die ganze zeit.
empfange dann aber B,C,A. somit konnte ich das nicht mehr zuordnen. also 
bin ich auf einzelne pakete zurueck gegangen.

von Andreas K. (a-k)


Lesenswert?

> wenn ich die baudrate erhoehe, geht wieder mal alles schief.

Schon mal versucht, 16000000 durch 115200*16 zu teilen? Was kommt dabei 
raus? Bei 57600 ist die Abweichung noch erträglich, bei 115200 nicht 
mehr.

von Patrick K. (kaplan)


Lesenswert?

Andreas Kaiser wrote:
> 230Kbps mit Mega168 und FT232R ist überhaupt kein Problem. Vorausgesetzt
> die Bitrate passt. Woher kriegt der AVR denn den Bitratentakt?

aber wie erreichst du dann diese Baudrate?
mit 18,432 MHz Quarz und FT_BAUD_230400 ???????

von Andreas K. (a-k)


Lesenswert?

18432000 / (230400*16) = 5. Im /8-Modus der UART ginge folglich auch 
noch 460Kbps.

von Patrick K. (kaplan)


Lesenswert?

ok klingt ueberzeugend.... leider hab ich kein passendes quarz gerade 
da. muss erst bestellen.


mit
1
ftStatus = FT_Read(ftHandle1,RxBuffer,RxBytes_man,&BytesReceived);
einzelne Bytes zu empfangen ist aber soweit ok?

von Andreas K. (a-k)


Lesenswert?

Passt schon. Ist zwar recht unökonomisch, immer nur 1 Byte zu lesen, 
aber erst einmal irrelevant.

von Patrick K. (kaplan)


Lesenswert?

ok jetzt hab ich einfach mal
baudrate auf 250000 eingestellt. denn das passt ja vom teiler her. und 
sihe da ich bekomm ne uebertragung wie mit 56700. nur schneller denk ich 
(aber ich kann noch nicht messen)!!

von Patrick K. (kaplan)


Lesenswert?

leider erkennt mein Windows jetzt die ganze Zeit einen Microsoft 
pointer... und meine mouse wird nun vom FTDI bewegt... ganz toll

von MNR (Gast)


Lesenswert?

Äh, mal ne Frage: Wenn du sowieso über den D2XX Treiber gehst, wieso 
willst du dann noch mit den krummen Baudraten rummachen? Also bei meinem 
232RL gehen 500KBit mit 16MHz Takt ohne Probleme. Man könnte auch 1MBit 
oder 250KBit oder 125KBit mit "geraden" Quarzen fahren.

von Patrick K. (kaplan)


Lesenswert?

@MNR

haette ich das nur frueher gewusst... ich dachte ich hab Codeprobleme... 
aber hjetzt funktionierts wuderbar. auch mit 1MBaud. Thanks a lot

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.