Hi,
ich hab ein paar Schwierigkeiten mit dem USART vom AT91SAM9263
Controller. Die DMX-Daten kommen zwar an, aber ich kann nicht auf den
Break-Impulse synchronisieren (es findet kein Frame-Error etc. statt).
Die übertragenen DMX-Werte werden jedoch richtig erkannt und dargestellt
- nur auf der falschen Position.
1 | void USART_Configure(AT91S_USART *usart,
|
2 | unsigned int mode,
|
3 | unsigned int baudrate,
|
4 | unsigned int masterClock)
|
5 | {
|
6 |
|
7 | // Reset and disable receiver & transmitter
|
8 | usart->US_CR = AT91C_US_RSTRX | AT91C_US_RSTTX | AT91C_US_RXDIS | AT91C_US_TXDIS;
|
9 |
|
10 | // Configure mode
|
11 | usart->US_MR = mode;
|
12 |
|
13 | // Configure baudrate
|
14 | // Asynchronous, no oversampling -> dmx is asynchron
|
15 | if(((mode & AT91C_US_SYNC) == 0)
|
16 | && ((mode & AT91C_US_OVER) == 0)) {
|
17 |
|
18 | usart->US_BRGR = (masterClock / baudrate) / 16;
|
19 | }
|
20 |
|
21 |
|
22 | }
|
23 |
|
24 |
|
25 | void Usart_Init(void)
|
26 | {
|
27 | unsigned int mode = AT91C_US_USMODE_NORMAL
|
28 | | AT91C_US_CLKS_CLOCK
|
29 | | AT91C_US_PAR_NONE
|
30 | | AT91C_US_CHRL_8_BITS
|
31 | | AT91C_US_NBSTOP_2_BIT
|
32 | | AT91C_US_CHMODE_NORMAL;
|
33 |
|
34 | AT91F_US0_CfgPMC();
|
35 | AT91F_US0_CfgPIO();
|
36 | USART_Configure(AT91C_BASE_US0, mode, 250000, CLOCK_FREQ2);
|
37 | AT91C_BASE_US0->US_IER = AT91C_US_RXRDY | AT91C_US_FRAME;
|
38 | AT91F_AIC_ConfigureIt();
|
39 | AT91F_AIC_EnableIt();
|
40 | AT91C_BASE_US0->US_CR = AT91C_US_RXEN;
|
41 | }
|
Vielleicht hat jmd von euch eine Idee, an was das liegen könnte. Wenn
ich die Baudrate ändere, dann bekomm ich Framing-Error angezeigt, jedoch
sind natürlich dann auch die DMX-Werte falsch.
Gruß
Bernd