Forum: Mikrocontroller und Digitale Elektronik libusb & ATtiny85-20SU


von Kahn P. (Gast)


Lesenswert?

Hallo zusammen,

ich bin Not geraten und vielleicht weiß jemand Rat.
Ich verwende den ATtiny85-20SU, und habe libusb installiert.

Alles wunderbar, libusb erzeugt keinen Physikalischen COM port (Fehler?)
Aber ich verwende die Arduino IDE über DIGISPARK 16.5Mhz (Default)
Der COM -Port wird also scheinbar ignoriert da nicht vorhanden.
Soweit alles gut und auch Programmierbar.

Ich möchte nun die libusb direkt ansprechen um Serial Daten mit dem
ATtiny zu teilen, dazu verwende ich teile des Codebeispiels aus
der libusb/bulk.c

Das Gerät wird gefunden und ich kann es öffnen und ein Interface 
erlangen.

Leider schlägt jedes Read oder Write mit einem Fehlercode -5 oder -22 
fehl.

1
// Device vendor and product id.
2
#define MY_VID 0x16D0
3
#define MY_PID 0x0753
4
5
// Device configuration and interface id.
6
#define MY_CONFIG 1
7
#define MY_INTF 0
8
9
// Device endpoint(s)
10
#define EP_IN 0x81
11
#define EP_OUT 0x01
12
13
// Device of bytes to transfer.
14
#define BUF_SIZE 8
15
16
17
usb_dev_handle *open_dev(void)
18
{
19
    struct usb_bus *bus;
20
    struct usb_device *dev;
21
22
    for (bus = usb_get_busses(); bus; bus = bus->next)
23
    {
24
        for (dev = bus->devices; dev; dev = dev->next)
25
        {
26
      printf("Vendor %0x4 Product %0x4\r\n", dev->descriptor.idVendor, dev->descriptor.idProduct);
27
28
            if (dev->descriptor.idVendor == MY_VID && dev->descriptor.idProduct == MY_PID)
29
            {
30
                return usb_open(dev);
31
            }
32
        }
33
    }
34
    return NULL;
35
}
36
37
int main(void)
38
{
39
    usb_dev_handle *dev = NULL; /* the device handle */
40
    char tmp[BUF_SIZE];
41
    int ret;
42
    void* async_read_context = NULL;
43
    void* async_write_context = NULL;
44
45
    usb_init(); /* initialize the library */
46
    usb_find_busses(); /* find all busses */
47
    usb_find_devices(); /* find all connected devices */
48
49
    if (!(dev = open_dev()))
50
    {
51
        printf("error opening device: \n%s\n", usb_strerror());
52
        return 0;
53
    }
54
   
55
    if (usb_claim_interface(dev, 0) < 0)
56
    {
57
        printf("error claiming interface #%d:\n%s\n", MY_INTF, usb_strerror());
58
        usb_close(dev);
59
        return 0;
60
    }
61
 
62
    // Running a sync write test
63
    ret = usb_bulk_write(dev, EP_OUT, tmp, sizeof(tmp), 5000);
64
    if (ret < 0) printf("error writing:\n%s\n", usb_strerror());
65
   
66
    // Running a sync read test
67
    ret = usb_bulk_read(dev, EP_IN, tmp, sizeof(tmp), 5000);
68
    if (ret < 0) printf("error reading:\n%s\n", usb_strerror());
69
 
70
    usb_release_interface(dev, 0);
71
72
    if (dev)  usb_close(dev);
73
    
74
    return 0;
75
}

Für Hinweise wäre ich sehr dankbar,
 grüße
   Karsten

von Jim M. (turboj)


Lesenswert?

Wie lauten die Fehlermeldungen zu den Codes? Wenigstens eine klingt nach 
timeout, d.h. der µC hat die Daten nicht rechtzeitig bereitgestellt oder 
abgenommen.

Ist das VUSB? Dort würde ich eher mit Control Transfers arbeiten, Bulk 
ist bei low speed laut USB Spec nicht erlaubt.

von Kahn P. (Gast)


Lesenswert?

Hallo Jim,

die Meldungen aus dem Codefragment lauten wie folgt:

Vendor 16d04 Product 7534
error writing:
libusb0-dll:err [submit_async] submitting request failed, win error: The 
parameter is incorrect.

error reading:
libusb0-dll:err [submit_async] submitting request failed, win error: The 
parameter is incorrect.

Press any key to continue . . .


