Forum: Mikrocontroller und Digitale Elektronik SAM4S Master-SPI mit PDC: Seltsamer Fehler


von Alex (haidanai)


Lesenswert?

Hallo,

ich möchte 3 Bytes über die SPI-Schnittstelle schicken.
Wenn ich das über SPI_TDR mache:
1
p_spi->SPI_TDR= SPI_TDR_PCS(chip_id) | 0x01;
2
while((p_spi->SPI_SR & SPI_SR_TDRE) != SPI_SR_TDRE);
3
p_spi->SPI_TDR= SPI_TDR_PCS(chip_id) | (test >> 8);
4
while((p_spi->SPI_SR & SPI_SR_TDRE) != SPI_SR_TDRE);
5
p_spi->SPI_TDR= SPI_TDR_PCS(chip_id) | (test & 0xFF)  | SPI_TDR_LASTXFER;
6
while((p_spi->SPI_SR & SPI_SR_TDRE) != SPI_SR_TDRE);
werden die richtigen Daten gesendet.

Wenn ich aber mit PDC den Puffer senden will, wird das erste Byte (0x01) 
richtig gesendet, dann aber 0-Byte und ein 0x01-Byte, egal was im 
Sendepuffer steht:
1
uint32_t gs_uc_spi_m_tbuffer[3];
2
gs_uc_spi_m_tbuffer[0] = SPI_TDR_PCS(chip_id) | SPI_TDR_TD((uint16_t)0x01);
3
gs_uc_spi_m_tbuffer[1] = SPI_TDR_PCS(chip_id) | SPI_TDR_TD((uint16_t)0xCC);
4
gs_uc_spi_m_tbuffer[2] = SPI_TDR_LASTXFER | SPI_TDR_PCS(chip_id) | SPI_TDR_TD((uint16_t)0x55);
5
DEV_SPI->SPI_MR &= (~(SPI_MR_PCS_Msk | SPI_MR_PS));// Clear Peripheral chip select value
6
DEV_SPI->SPI_MR |= SPI_MR_PCS(chip_id);
7
p_spi->SPI_TPR= (uint32_t)gs_uc_spi_m_tbuffer;
8
p_spi->SPI_PTCR=  SPI_PTCR_TXTEN; // PDC-TX einschalten
9
p_spi->SPI_TCR= SPI_TCR_TXCTR(3);
10
while((p_spi->SPI_SR & SPI_SR_TXEMPTY) == SPI_SR_TXEMPTY);
Die SPI ist zwar auf Fixed Peripheral Select eingestellt, das sollte 
doch aber nichts ausmachen? (Später stelle ich das um)
Der SPI_CSRx (=chip_id) ist richtig konfiguriert (8Bits, etc.)
Auch das SPI_MR habe ich kontrolliert.
Sieht jemand, was ich falsch mache oder wo könnte ich noch nachschauen?
Bitte um Hilfe, ich weiß einfach nichtmehr weiter.

: Bearbeitet durch Moderator
von Alex (haidanai)


Lesenswert?

PS:
ich habe jetzt herausgefunden dass von der PDC
aus gs_uc_spi_m_tbuffer[0] nicht ein Datenbyte in die SPI_TDR 
geschrieben wird, sondern zwei Bytes. Im SPI_CSR1 (SPI_MR = 
SPI_MR_PCS(1))
stehen 0 -> 8 Bit! Warum nimmt die PDC diese Einstellung nicht?

von Alex (haidanai)


Lesenswert?

Hallo, für Alle, die das später mal lesen, ich habe meinen Fehler 
gefunden!
Ist eigentlich logisch - Asche auf mein Haupt.
Da ich den Fixed Peripheral Select eingestellt habe, braucht er ja das 
CS-Feld in SPI_TDR gar nicht. Deshalb wird der Puffer einfach als 
3er-Byte-Array behandelt. Meine Vermutung ist, dass wenn man auf 
Variable Peripheral Select umschaltet, dass dann auch die PDC den Puffer 
als uint32-Array liest.

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.