Hallo,
bei meinem AT91SAM9261 Board möchte ich jetzt die USART mit PDC nutzen.
Hier habe ich jetzt ein paar Fragen bezüglich der richtigen
Implementierung.
1.) Sollte man den Empfang und das Senden über den Interrupt steuern
lassen? Damit meine ich, dass das USART Modul zwei große Buffer (TX und
RX) hat, die aus der main heraus gelesen oder gefüllt werden. In der ISR
werden dann Chunks aus/in den Modulbuffer von/aus den PDC Banken
kopiert. Das sind meiner Meinung nach ziemlich viele Kopieroperationen,
welche die Performance schwächen.
2.) Ist es besser, eventuell nur den RXBUFF und Timeout Interrupt zu
behandeln und das Senden manuell zu handeln? Zum Beispiel:
1 | int32_t usart_IsTxReady(void)
|
2 | {
|
3 | uint32_t _ui32Status = 0;
|
4 |
|
5 | _ui32Status = usart1->US_CSR;
|
6 | if ((_ui32Status & AT91C_US_ENDTX) && (_ui32Status & AT91C_US_TXBUFE))
|
7 | return TRUE;
|
8 | else
|
9 | return FALSE;
|
10 |
|
11 | }
|
12 |
|
13 | int32_t usart_putsl(uint8_t* ui8DataPtr, uint32_t ui32Size)
|
14 | {
|
15 |
|
16 | if (usart1->US_TCR == 0) {
|
17 | usart1->US_TPR = (unsigned int) ui8DataPtr;
|
18 | usart1->US_TCR = ui32Size;
|
19 | usart1->US_PTCR = AT91C_PDC_TXTEN;
|
20 | /* wait till ready */
|
21 | while (usart_IsTxReady() == FALSE);
|
22 | return ui32Size;
|
23 | }
|
24 | else if (usart1->US_TNCR == 0) {
|
25 | usart1->US_TNPR = (unsigned int) ui8DataPtr;
|
26 | usart1->US_TNCR = ui32Size;
|
27 | usart1->US_PTCR = AT91C_PDC_TXTEN;
|
28 | while (usart_IsTxReady() == FALSE);
|
29 | return ui32Size
|
30 | }
|
31 | return -1;
|
32 | }
|
3.) Wie handelt ihr eventuelle Übertragungsabbrüche? Damit meine ich,
wenn zum Beispiel die Datenkommunikation interrupted wird. Fangt ihr das
in der Protokollschicht ab? Habt ihr eventuell direkte Resetkommandos,
die der PC zum µC schickt um das Interface zu löschen?
Danke Roger