Nein, du musst da nichts extern dranhängen, das macht der AT90USB1287
allein. Aber ich kann Stefan nur beipflichten, ich habe vor kurzem
den AT90USB1287-Support für µracoli gezimmert (ein reiner CDC-Modul),
es kommt auf ganz viele Kleinigkeiten bei diesem Chip an. Um mal nur
die init-Funktion aus µracoli zu zitieren:
1 | void hif_init(const uint16_t baudrate)
|
2 | {
|
3 | /* ... some debug stuff... */
|
4 | /*
|
5 | * Enable the USB macro, the VCC pad (which is misnamed "OTG
|
6 | * pad"), and the Vbus transition interrupt.
|
7 | */
|
8 | USBCON = _BV(USBE) | _BV(OTGPADE) | _BV(VBUSTE);
|
9 |
|
10 | if (USBSTA & _BV(VBUS))
|
11 | {
|
12 | /* We are already connected to the USB. */
|
13 |
|
14 | /*
|
15 | * Start USB clock PLL.
|
16 | */
|
17 | PLLCSR = PLLSETUP;
|
18 | while ((PLLCSR & _BV(PLOCK)) == 0)
|
19 | {
|
20 | /* wait for PLL lock */
|
21 | }
|
22 | /*
|
23 | * Enable the end-of-reset and suspend function interrupts.
|
24 | * Activate the voltage regulator. Unfreeze the clock, and
|
25 | * attach.
|
26 | */
|
27 | UDIEN = _BV(EORSTE) | _BV(SUSPE);
|
28 | UHWCON |= _BV(UVREGE);
|
29 | USBCON &= ~_BV(FRZCLK);
|
30 | UDCON &= ~_BV(DETACH);
|
31 |
|
32 | attached_to_usb = true;
|
33 | }
|
34 | else
|
35 | {
|
36 | /*
|
37 | * We are not connected to the USB: wait for the bus power
|
38 | * being detected (which triggers a VBUSTI interrupt).
|
39 | */
|
40 | attached_to_usb = false;
|
41 | }
|
42 |
|
43 | rxhead = rxtail = 0;
|
44 | }
|
Das dürfte so ziemlich die minimale Sequenz sein, mit der du das
Gerät dem Host erst einmal verkündigst. Danach geht es aber dann
erst richtig los ;-), dann musst du nämlich den ganzen Setup-Kram
vom Host abhandeln. Ich denke, dass die 1400 Zeile Code, die ich
im µracoli dafür aufgewendet habe, so ziemlich das Minimum
darstellen dürften, was man benötigt, um ein CDC-Device zu
implementieren.