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

Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt. Bitte hier nur auf die ursprüngliche Frage antworten, für neue Fragen einen neuen Beitrag erstellen.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.