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