AT32UC3B1512 UART verschluckt Zeichen

OP #3062535
Lesenswert?

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
}

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren