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:
1 | if (uart_usb_test_hit()) // Something received from the USB ?
|
2 | {
|
3 |
|
4 | Usb_select_endpoint(RX_EP);
|
5 |
|
6 | receivedUsbData[0] = Usb_read_byte();
|
7 |
|
8 |
|
9 | Usb_select_endpoint(TX_EP);
|
10 | while(!Is_usb_write_enabled());
|
11 | while(!(UEINTX &= (1<<FIFOCON)));
|
12 |
|
13 | Usb_write_byte(receivedUsbData[0]);
|
14 |
|
15 | Usb_ack_in_ready();
|
16 |
|
17 | rx_counter = 0; // ist nur wegen CDC hier
|
18 | }
|
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:
1 | #define EP_IN 0x01
|
2 | #define EP_OUT 0x02
|
3 | #define BUF_SIZE 64
|
4 |
|
5 | usb_dev_handle *dev = NULL; /* the device handle */
|
6 | char tmp[BUF_SIZE];
|
7 |
|
8 | for(int i=0; i<BUF_SIZE; i++)
|
9 | {
|
10 | tmp[i] = i;
|
11 | }
|
12 |
|
13 | tmp[0] = 17;
|
14 |
|
15 | usb_init(); /* initialize the library */
|
16 | usb_find_busses(); /* find all busses */
|
17 | usb_find_devices(); /* find all connected devices */
|
18 |
|
19 |
|
20 | if(!(dev = open_dev())) // die standard Methode aus dem bulk.c Beispiel
|
21 | {
|
22 | printf("error: device not found!\n");
|
23 | return 0;
|
24 | }
|
25 |
|
26 | //SETUP_SET_CONFIGURATION
|
27 |
|
28 |
|
29 | if(usb_set_configuration(dev, 1) < 0)
|
30 | {
|
31 | printf("error: setting config 1 failed\n");
|
32 | usb_close(dev);
|
33 | return 0;
|
34 | }
|
35 |
|
36 | if(usb_claim_interface(dev, 0) < 0)
|
37 | {
|
38 | printf("error: claiming interface 0 failed\n");
|
39 | usb_close(dev);
|
40 | return 0;
|
41 | }
|
42 |
|
43 | int written = usb_bulk_write(dev, EP_OUT, tmp, 1, 5000) ;
|
44 |
|
45 | if(written != 1)
|
46 | {
|
47 | printf("error: bulk write failed\n");
|
48 | }
|
49 |
|
50 | int readed = usb_bulk_read(dev, EP_IN, tmp, 1, 5000);
|
51 |
|
52 | if(readed < 0)
|
53 | {
|
54 | printf("error: bulk read failed\n");
|
55 | }
|
56 |
|
57 |
|
58 | usb_release_interface(dev, 0);
|
59 | 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