Hallo Forum, ich probiere gerade den ATxmega128A3U mit USB vernünftig zu laufen zu bekommen und nutze als Grundlage Beispiele aus dem ASF. Als erstes soll der xmega als cdc device arbeiten und hier tauchen schon die ersten Probleme auf. Sobald eine zu große Datenmenge (>320Byte) in die Routine "udi_cdc_write_buf" geschrieben wird bleibt der xmega in der "udi_cdc_multi_is_tx_ready" Schleife des ASF-Codes hängen. Anscheinend passiert das, wenn der Buffer überläuft bzw. die neue Nachricht nicht hineinpasst. Die einzelnen Aufrufe umfassen jeweils 22Byte Daten und der Buffer fasst 320Byte. Vielleicht liegt es auch am leeren des Buffers durch den Stack? Hatte jemand schon dieses Problem und weiß evtl. Rat? Aufruf:
1 | while (GetLog(&Log) == 1) |
2 | {
|
3 | count++; |
4 | sprintf(TransferString, "Test %02d.%02d.%02d.%02d.%02d" , Log.DateTime.Day, Log.DateTime.Month, Log.DateTime.Year, Log.DateTime.Hour, Log.DateTime.Minute); |
5 | if (!udi_cdc_is_tx_ready()) |
6 | {
|
7 | udi_cdc_signal_overrun(); |
8 | }
|
9 | else
|
10 | {
|
11 | udi_cdc_write_buf(TransferString, sizeof(TransferString)); |
12 | }
|
13 | |
14 | }return count; |
die write Funktion des ASF:
1 | iram_size_t udi_cdc_multi_write_buf(uint8_t port, const int* buf, iram_size_t size) |
2 | {
|
3 | irqflags_t flags; |
4 | uint8_t buf_sel; |
5 | uint16_t buf_nb; |
6 | iram_size_t copy_nb; |
7 | uint8_t *ptr_buf = (uint8_t *)buf; |
8 | |
9 | if (9 == udi_cdc_line_coding[PORT].bDataBits) { |
10 | size *=2; |
11 | }
|
12 | // hier die dann entstehende Endlosschleife
|
13 | |
14 | udi_cdc_write_buf_loop_wait:
|
15 | // Check avaliable space
|
16 | if (!udi_cdc_multi_is_tx_ready(PORT)) { |
17 | if (!udi_cdc_running[PORT]) { |
18 | return size; |
19 | }
|
20 | goto udi_cdc_write_buf_loop_wait; |
21 | }
|
22 | |
23 | // Write values
|
24 | flags = cpu_irq_save(); |
25 | buf_sel = udi_cdc_tx_buf_sel[PORT]; |
26 | buf_nb = udi_cdc_tx_buf_nb[PORT][buf_sel]; |
27 | copy_nb = UDI_CDC_TX_BUFFERS - buf_nb; |
28 | if (copy_nb>size) { |
29 | copy_nb = size; |
30 | }
|
31 | memcpy(&udi_cdc_tx_buf[PORT][buf_sel][buf_nb], ptr_buf, copy_nb); |
32 | udi_cdc_tx_buf_nb[PORT][buf_sel] = buf_nb + copy_nb; |
33 | cpu_irq_restore(flags); |
34 | |
35 | // Update buffer pointer
|
36 | ptr_buf = ptr_buf + copy_nb; |
37 | size -= copy_nb; |
38 | |
39 | if (size) { |
40 | goto udi_cdc_write_buf_loop_wait; |
41 | }
|
42 | |
43 | return 0; |
44 | }
|