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
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.
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.