Forum: Mikrocontroller und Digitale Elektronik FTDI - SPI voll-duplex: Write und Statusmask auswerten


von Malthe (Gast)


Lesenswert?

Hallo Leute,

ich habe vor kurzem mit dem ftdi v2eval Board (VNC2 Chip) eine Arbeit 
angefangen und stoße momentan auf ein kleines Problem an.
Die Situation ist wie folgt:

-Ich möchte einen Datenlogger simulieren
-Dabei arbeitet der vnc2 chip der USB-Kontroller
-SPI-Daten sende ich via DLN-4s (Atmel Chip). Die dafür nötige 
Plattforme habe ich mit c++Builder selber geschrieben

Das Problem ist daß der Empfangspuffer (vnc2 chip) überläuft und man hat 
keine Möglichkeit zu wissen, ob der Puffer leer oder halb leer ist. 
Schließlich will ich ja kontinuierlich Daten schicken.
Dazu noch das Problem,dass man nicht wissen kann, ob z.b die 128 Bytes 
(129 plus Command Byte)alle schon aus dem Puffer vom vnc2 geholt wurden.

Deswegen mien Ansatz: -Nach jedem Schreibzugriff, RxBuffer auswerten. 
Möglich da SPI voll duplex
-Falls RxBuffer < 129 , die restlichen Byte erst vor dem nächsten 129 
Byts-Packet schicken
-Wenn nicht, dann einfach mal weiter schreiben.

Wenn ich jetzt die Funktion überprüfe, funktioniert es nicht ganz.

Hat jemand hier vielleicht eine Idee was ich übersehe??

Es wäre wirklich dankbar.
Gruß. Martin

Und so sieht meine Funktion aus:

bool Write(HDLN DeviceHandle, unsigned char * Buffer, unsigned long 
BufferSize){

  if(BufferSize % 128) return false;



   unsigned long pByte = 0;
   unsigned long ByteToWrite;

   unsigned char TxBuffer[129];
   unsigned char RxBuffer[129];

   TxBuffer[0] = 0x00; //!!!!!

   for(int Loop=0; Loop <BufferSize/128; Loop++){

    for(int i=0; i<128; i++){
      TxBuffer[i+1] = Buffer[pByte++];
    }

    //Diesen TxBuffer mit 128 Bytes (129 Achtung wegen CommandoByte)
    //senden
    DlnSpiMasterReadWrite(DeviceHandle, 0, 129, TxBuffer, RxBuffer);
    // Ermittelt der Restlänge des RxBuffers
    strlen(RxBuffer);

    //Vergleich mit Sendepacket und Statusflag Prüfen
    if((strlen(RxBuffer) < 129) & (0x04 == 0))
    {  //Falss Daten noch im Puffer, diesen Rerst erst senden,
       //dann ein ganzes Packet
       TxBuffer[1] = (129 - strlen(RxBuffer));
       DlnSpiMasterReadWrite(DeviceHandle, 0, strlen(RxBuffer), 
TxBuffer, RxBuffer);

       Sleep(10);
    }
    else{
       continue;
    }
}

von C.Hugo (Gast)


Lesenswert?

Was Dein Programm wirklich machen soll, verstehe ich leider nicht. Aber 
diese Abfrage     if((strlen(RxBuffer) < 129) & (0x04 == 0)) wird nicht 
so funktionieren, wie Du es geplant hast und strlen() solltest Du nur 
anwenden, wenn Du die Länge eines Strings (mit terminierender 0) 
ermitteln willst.

von foobar (Gast)


Lesenswert?

- TxBuffer[0] wird nicht initialisiert.
- Anstatt hard coded buffer sizes lieber sizeof() nehmen.
- strlen(RxBuffer) funktioniert nur, wenn alle empfangen Werte 
garantiert ungleich 0 sind.
- Die Zeile
1
if((strlen(RxBuffer) < 129) & (0x04 == 0))
ist von hinten bis vorne Schmarrn.

Angenommen, strlen() macht was du willst und es liefert einen Wert 
kleiner 129. Dann evaluiert (strlen(RxBuffer < 129) zu 1. (0x04 == 0) 
ist sinnlos; es evaluiert immer zu 0. Dann wendest du ein bitweises Und 
auf 1 und 0 an, was zu 0 evaluiert - dein if-Zweig wird also niemals 
ausgeführt.

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.