Forum: Mikrocontroller und Digitale Elektronik AT32UC3B1512 UART verschluckt Zeichen


von Kai S. (hugstuart)


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
}

von Kai S. (hugstuart)


Lesenswert?

Hat keiner eine Idee?

von Kai S. (hugstuart)


Lesenswert?

So, habe das Problem selber lösen können. Falls es noch jemanden 
interessieren sollte: Die Stopp-Bit-Konfiguration war falsch. Statt 
einem Stopp-Bit waren zwei eingestellt, wodurch die Synchronisation 
natürlich unmöglich wurde.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.