Forum: Mikrocontroller und Digitale Elektronik RS485 UART MOXA


von Patrick S. (patricksch)


Lesenswert?

Hallo zusammen,
ich bin bei einem Problem beim rs485 Interface.
Ich benutzte ein Xplaind Board von ATmel und einen Moxa1250i für seriell 
zu USB. Ausserdem habe ich eine Console (über den Atmel EDBG).
Das Empfangen der RS485 Schnittstelle und Ausgabe an der Konsole 
funktioniert ohne Probleme. Will ich allerdings an RS485 senden, kommt 
nie etwas an. Leider steht wenig im Datenblatt...

void init_rs485(void)
{
  PMC->PMC_PCER0 = 1 << RS485_PORT_ID;
  RS485_PORT->UART_CR = UART_CR_RSTRX | UART_CR_RSTTX| UART_CR_RXDIS | 
UART_CR_TXDIS;
  uint32_t clock_div = (MAINCK/RS485_BAUDRATE)/16;
  RS485_PORT->UART_BRGR = clock_div;
  RS485_PORT->UART_MR = 0;
  RS485_PORT->UART_MR |= UART_MR_PAR_NO;
  RS485_PORT->UART_MR |= UART_MR_CHMODE_NORMAL;
  RS485_PORT->UART_PTCR = UART_PTCR_RXTDIS | UART_PTCR_TXTDIS;
  /* Enable receiver and transmitter */
  RS485_PORT->UART_CR = UART_CR_RXEN | UART_CR_TXEN;
}

void init_pdc_rs485(void)
{
  RS485_PDC->PERIPH_RPR = &uart_receive_buffer1;
  RS485_PDC->PERIPH_RCR =  RS485_BUFFERSIZE;
  RS485_PDC->PERIPH_TPR = &uart_receive_buffer1;
  RS485_PDC->PERIPH_TCR = RS485_BUFFERSIZE;
  RS485_PDC->PERIPH_PTCR = (PERIPH_PTCR_RXTEN | PERIPH_PTCR_TXTEN);
  RS485_PORT->UART_IER = UART_IER_RXRDY;
  NVIC_EnableIRQ(UART0_IRQn);
}

void UART0_Handler(void)
{
  ioport_toggle_pin_level(LED);
  if ((RS485_PORT->UART_SR & UART_SR_RXBUFF) == UART_SR_RXBUFF)
  {
    RS485_PDC->PERIPH_RPR = &uart_receive_buffer1;
    RS485_PDC->PERIPH_RCR = RS485_BUFFERSIZE;
    RS485_PDC->PERIPH_TPR = &uart_receive_buffer1;
    RS485_PDC->PERIPH_TCR = RS485_BUFFERSIZE;
    PDC_UART1->PERIPH_TPR = &uart_receive_buffer1;
    PDC_UART1->PERIPH_TCR = RS485_BUFFERSIZE;
  }
}

Vielen Dank im Voraus. UART1 ist die Konsole

von Nosnibor (Gast)


Lesenswert?

Vielleicht vergessen, den RS-485-Treiber einzuschalten? RS-485 ist 
halbduplex; da muß man sich überlegen (und der Hardware bescheidsagen), 
wann man senden und wann empfangen will; beides gleichzeitig geht nicht.

Wenn das Board von Atmel schon einen RS-485-Treiberchip drauf hat, wird 
der UART im Prozessor das wohl automatisch können und sie werden den 
richtigen Pin angeschlossen haben. Einfach mal in der Doku zum mode 
register des UART nachsehen, ob es da RS-485-Unterstützung gibt und wie 
man die einschaltet.

Sonst: nachsehen, welcher GPIO-Pin mit Transmit-Enable am Treiber 
verbunden ist, und den "von Hand" richtig ansteuern. Vor Beginn des 
Startbits Treiber einschalten und nach Ende des letzten Stopbits 
(hoffentlich gibt es einen transmit-complete-Interrupt) wieder aus.

von Patrick S. (patricksch)


Lesenswert?

Danke erstmal für die Antwort.
Es gibt einen RE ( Receiver Enable) Pin auf dem MCU. Der geht (ist 
invertiert) beim Senden auf high.
Ich habe die Signale getestet. Es kommt auch aus dem MCU das richtige 
raus, aber der Moxa scheint das falsch zu  verarbeiten.
Hat irgendwer Erfahrungen mit dem Moxa Uport 1250i?
Besten Dank.

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.