Forum: Mikrocontroller und Digitale Elektronik SPI DMA Transfer


von Hannes (Gast)


Lesenswert?

Hi,

bei einem AT91SAM9263 Controller hab ich das Problem, dass beim Zugriff 
auf einen SPI-IC (insgesamt hängen zwei ICs an SPI1-Bus), immer der 
andere auch mit angesprochen wird.

Der SPI-Datentransfer läuft mittels DMA ab und beim enablen des 
Tranceivers der DMA leuchten obwohl der TLC5922 nicht angesprochen wird, 
immer die LEDs kurzzeitig auf! Die Werte, die per SPI zurückgeliefert 
werden (vom zweiten IC, dem Touch-Controller) sind richtig, aber das 
aufleuchten der LEDS ist merkwürdig.

Zu Beginn programmiere ich das Mode-Register vom SPI neu, damit der 
richtige Chipselect ausgewählt wird (steht auch im Register dann richtig 
drinnen) und anschließend wird der DMA transport vorbereitet
1
AT91PS_PDC pPdc = (AT91PS_PDC) &(AT91C_BASE_SPI1->SPI_RPR);
2
3
pPdc->PDC_PTCR = AT91C_PDC_RXTDIS;
4
pPdc->PDC_RPR = (unsigned int) bufferRX;
5
pPdc->PDC_RCR = 3;
6
7
pPdc->PDC_PTCR = AT91C_PDC_TXTDIS;
8
pPdc->PDC_TPR = (unsigned int) bufferTX;
9
pPdc->PDC_TCR = 3;
10
11
pPdc->PDC_PTCR = AT91C_PDC_RXTEN;
12
13
pPdc->PDC_PTCR = AT91C_PDC_TXTEN;
14
/* bei diesem Cmd leuchten die LEDs vom TLC kurzzeitig auf */
15
16
17
do {
18
        dStatus = AT91C_BASE_SPI1->SPI_SR;
19
        uTimeout++;
20
    }
21
    while ((( dStatus & AT91C_SPI_RXBUFF) != AT91C_SPI_RXBUFF) && (uTimeout < AT91C_TOUCHSCREEN_TIMEOUT));
22
23
//disable receive / transmit transfer 
24
pPdc->PDC_PTCR = AT91C_PDC_RXTDIS;   
25
pPdc->PDC_PTCR = AT91C_PDC_TXTDIS; 
26
27
(void)AT91C_BASE_SPI1->SPI_RDR;

Hat jmd eine Idee an was das liegen könnte?

Gruß
Hannes

von Gebhard R. (Firma: Raich Gerätebau & Entwicklung) (geb)


Lesenswert?

Schaut aus, als wenn die CS Leitungen nicht richtig funktionieren. 
Solltest du mit einem Oszi mal kontrollieren,was da wirklich passiert. 
Bei den Arm Prozessoren gibt es immer wieder sog. pipeline Effekte, wo 
z.B. ein Port Pin unter best. Umständen verzögert gesetzt wird.

Grüße Geb

von Hannes (Gast)


Lesenswert?

ich hab sogar diesen Fehler, wenn ich das Programm im Debug-Modus 
durchsteppe - step by step.

Im Errata hab ich leider nichts gefunden, werd wahrscheinlich mal Atmel 
Support kontaktieren müssen, wenn sonst keiner eine Idee hat, wie man 
dieses Problem in den Griff bekommt.

Gruß
Hannes

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.