Forum: Mikrocontroller und Digitale Elektronik PDC immer sinnvoll?


von Ingo H. (ingo2)


Lesenswert?

Hallo,

Frage vorweg: Ab wieviel bytes/Transfer lohnt sich eine PDC(bzw. 
DMA)-Übertragung?

Ich arbeite mit dem AT91SAM7A3 und möchte hiermit 4 Sensoren sehr 
dynamisch über die SPI-Schnittstelle auslesen. Die eingelesenen Werte 
werden in einem Regleralgorithmus weiterverarbeitet.

Der Sensor wird per Kommando (1 Byte) ausgelesen. Das zurückgesandte 
Datum beträgt 3 Byte pro Sensor.

Der Controller verarbeitet den Regleralgorithmus ohne Auslesen der 
Sensoren mit 150 kHz. Lese ich die Sensoren aus, sinkt der Takt auf 10 
kHz.

Im Moment erfolgt das Lesen und Schreiben mit den 
SPI_TDR/SPI_RDR-Registern (also ohne PDC).

Meine Hoffnung ist es, den Reglertakt durch Nutzung der PDC zu erhöhen.

Frage: lohnt sich das? Ich würde es gerne ausprobieren, scheitere aber 
an der Umsetzung. Ich kann am Oszi nicht mal ein Clock-Signal sehen 
(ohne PDC geht's)
Liegt's vielleicht an der falschen Initialisierung?

Mein (gescheiterter) PDC-Code:

int main(void)
{
    char *receive;
    char *transmit;

    transmit = 5;//Testbytes
    receive = 3;

    // Enable SPI0 PMC peripheral clock
    AT91C_BASE_PMC->PMC_PCER = 1 << AT91C_ID_SPI0;

    // Initialize the io pins, (das sind miso, mosi, clk und npcs1)
    PIO_Configure(pins, PIO_LISTSIZE(pins));

    //ENABLE SPI
    AT91C_BASE_SPI0->SPI_CR = AT91C_SPI_SPIEN ;

    AT91C_BASE_SPI0->SPI_MR = 
AT91C_SPI_MSTR|AT91C_SPI_PS_VARIABLE|0<<2|AT91C_SPI_LLB|SLAVE<<16|AT91C_ 
SPI_MODFDIS|(255<<24);

AT91C_BASE_SPI0->SPI_CSR[3]=
AT91C_SPI_NCPHA|AT91C_SPI_CSAAT|AT91C_SPI_BITS_8|(255<<8)|AT91C_SPI_DLYB 
S|
AT91C_SPI_DLYBCT;

while(1)
{
  AT91C_BASE_SPI0->SPI_RPR = (unsigned int)receive;
  AT91C_BASE_SPI0->SPI_RCR = 1;
  AT91C_BASE_SPI0->SPI_TPR = (unsigned int)transmit;
  AT91C_BASE_SPI0->SPI_TCR = 1;

  AT91C_BASE_SPI0->SPI_PTCR = AT91C_PDC_TXTEN|AT91C_PDC_RXTEN;

  while (! (AT91C_BASE_SPI0->SPI_SR & AT91C_SPI_ENDRX)) ;
}
}

von Ingo H. (ingo2)


Lesenswert?

Lösung:

1. PDC funktioniert nicht mit AT91C_SPI_PS_VARIABLE im SPI_MR Register.
2. Habe keinen Geschwindigkeitsvorteil mit PDC ggü ohne PDC messen 
können.
Bei der Messung wurden maximal 4 Bytes/Transfer übertragen.

Ergo: Bleibe bei der ursprünglichen Version ohne PDC (RDR bzw. TDR 
register)

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.