Benny schrieb:
> Habe bisher immer mit 8051er gearbeitet und hinten dran ein FT232RL (von
> FTDI) mit dem konnte man über eine DLL Funktionen aufrufen um mit dem
> Burschen zu kommunizieren.
Du kannst eine serielle Schnittstelle simulieren.
Dazu gibt es ein Atmel app note .... AVR272_USB_CDC_Virtual_Com_Port
die Series4 Version passt zum Atmega32u4.
Die Ordner
->modules
->lib_mcu
und deren Unterordner und Files müssen ins Projekt eingebunden werden.
Im Ordner Demo befinden sich die Dateien, welche spezifisch für die
Anwendung
verändert, bzw. erstellt worden sind. Sowie die Treiber *.inf Datei !!!!
D.h. eingebunden werden müssen die in diesem Ordner vorhandenen .c und
.h Files.
Auch der Unterordner conf muss eingebunden werden.
In cdc_task.c findet sich die eigentliche Abhandlung wieder.
Im Beispiel wird eine USB-UART Bridge gebaut, diese kann man aber
einfach verändern.
1 | //! @brief This function initializes the hardware ressources required for CDC demo.
|
2 | //!
|
3 | //!
|
4 | //! @param none
|
5 | //!
|
6 | //! @return none
|
7 | //!
|
8 | //!/
|
9 | void cdc_task_init(void)
|
10 | {
|
11 | Usb_enable_sof_interrupt();
|
12 | }
|
13 |
|
14 |
|
15 |
|
16 | //! @brief Receive data from USB(Serial Port)
|
17 | //!
|
18 | //! RX from USB Handling
|
19 | //!
|
20 | //! @param none
|
21 | //!
|
22 | //! @return none
|
23 | void cdc_task(void)
|
24 | {
|
25 |
|
26 | if(Is_device_enumerated()) //Enumeration processs OK and COM port openned ?
|
27 | {
|
28 |
|
29 | if (uart_usb_test_hit()) // Something received from the USB ?
|
30 | {
|
31 |
|
32 | while (rx_counter)
|
33 | {
|
34 | //Loopback
|
35 | U8 sbyte = uart_usb_getchar();
|
36 | usb_sendbyte(&sbyte);
|
37 | }
|
38 | }
|
39 | }
|
40 | }
|
41 |
|
42 | //! @brief sof_action
|
43 | //!
|
44 | //! This function increments the cpt_sof counter each times
|
45 | //! the USB Start Of Frame interrupt subroutine is executed (1ms)
|
46 | //! Usefull to manage time delays
|
47 | //!
|
48 | //! @warning Code:?? bytes (function code length)
|
49 | //!
|
50 | //! @param none
|
51 | //!
|
52 | //! @return none
|
53 | void sof_action()
|
54 | {
|
55 | cpt_sof++;
|
56 | }
|
57 |
|
58 | void usb_sendbyte(U8* tsend){
|
59 | U8 save_ep;
|
60 |
|
61 | if(Is_device_enumerated())
|
62 | {
|
63 | save_ep=Usb_get_selected_endpoint();
|
64 | Usb_select_endpoint(TX_EP);
|
65 | uart_usb_send_buffer(tsend,1);
|
66 | Usb_select_endpoint(save_ep);
|
67 | }
|
68 |
|
69 | }
|
Im passenden .h file noch den Eintrag hinzufügen
1 | void usb_sendbyte(U8* tsend);
|
In der Main-Routine sollte man dann noch folgendes einfügen
1 | wdtdrv_disable();
|
2 | Clear_prescaler();
|
3 | scheduler();
|
Es wird dann der USB-Scheduler in einer Endlosschleife ausgeführt.
Will man also etwas nebenbei ausführen, muss das in diese Schleife rein.
->modules->scheduler->scheduler.c
Damit sollte es laufen.
Das Testprogramm oben schickt jedes byte, welches über den COM-Port
geschickt wurde wieder zurück.
mfg