Hallo,
ich habe hier einen AT32UC3B1512, mit welchem ich AT-Kommandos an ein
GSM-Modul senden und empfangen will. Alle Daten werden korrekt
übertragen, was ich auf einem Oszilloskop verifizieren konnte (im
Beispiel sende ich ein "AT#SLED=0", welches die Status-LED des
GSM-Moduls ausschaltet. Dies funktioniert auch). Die Antwort gebe ich
über USB mit einem virtuellen Com-Port auf das Terminal des Rechners
aus. Dort kommt jeedoch nur ein Bruchteil der erwarteten Antwort an (in
diesem Fall #\n statt #AT OK). Die Baud-Rate beträgt 9600 8N1, aber auch
bei schnelleren oder langsameren Raten tritt das Problem auf. Der
Prozessor läuft mit 60MhZ. Die Timings sollten auch alle stimmen, ein
delay_ms(1000) dauert laut Messung genau eine Sekunde. Leider ist die
Dokumentation zu den AVR32ern sehr dürftig. Daher würde ich mich freuen,
wenn jemand einen Tipp hätte.
Vielen Dank!
Kai
Die Interrupt-Routine:
1 | __attribute__((__interrupt__))
|
2 | static void usart_int_handler(void)
|
3 | {
|
4 | udi_cdc_putc(usart_getchar(USART_GSM));
|
5 | }
|
Die Main-Funktion:
1 | int main (void)
|
2 |
|
3 | {
|
4 | board_init();
|
5 | pcl_freq_param_t pcl_freq_param =
|
6 | {
|
7 | .cpu_f = APPLI_CPU_SPEED,
|
8 | .pba_f = APPLI_PBA_SPEED,
|
9 | .osc0_f = FOSC0,
|
10 | .osc0_startup = OSC0_STARTUP
|
11 | };
|
12 | Enable_global_interrupt();
|
13 | pcl_configure_clocks(&pcl_freq_param);
|
14 | irq_initialize_vectors();
|
15 |
|
16 | sysclk_init();
|
17 | sysclk_enable_usb();
|
18 | init_gsm();
|
19 |
|
20 | udc_start();
|
21 | udc_attach();
|
22 |
|
23 | delay_ms(1000);gpio_tgl_gpio_pin(LED_PLL_LD_PIN);
|
24 | delay_ms(1000);gpio_tgl_gpio_pin(LED_PLL_LD_PIN);
|
25 | delay_ms(1000);gpio_tgl_gpio_pin(LED_PLL_LD_PIN);
|
26 | INTC_register_interrupt(&usart_int_handler, USART_GSM_IRQ, AVR32_INTC_INT0);
|
27 | USART_GSM->ier = AVR32_USART_IER_RXRDY_MASK;
|
28 |
|
29 | delay_ms(1000);
|
30 | delay_ms(1000);
|
31 | delay_ms(1000);
|
32 | delay_ms(1000);
|
33 | send_AT_cmd("AT#SLED=0\r");
|
34 |
|
35 |
|
36 | while(1)
|
37 | }
|
38 | }
|
Die Initialisierung des GSM-Moduls:
1 | void init_gsm()
|
2 | {
|
3 | static const gpio_map_t USART_GSM_GPIO_MAP =
|
4 | {
|
5 |
|
6 | {USART_GSM_RX_PIN, USART_GSM_RX_FUNCTION},
|
7 | {USART_GSM_TX_PIN, USART_GSM_TX_FUNCTION},
|
8 | };
|
9 |
|
10 | static const usart_options_t USART_GSM_OPTIONS =
|
11 | {
|
12 | .baudrate = 9600,
|
13 | .charlength = 8,
|
14 | .paritytype = USART_NO_PARITY,
|
15 | .stopbits = USART_2_STOPBITS,
|
16 | .channelmode = USART_NORMAL_CHMODE,
|
17 | };
|
18 |
|
19 | gpio_enable_module(USART_GSM_GPIO_MAP, sizeof(USART_GSM_GPIO_MAP) / sizeof(USART_GSM_GPIO_MAP[0]));
|
20 | usart_init_rs232(USART_GSM, &USART_GSM_OPTIONS, 60000000);
|
21 | gpio_enable_gpio_pin(GSM_ON_OFF);
|
22 | gpio_set_gpio_pin(GSM_ON_OFF);
|
23 | delay_ms(1050);
|
24 | gpio_clr_gpio_pin(GSM_ON_OFF);
|
25 | }
|