www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Bulktransfer mit libusb


Autor: Pat Rik (patrik)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo Leute,
ich versuche einen bulk transfer zwischen PC(WinXP) und einem AT90USB647 
zu realisieren. Dazu habe ich mir das CDC Beispiel 
USBKEY_STK525-series6-cdc von Atmel geholt und ich versuche es mit 
libusb anzusprechen. CDC ist im Prinzip bulk transfer, daher dachte ich 
mir, dass es auch funktionieren müsste. Leider funktioniert aber nur 
usb_bulk_write, bei usb_bulk_read bekomme ich den Fehler -22.

Ich versuche einfach nur einen Byte an den uC zu schicken und diesen 
dann wieder zurück senden. Auf der uC Seite mache ich folgendes:
if (uart_usb_test_hit())   // Something received from the USB ?
{

  Usb_select_endpoint(RX_EP);

  receivedUsbData[0] = Usb_read_byte();


  Usb_select_endpoint(TX_EP);
  while(!Is_usb_write_enabled());  
  while(!(UEINTX &= (1<<FIFOCON)));

  Usb_write_byte(receivedUsbData[0]);

  Usb_ack_in_ready();

  rx_counter = 0; // ist nur wegen CDC hier
}

mit
#define TX_EP                 0x01
#define RX_EP                 0x02

RX_EP und TX_EP sind als Bulk konfiguriert und haben 64 Byte grossen 
Puffer.

Dieser Code funktioniert auch, wenn ich den Standard XP Treiber 
usbser.sys benutze und über einen com port mit dem uC kommuniziere. 
Leider aber nur mit 9600 Baudrate was mir viel zu wenig ist.

Wenn ich über libusb gehe, kann ich die Daten nur schreiben und die 
kommen auch richtig an. Ich versuche es mit folgendem Code:
#define EP_IN      0x01
#define EP_OUT     0x02
#define BUF_SIZE   64

usb_dev_handle *dev = NULL; /* the device handle */
char tmp[BUF_SIZE];

for(int i=0; i<BUF_SIZE; i++)
{
  tmp[i] = i;
}

tmp[0] = 17;

usb_init(); /* initialize the library */
usb_find_busses(); /* find all busses */
usb_find_devices(); /* find all connected devices */


if(!(dev = open_dev())) // die standard Methode aus dem bulk.c Beispiel
{
  printf("error: device not found!\n");
  return 0;
}

//SETUP_SET_CONFIGURATION


if(usb_set_configuration(dev, 1) < 0)
{
  printf("error: setting config 1 failed\n");
  usb_close(dev);
  return 0;
}

if(usb_claim_interface(dev, 0) < 0)
{
  printf("error: claiming interface 0 failed\n");
  usb_close(dev);
  return 0;
}

int written = usb_bulk_write(dev, EP_OUT, tmp, 1, 5000) ;

if(written != 1)
{
  printf("error: bulk write failed\n");
}

int readed = usb_bulk_read(dev, EP_IN, tmp, 1, 5000);

if(readed < 0)
{
  printf("error: bulk read failed\n");
}


usb_release_interface(dev, 0);
usb_close(dev);

Wie schon gesagt, bekomme ich beim Lesen den Fehler -22. Ich denke, das 
heisst 'Ungültiger Parameter', weiss aber nicht warum und welcher das 
ist.

Ich habe auch versucht, 64 Bytes zu schreiben und lesen, hat aber nichts 
gebracht.

Hat jemand vielleicht ne Idee was ich noch versuchen/ändern könnte? Oder 
kennt jemand ein Projekt in dem mit libusb Daten an den uC geschickt und 
gelesen werden?

Würde mich über eure Hilfe sehr freuen
Danke
Patrik

Autor: Michael Buesch (mb_)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
> Wie schon gesagt, bekomme ich beim Lesen den Fehler -22. Ich denke, das
> heisst 'Ungültiger Parameter',

Ja das heisst es.
Der endpoint ist falsch. Ein IN EP hat immer 0x80 gesetzt.
Also irgendwie sowas:

int readed = usb_bulk_read(dev, EP_IN | USB_ENDPOINT_IN, tmp, 1, 5000);

(PS: readed -> Gaaaaarrrrgghhhhhh :D)

Autor: Olaf (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
> int readed = usb_bulk_read(dev, EP_IN | USB_ENDPOINT_IN, tmp, 1, 5000);

> (PS: readed -> Gaaaaarrrrgghhhhhh :D)

Wenn readed vom typ int ist, dann kann es kein Zeiger auf einen struct 
auf mit der Variablen Gaaaaarrrrgghhhhhh sein!

Olaf :-)

Autor: Pat Rik (patrik)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Michael DANKE!!!!

ps: ich finde readed geil :-D

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.