SAM4S Master-SPI mit PDC: Seltsamer Fehler

OP #7602892
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.

OP #7602926
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.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren