Elektronik, Code & mehr
Item-Tag | Beschreibung |
Usage Page |
Spezifiziert die Usage Page der verwendeten Elemente. |
Logical Minimum |
Kleinste logische Einheit die übertragen wird. |
Logical Maximum |
Größte logische Einheit die übertragen wird. |
Physical Minimum |
Das Feld Logical Minimum in physikalische Größen umgerechnet. |
Physical Maximum |
Das Feld Logical Maximum in physikalische Größen umgerechnet. |
Unit Exponent |
Einheitenexponent zur Basis 10 (z. B. 3 für Kilo) |
Unit |
Einheiten-ID um die Einheit des Datenfeldes festzulegen (z. B. 2 für Masse). |
Report Size |
Legt die Größe eines Datenfeldes für ein Element in Bit fest. |
Report ID |
Report ID für ein Element. Wenn ein Report ID-Element genutzt wird, werden alle Reports um ein 8-bit großes Datenfeld für die ID erweitert. |
Report Count |
Legt die Anzahl der Datenfelder für ein Element fest. |
Push |
Platziert eine Kopie der globalen Statustabelle der Elemente auf dem Stack. |
Pop |
Ersetzt die Statustabelle für die Elemente mit der aktuellen Tabelle vom Stack. |
Item-Tag | Beschreibung |
Input | Ausgelesene Daten von einem oder mehreren Steuerungselementen. |
Output | Daten für die Steuerung von einem oder mehreren Elementen. |
Feature | Ein- oder Ausgabedaten, die nicht für eine Interaktion mit dem Nutzer verwendet werden. |
Collection | Eine Gruppierung von Input-, Output- oder Feature-Items. |
End Collection | Markiert das Ende einer Collection. |
bmRequestType | bReqest | wValue | wIndex | wLength | Data |
0xA1 | GET_REPORT (1) |
Art des Reports und die Report-ID | Interface | Länge des Reports | Report |
0xA1 | GET_IDLE (2) |
0 | Interface | 1 | Idle-Zeit |
0xA1 | GET_PROTOCOL (3) |
0 | Interface | 1 |
0 – Boot-Protokoll 1 – Report Protokoll |
0x21 | SET_REPORT (9) |
Art des Reports und die Report ID | Interface | Länge des Reports | Report |
0x21 | SET_IDLE (10) |
Idle-Zeit und Report-ID | Interface | 0 | – |
0x21 | SET_PROTOCOL (11) |
0 – Boot-Protokoll 1 – Report Protokoll |
Interface | 0 | – |
Item-Tag | Beschreibung |
Usage |
Spezifiziert den Usage Index und ergibt zusammen mit der Usage Page die fertige Gruppe. |
Usage Minimum |
Definiert den Startwert für eine Gruppe von Anwendungszwecken für mehrere Eingabemethoden. |
Usage Maximum |
Definiert den Endwert für eine Gruppe von Anwendungszwecken für mehrere Eingabemethoden. |
Designator Index |
Bezeichner eines entsprechenden Physical-Deskriptors um die Art der Eingabe zu definieren. |
Designator Minimum |
Definiert den Startwert für eine Gruppe von Bezeichnern für mehrere Eingabemethoden. |
Designator Maximum |
Definiert den Endwert für eine Gruppe von Bezeichnern für mehrere Eingabemethoden. |
String Index |
Index des String-Deskriptors um die jeweilige Eingabemethode zu beschreiben. |
String Minimum | Legt den Startwert für eine Gruppe von Strings fest um mehrere Eingabemethoden zu benennen. |
String Maximum | Legt den Endwert für eine Gruppe von Strings fest um mehrere Eingabemethoden zu benennen. |
Delimiter |
Definiert den Angang (1) oder das Ende (0) eines lokalen Elements. |
bmRequestType | bReqest | wValue | wIndex | wLength | Data |
0x00 0x01 0x02 |
CLEAR_FEATURE (1) |
Feature |
Null Interface Endpunkt |
0 | – |
0x80 | GET_CONFIGURATION (8) |
0 | 0 | 1 | Konfiguration |
0x80 | GET_DESCRIPTOR (6) |
Deskriptortyp (H) und Deskriptorindex (L) |
Null oder Sprach ID | Länge des Deskriptors | Deskriptor |
0x81 | GET_INTERFACE (10) |
0 | Interface | 1 | Interface |
0x80 0x81 0x82 |
GET_STATUS (0) |
0 |
0 Interface Endpunkt |
2 | Gerät-, Interface- oder Endpunktstatus |
0x00 | SET_ADDRESS (5) |
Geräteadresse | 0 | 0 | – |
0x00 | SET_CONFIGURATION (9) |
Konfiguration | 0 | 0 | – |
0x00 | SET_DESCRIPTOR (7) |
Deskriptortyp (H) und Deskriptorindex (L) |
Null oder Sprach ID | Länge des Deskriptors | Deskriptor |
0x00 0x01 0x02 |
SET_FEATURE (3) |
Feature |
0 Interface Endpunkt |
0 | – |
0x01 | SET_INTERFACE (11) |
Interface | Interface | 0 | – |
0x82 | SYNCH_FRAME (12) |
0 | Endpunkt | 2 | Framezähler |
Offset | Feld | Größe | Beschreibung |
|
0 | bLength | 1 | Größe des Deskriptors in Bytes | |
1 | bDescriptorType | 1 | ENDPOINT Deskriptor (Feld = 5) | |
2 | bEndpointAddress | 1 | Adresse des Endpunktes | |
Bit 7: Richtung |
0 = OUT 1 = IN |
|||
Bit 6 – 4 | 0 | |||
Bit 3 – 0: Endpunktnummer |
0 – 15 | |||
3 | bmAttributes | 1 | Bit 7 – 6 | 0 |
Bit 5 – 4: Verwendung |
Nur für Isochrone Endpunkte. Andernfalls 0. 0 = Data endpoint |
|||
Bit 3 – 2: Synchronisation |
Nur für Isochrone Endpunkte. Andernfalls 0. 0 = No Synchronisation |
|||
Bit 1 – 0: Transfer |
0 = Control 1 = Isochronous 2 = Bulk 3 = Interrupt |
|||
4 | wMaxPacketSize | 2 | Maximale Paketgröße, die dieser Endpunkt senden oder empfangen kann | |
6 | bInterval | 1 | Polling Intervall für den Endpunkt in ms Schritten für Low und Full Speed Devices oder in 125 us Schritten für High Speed Devices |
Offset | Feld | Größe | Beschreibung |
0 | bLength | 1 | Größe des Deskriptors in Bytes |
1 | bDescriptorType | 1 | GERÄTE-Deskriptor (Feld = 0x01) |
2 | bcdUSB | 2 | Verwendete USB Version |
4 | bDeviceClass | 1 | Durch das USB-IF vergebener Klassencode |
5 | bDeviceSubClass | 1 | Durch das USB-IF vergebener Subklassencode |
6 | bDeviceProtocol | 1 | Durch das USB-IF vergebener Protokolcode |
7 | bMaxPacketSize0 | 1 |
Maximale Paketgröße für Endpunkt 0. Muss entweder 8, 16, 32 oder 64 sein |
8 | idVendor | 2 | Durch das USB-IF vergebene Vendor-ID |
10 | idProduct | 2 | Durch den Hersteller vergebene Produkt-ID |
12 | bcdDevice | 2 | Releasenummer des Gerätes |
14 | iManufacturer | 1 | Index des Stringdeskriptors, der den Hersteller beschreibt |
15 | iProduct | 1 | Index des Stringdeskriptors, der das Produkt beschreibt |
16 | iSerialNumber | 1 | Index des Stringdeskriptors, der die Seriennummer beschreibt |
17 | bNumConfigurations | 1 | Anzahl der Gerätekonfigurationen |
Offset | Feld | Größe | Beschreibung |
|
0 | bLength | 1 | Größe des Deskriptors in Bytes | |
1 | bDescriptorType | 1 | KONFIGURATIONS-Deskriptor (Feld = 0x02) | |
2 | wTotalLength | 2 | Größe dieses und aller anderen Deskriptoren | |
4 | bNumInterfaces | 1 | Anzahl der Interfaces, die durch diesen Deskriptor unterstützt werden | |
5 | bConfigurationValue | 1 | Index der durch eine SET_CONFIGURATION-Anfrage genutzt werden muss um diese Konfiguration zu laden | |
6 | iConfiguration | 1 | Index des Stringdeskriptors, der diese Konfiguration beschreibt | |
7 | bmAttributes | 1 | Bit 7 | 1 |
Bit 6 | Self-powered | |||
Bit 5 | Remote Wakeup | |||
Bit 4 – 0 | 0 | |||
8 | bMaxPower | 1 | Maximale Stromaufnahme des Gerätes in 2 mA Schritten |
Offset | Feld | Größe | Beschreibung |
0 | bLength | 1 | Größe des Deskriptors in Bytes |
1 | bDescriptorType | 1 | INTERFACE-Deskriptor (Feld = 0x04) |
2 | bInterfaceNumber | 1 | Interface ID |
3 | bAlternateSetting | 1 | Alternative Einstellungen für dieses Interface |
4 | bNumEndpoints | 1 | Anzahl der Endpunkte, die für dieses Interface genutzt werden (ohne Endpunkt 0) |
5 | bInterfaceClass | 1 | Durch das USB-IF vergebener Klassencode |
6 | bInterfaceSubClass | 1 | Durch das USB-IF vergebener Subklassencode |
7 | bInterfaceProtocol | 1 | Durch das USB-IF vergebener Protokollcode |
8 | iInterface | 1 | Index des Stringdeskriptors, der dieses Interface beschreibt |
Transferart | Paketgrößen in Bytes | Beschreibung |
Bulk |
Low Speed: Nicht erlaubt Full Speed: 8, 16, 32, 64 High Speed: Bis zu 512 |
Der Bulk Transfer wird immer dann genutzt, wenn viele Daten fehlerfrei übertragen werden müssen. In diesem Modus wird die Bandbreite auf Grund der Fehlerkontrolle nicht garantiert. |
Interrupt |
Low Speed: 1 bis 8 Full Speed: 1 bis 64 High Speed: Bis zu 1024 |
Der Interrupt Transfer wird dort eingesetzt, wo normalerweise Interrupts genutzt würden um das Vorhandensein von Daten zu signalisieren. Wird in den meisten Fällen für die Kommunikation vom Device zum Host genutzt. |
Isochronous |
Low Speed: Nicht erlaubt Full Speed: Bis zu 1023 High Speed: Bis zu 1024 |
Beim Isochronous Transfer wird eine feste Bandbreite im Austausch für die Fehlerfreiheit garantiert. Diese Art der Übertragung wird z. B. im Audio- oder Videobereich genutzt. |
Control |
Low Speed: 8 Full Speed: 8, 16, 32, 64 High Speed: 64 |
Ein bidirektionaler Transfer, der sowohl eine IN, wie auch eine OUT Transaktion nutzt. Der Control Transfer wird ausschließlich für die Konfiguration des Gerätes genutzt und überträgt Daten nur zum Endpunkt 0. Jeder Control Transfer besteht aus einer SETUP, einer DATA und einer STATUS Stage. Die SETUP Stage beschreibt die Anfrage vom Host und die DATA Stage beinhaltet die Daten vom Gerät, falls notwendig. |
Spezifiziert die unterstützten Sprachen der Strings
Offset | Feld | Größe | Beschreibung |
0 | bLength | 1 | Größe des Deskriptors in Bytes |
1 | bDescriptorType | 1 | STRING-Deskriptor (Feld = 0x03) |
2 | wLANGID[0] | 2 | LANGID Code 0 |
… | … | … | … |
2 + x * 2 | wLANGID[x] | 2 | LANGID Code x |
Offset | Feld | Größe | Beschreibung |
0 | bLength | 1 | Größe des Deskriptors in Bytes |
1 | bDescriptorType | 1 | STRINGDeskriptor (Feld = 3) |
2 | bString | n | n Zeichen langer String im Unicode Format |
Offset | Feld | Größe | Beschreibung |
0 | bLength | 1 | Größe des Deskriptors in Bytes |
1 | bDescriptorType | 1 | HID-Deskriptor (Feld = 0x21) |
2 | bcdHID | 2 | Verwendete Version der HID-Spezifikation |
4 | bCountryCode | 1 | Ländercode für die verwendeten Hardware |
5 | bNumDescriptors | 1 | Anzahl der Klassendeskriptoren (muss mind. 1 betragen). |
6 | bDescriptorType | 1 | Typ des nachfolgenden Deskriptors |
7 | wDescriptorLength | 2 | Länge des Deskriptors |
9 | [bDescriptorType] | 1 | Typ des optional nachfolgenden Deskriptors |
10 | [wDescriptorLength]] | 2 | Länge des optionalen Deskriptors |
Offset | Length | Description |
---|---|---|
0x00 | 3 bytes | Part of the bootstrap program. |
0x03 | 8 bytes | Optional manufacturer description. |
0x0b | 2 bytes | Number of bytes per block (almost always 512). |
0x0d | 1 byte | Number of blocks per allocation unit. |
0x0e | 2 bytes | Number of reserved blocks. This is the number of blocks on the disk that are not actually part of the file system; in most cases this is exactly 1, being the allowance for the boot block. |
0x10 | 1 byte | Number of File Allocation Tables. |
0x11 | 2 bytes | Number of root directory entries (including unused ones). |
0x13 | 2 bytes | Total number of blocks in the entire disk. If the disk size is larger than 65535 blocks (and thus will not fit in these two bytes), this value is set to zero, and the true size is stored at offset 0x20. |
0x15 | 1 byte | Media Descriptor. This is rarely used, but still exists. . |
0x16 | 2 bytes | The number of blocks occupied by one copy of the File Allocation Table. |
0x18 | 2 bytes | The number of blocks per track. This information is present primarily for the use of the bootstrap program, and need not concern us further here. |
0x1a | 2 bytes | The number of heads (disk surfaces). This information is present primarily for the use of the bootstrap program, and need not concern us further here. |
0x1c | 4 bytes | The number of hidden blocks. The use of this is largely historical, and it is nearly always set to 0; thus it can be ignored. |
0x20 | 4 bytes | Total number of blocks in the entire disk (see also offset 0x13). |
0x24 | 2 bytes | Physical drive number. This information is present primarily for the use of the bootstrap program, and need not concern us further here. |
0x26 | 1 byte | Extended Boot Record Signature This information is present primarily for the use of the bootstrap program, and need not concern us further here. |
0x27 | 4 bytes | Volume Serial Number. Unique number used for identification of a particular disk. |
0x2b | 11 bytes | Volume Label. This is a string of characters for human-readable identification of the disk (padded with spaces if shorter); it is selected when the disk is formatted. |
0x36 | 8 bytes | File system identifier (padded at the end with spaces if shorter). |
0x3e | 0x1c0 bytes | The remainder of the bootstrap program. |
0x1fe | 2 bytes | Boot block ’signature‘ (0x55 followed by 0xaa). |
Hallo,
ich finde Dein Tutorial echt klasse. Es beschreibt die notwendigen Funktionen sehr gut und ohne viel overhead.
In einem Projekt mit einem ATXMega 128 brauch ich gerade die internen ADC’s. Leider scheint dazu das Tutorial noch nicht fertig zu sein.
Weist Du schon ungefähr wann du dies fertig machen wirst? (je eher umso besser für mich)
VG Tobias
Hi,
danke für das Feedback. Ich habe dir auch direkt mal eine Antowortmail geschrieben :)
Gruß
Daniel
Echt Klasse tutorials, suche das ganze Internet um was gut erklärtes zu finden. Hier ist man richtig…Danke
Danke für das Lob :)
Sobald ich etwas Zeit über habe, wollte ich das Tutorial ergänzen.
Falls aber dennoch Fragen da sein sollten oder Hilfe benötigt wird schreibt mir ruhig eine E-Mail :)
Hallo,
Ich schließe mich meinem Vorredner an, das Tutorial auf dieser Seite hat mir bisher wirklich sehr geholfen. Einfach super!
Ich bin relativ neu bei der Mikrokontrollerprogrammierung und probiere gerade I2C auf einem Xmega32 zum laufen zu bekommen. Mit dem Xmega möchte ich einen Beschleunigungssensor MPU-6050 über I2C auslesen. Es gibt viele verschiedene Ansätze wie man das bewerkstelligen kann, aber alle Projekte, die ich gesehen habe, benutzen einen Arduino. Sogar die I2cdevlib-Bibliothek ist eigentlich nur für Arduino gedacht und ich bin ehrlich gesagt ein bisschen überfordert, wenn ich diese Bibliothek für das AtmelAvr Studio konvertieren soll ;)
Kannst du mir Tipps geben, oder kennst du schon vorgefertigte Bibliotheken für I2C und den MPU-6050?
Ich programmiere mit einem AVRICE und dem Atmelstudio 6.
Ich freue mich über eine Antwort!
Viele Grüße
Matthias
Hallo Matthias,
fertige Libs habe ich leider nicht und den Sensor an sich kenne ich auch nichts.
Den I²C vom XMega habe ich bisher auch noch nicht benutzt. Ich muss mal schauen wie der funktioniert aber ich denke mal nicht groß anders als beim Mega32.
Wobei brauchst du den genau Hilfe?
Geht es um die Initialisierung des Buses oder um die Datenübertragung?
Ich wollte am Wochenende mal (vorausgesetzt ich komme dazu) die Kommunikation von einem XMega und einem PCF8574 bzw. einem EEPROM via I²C herstellen und dokumentieren.
Vielleicht hilft dir das ja schon weiter :)
Gruß
Daniel
Danke für die Antwort!
Momentan stecke ich sogar noch bei der Initialisierung des Busses fest. Ich habe auf atmel.com ein Beispiel gefunden, wie man es hinbekommt, dass ein ATXmega mit sich selbst über I2C kommuniziert, aber das hilft mir nicht sonderlich weiter.
Du kannst ja auch mal wenn du willst einen Blick auf den Code, den ich gerade zum Testen verwende, werfen. Ich habe ihn größtenteils aus dem Atmelbeispiel (www.atmel.com/Images/AVR1308.zip, http://www.atmel.com/Images/doc8054.pdf) zusammengebastelt. Der interessante Teil steht in der Main Funktion (ab Zeile 102):
http://pastebin.com/UPZDBx9Z
Bis jetzt funktioniert der Code noch nicht. Mein Mikrocontroller bleibt in der Schleife Zeile 141 hängen. Irgendetwas scheint da noch nicht zu passen
Ich wollte, nachdem die Kommunkikation beendet wurde, den übermittelten Wert mit meinem Debugger auslesen.
Doch eines verstehe ich noch nicht an dem Code: Im Atmelbeispiel wurde die Slave-Adresse 0x55 definiert (bei meinem Code in Zeile 13):
#define SLAVE_ADDRESS 0x55 //nur Beispiel
Aber auf was bezieht sich diese Adresse? Ist das die Adresse des ATXMega TWI Interface? Oder wurde sie einfach willkürlich gewählt? Dazu finde ich auch nichts in den Datenblättern
Gerne können wir diese Unterhaltung auch per Email fortführen, auf dieser Seite wird es vielleicht schnell unübersichtlich. Oder ich gedulde mich einfach so lange, bis du dein I2C-Versuch dokumentiert hast ;)
Viele Grüße
Matthias
Hey,
ja führen wir die Unterhaltung mal per Mail weiter.
Die Adresse 0x55 sollte ein willkürlich gewählter Wert sein.
Da der Chip selber keine Adresspins hat (wie ein I²C Device) musst du die Adresse Softwareseitig vergeben.
Ich weiß auch nicht ob eine Kommunikation zwischen zwei Mastern bzw. zwei µC wirklich das einfachste ist um mit dem I²C anzufangen :)
Ich würde erstmal klein anfangen, sprich einen PCF8574 oder eine RTC bzw. ein EEPROM anquatschen und schauen das man den Bus zum laufen bekommt.
Sobald der Bus am laufen ist kann man weiter machen aber du musst halt erstmal eine funktionierende Grundlage schaffen sonst suchst du dir einen Wolf.
Gruß
Daniel
echt super deine sammlung. kannst du auch mal was zum usb mit atxmega128a1U reinstellen? ich such schon überall, und find nix..
ich würde gerne meine UART schnittstelle gegen CDC eintauschen, somit entfällt der ft232rl :)
Hey,
ja kann ich gerne machen.
Aber das dauert noch, da ich mir erstmal neue Hardware zulegen muss (mein Experimentierboard mit USB und allem ist kaputt :( ).
das trifft sich ja dann gut :)
der xmega a1u hat hat usb on chip :)
freue mich auf dein tutorial.
Hey,
ich dachte an das XMegaB3U (oder so).
Aber vor nächstem Jahr mache ich da eh nichts dran und Anfang nächsten Jahres ist Klausurzeit, sprich es dauert wirklich noch eine Weile :)
Gruß
Daniel