www.mikrocontroller.net

Forum: Compiler & IDEs USB GenericHID mit LUFA -?Datenempfang verarbeiten??


Autor: delicious_cake (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo

Ich arbeite an einem kleinen Projekt mit dem AT90USB162 das vom PC per 
USB-Verbindung einige Aufgaben/Daten geschickt bekommt und diese in den 
internen Flash speichern soll um spaeter ohne aktive USB verbindung die 
Daten zu verarbeiten. Als USB Stack verwende ich LUFA. Meinen bisherigen 
Programmcode habe ich schon mit LUFA ClassDriver Demo Code GenericHID 
(ClassDriver steht für die HighLevel Variante)zusammengeführt. Bis jetzt 
laesst sich auch alles ohne Fehler und Warnungen compilieren.

Meine Fragen:
1.Wie setzte ich den Datenempfang geschickt um? Mit Zugriffen auf den 
Flash habe ich schon gearbeitet. Die Speicherung selbst stellt also kein 
Problem dar.
2.Wie kann ich Daten senden? (z.B. Messergebnisse, ...)



Hier zwei Ausschnitt aus dem LUFA Demo Code:

1.Das Hauptprogramm (unveraendert)
int main(void)
{
  SetupHardware();
  
  LEDs_SetAllLEDs(LEDMASK_USB_NOTREADY);
  sei();
  
  for (;;)
  {
    HID_Device_USBTask(&Generic_HID_Interface);
    USB_USBTask(); //ist das zur USB Funktionalitaet?
  }
}


2.Der Datenempfangstask: (unveraendert)
void HID_Device_USBTask(USB_ClassInfo_HID_Device_t* const HIDInterfaceInfo)
{
  if (USB_DeviceState != DEVICE_STATE_Configured)
    return;

  Endpoint_SelectEndpoint(HIDInterfaceInfo->Config.ReportINEndpointNumber);
  
  if (Endpoint_IsReadWriteAllowed())
  {
    uint8_t  ReportINData[HIDInterfaceInfo->Config.PrevReportINBufferSize];
    uint8_t  ReportID     = 0;
    uint16_t ReportINSize = 0; //Standardmaeßig = 8


/* diese Zeile hat etwas mit dem Datensenden zu tun. Soweit ich verstanden
habe, wird hier aber nur 0 in jedes Byte von ReportINData geschrieben.*/
    memset(ReportINData, 0, sizeof(ReportINData)); 


// Diese Zeile verstehe ich überhaupt nicht
    bool ForceSend         = CALLBACK_HID_Device_CreateHIDReport(HIDInterfaceInfo, &ReportID, REPORT_ITEM_TYPE_In, ReportINData, &ReportINSize);
// Das ist klar.
    bool StatesChanged     = false;
// Das verstehe ich auch nicht.
    bool IdlePeriodElapsed = (HIDInterfaceInfo->State.IdleCount && !(HIDInterfaceInfo->State.IdleMSRemaining));
    

/*wenn ich das richtig verstanden habe, dann wird hier überprüft, ob Daten
zum abholen bereit stehen. wenn ja, wird StatesChanged = 1 und die neuen
Daten werden in ReportINData geschrieben.*/
    if (HIDInterfaceInfo->Config.PrevReportINBuffer != NULL)
    {
      StatesChanged = (memcmp(ReportINData, HIDInterfaceInfo->Config.PrevReportINBuffer, ReportINSize) != 0);
      memcpy(HIDInterfaceInfo->Config.PrevReportINBuffer, ReportINData, HIDInterfaceInfo->Config.PrevReportINBufferSize);
    }


/*hier dürfte dann, wenn einmal daten empfangen wurden, immer wieder diese
Daten wieder zurück geschickt werden, bis Neue kommen. Dann werden die neuen gesendet*/
    if (ReportINSize && (ForceSend || StatesChanged || IdlePeriodElapsed))
    {
      HIDInterfaceInfo->State.IdleMSRemaining = HIDInterfaceInfo->State.IdleCount;

      Endpoint_SelectEndpoint(HIDInterfaceInfo->Config.ReportINEndpointNumber);

      if (ReportID)
        Endpoint_Write_Byte(ReportID);

      Endpoint_Write_Stream_LE(ReportINData, ReportINSize, NO_STREAM_CALLBACK);
      
      Endpoint_ClearIN();
    }
  }
}

: Verschoben durch Moderator

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.