Ich habe mit usb_control_msg statt bulk die selben Fehler erlangt.


Auf dem Chip habe ich ein blockendes Read auf den Serialport,
es soll schreiben falls Daten rdy.

Ich verwende TinyWireM Objekt. hoffe das ist überhaupt das richtige.
(Bin gerade neu dazu gestoßen vorher ADuc70)

Wenn der Chip keine lese/schreib Aktionen auslöst sollte ja das timeout 
wirken, alle Fehler werden sofort ausgelöst.


IDE Prog:
1
#include <TinyWireM.h>      // By default: SCL -> PB2(#2), SDA -> PB0(#0)
2
3
#define MOD_TC_MK2_ADDR   0x23
4
#define GET_TEMP    0x21
5
6
#define  Delay_time_ms    50
7
#define  Led              1  // Select the pin where the led is attached. Options: from 0 to 4
8
9
10
// This function switches over the Led when is called
11
void Toggle_Led(void)
12
{
13
  if(digitalRead(Led)==HIGH)
14
  { 
15
    digitalWrite(Led, LOW);   
16
  }
17
  else
18
  {                       
19
    digitalWrite(Led, HIGH);  
20
  }
21
}
22
23
// The setup routine is executed once when you power-on the board or press the RST button later
24
void setup() 
25
{
26
  pinMode(Led, OUTPUT);    // initialize the digital pin as an output.
27
  digitalWrite(Led, LOW);  // Set it in Low state
28
  
29
  TinyWireM.begin();         // I2C init
30
}
31
32
33
// The loop routine runs over and over again until power-off the board or interrupt occure:
34
void loop() 
35
{
36
  uint8_t data[4];
37
  uint8_t i = 0;
38
 
39
  TinyWireM.requestFrom(MOD_TC_MK2_ADDR,4);//this blocks!
40
  while(TinyWireM.available() > 0)
41
    data[i++] = TinyWireM.receive();
42
    
43
  if(i)
44
  {
45
   TinyWireM.beginTransmission(MOD_TC_MK2_ADDR);
46
   TinyWireM.send(GET_TEMP);
47
   TinyWireM.endTransmission();
48
  }
49
  
50
   Toggle_Led();
51
   
52
   delay(Delay_time_ms);
53
}

von Jim M. (turboj)


Lesenswert?

> Ich verwende TinyWireM Objekt

Für USB ist das sicher das falsche Objekt. TinyWireM braucht man IMHO 
für I²C, ich sehe in dem Sketch nichts für USB. Die VID und PID sind vom 
Bootloader.

Wenn Du USB Bulk Daten austauchen wills, solltest Du Dir einen 
potenteren µC aussuchen, der USB nativ anbinden kann. Das ist mit 12 
MBit/s auch deutlich schneller, die 1,5 MBit bei low speed können 
durchaus ein Nadelöhr darstellen.

von Kahn P. (Gast)


Lesenswert?

Hallo Jim,

Es geht eher um die Kommunikation denn die schlägt bei jedem lese oder
schreibversuch, sofort fehl. Öffnen vendor/prod lesen alles kein 
Problem.

Nach dem erfolgreichen öffnen des Gerätes via Libusb0.dll

Löst bereits die blose Abfrage nach device details folgenden Fehler aus:
1
rval = usb_control_msg(dev,
2
    USB_TYPE_STANDARD | USB_RECIP_DEVICE | USB_ENDPOINT_IN,
3
    USB_REQ_GET_DESCRIPTOR, (USB_DT_STRING << 8) + index, langid,
4
    buffer, sizeof(buffer), 1000);

libusb0-dll:err [control_msg] sending control message failed, win error: 
A device attached to the system is not functioning.

Die IDE hat keine Probleme mit dem Gerät zu kommunizieren.

>>potenteren µC aussuchen
Naja es ist ja kein Spassproject, und bereits der entscheid für einen
micro-controller abgewogen.

Man möchte also nur geringe Daten gelegentlich tauschen.

Scheinbar liegt ein genereller Fehler vor.

von Jim M. (turboj)


Lesenswert?

Die USB Deskriptoren muss man nich abfragen. Die Strukturen die 
usb_get_busses() holt enthalten bereits alles nötige bis auf Strings. 
Dort sollte man sich erstmal die Endpoint Deskriptoren ansehen.

Unter Linux geht das einfach mit
1
lsusb -v

aber unter Windows kenne ich kein leider nichts vergleichbares.

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.