mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik STM32 DMA Neustart, erstes Byte falsch


Autor: Holger K. (holgerkraehe)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo

Ich habe folgendes Szenario:

STM32F105 als SPI Slave.
Dieser soll bei erhalt eines Bytes oder mehrere Bytes mittels DMA einen 
definierten Buffer zurücksenden.

Leider klappt das nicht so wie es soll.
Es wird immer erst ab dem zweiten Byte das erste des buffers 
zurückgesendet.
Das erste byte welches über SPI zurückgeht ist das letzte welches zuvor 
gesendet wurde.


Der DMA scheint immer ein byte zu benötigen, bis er sich konfiguriert 
hat.
Also sozusagen ein dummy byte bevor die Übetragung beginnt.
Ist dies so üblich?

Es scheint, als wäre etwas irgendwo im zwischenspeicher.
Was mache ich falsch?

: Bearbeitet durch User
Autor: Rainer U. (r-u)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Holger K. schrieb:
> Es wird immer erst ab dem zweiten Byte das erste des buffers
> zurückgesendet.

Ich hab zumindest einige SPI-Bausteine gesehen, die so funktioniert 
haben. Woher soll er auch wissen, was er zurückgeben soll, bevor er das 
allererste Byte vollständig empfangen und ausgewertet hat?

Autor: Holger K. (holgerkraehe)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Rainer U. schrieb:
> Holger K. schrieb:
>> Es wird immer erst ab dem zweiten Byte das erste des buffers
>> zurückgesendet.
>
> Ich hab zumindest einige SPI-Bausteine gesehen, die so funktioniert
> haben. Woher soll er auch wissen, was er zurückgeben soll, bevor er das
> allererste Byte vollständig empfangen und ausgewertet hat?

Nein du vestehst das nicht ganz.

Ich konfiguriere den DMA BEVOR ich bytes empfange.
Bei der Konfiguration teile ich dem DMA mit, was er zu senden hat.

Wenn der Master nun ein byte sendet und ich dieses als Slave empfange, 
so soll bereits beim ersten Bytetransfert der DMA die konfigurierten 
Daten absenden.

Dies tut er jedoch erst beim zweiten emfpangenen byte.

Es muss nichts ausgewertet werden.

Autor: Dr. Sommer (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hast du das DMA korrekt abgeschaltet nach dem vorherigen Transfer?
Ala
DMA1->CCR = 0; // EN bit abschalten!
while (DMA1->CCR & DMA_CCR_EN);

Autor: Holger K. (holgerkraehe)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Dr. Sommer schrieb:
> Hast du das DMA korrekt abgeschaltet nach dem vorherigen Transfer?
> AlaDMA1->CCR = 0; // EN bit abschalten!
> while (DMA1->CCR & DMA_CCR_EN);

Bisher noch nicht.

Nun habe ich das angepasst.
Aktuell sieht mein Code so aus:

uint8_t  dataSendB[4] = {0x14, 0x41, 0x63, 0x20};
...
void SPI2_IRQHandler(void)
{
  uint8_t cmd;

  SPI_I2S_ClearITPendingBit(SPI2,SPI_I2S_IT_RXNE);
  cmd = SPI2->DR;

  if(cmd != 0xD8)
  {
    //DMA Deaktivieren
    DMA1_Channel5->CCR &= (uint16_t)(~DMA_CCR1_EN);
    while (DMA1_Channel5->CCR & DMA_CCR1_EN);
    
    
    DMA1_Channel5->CMAR = (uint32_t)&dataSendB[0];
    DMA1_Channel5->CNDTR = 2;    
    
    //DMA Aktivieren
    DMA1_Channel5->CCR |= DMA_CCR1_EN;
  }
//Interrupt deaktivieren. Wird beim CS Low->HIGH wieder aktiviert
//Dadurch bekomme ich nur das erste Byte (CMD) mit
SPI_I2S_ITConfig(SPI2,SPI_I2S_IT_RXNE,DISABLE);
}


Ich empfange das erste byte mittels interrupt.
Dann schaue ich mir dieses an und aktiviere den DMA für die nächste 
übertragung.

Anbei ein Bild.

Eigentlich müsste dann 0x14 0x41 kommen
Jedoch kommt zuerst 0x02.
Das ist jenes byte, welches ich an anderer Codestelle zuletzt mit dem 
DMA übertragen habe.

: Bearbeitet durch User

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
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.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.