Forum: Mikrocontroller und Digitale Elektronik STM32H7 SPI mit DMA und Hard NSS


von mr. mo (Gast)


Lesenswert?

Mahlzeit zusammen,

die STM32H7 Serie ist ja in der Lage den NSS (Chip Select) Pin des SPI 
im Master Modus (Full-Duplex) in Abhängigkeit der zu sendenden 
Datenmenge korrekt eigenständig zu schalten.

Für einfaches Polling konnte ich dies bereits erfolgreich implementieren 
und muss mich nicht mehr um den NSS Pin kümmern. Der Trick war dabei, 
die Anzahl der zu sendenden Bytes via "LL_SPI_SetTransferSize" (Register 
TSIZE) auf den entsprechenden Wert zu setzen.

Bei der Verwendung vom DMA funktioniert das ganze nicht mehr so einfach. 
Muss da noch zusätzlich getrickst werden? Die Übertragung funktioniert, 
lediglich der NSS Pin bleibt kontinuierlich auf low. Folgenden 
Codeschnipsel verwende ich zum Start der Datenübertragung:
1
void LL_SPI1::readWriteDMA(uint8_t* rx, uint8_t* tx, uint16_t n)
2
{
3
  LL_SPI_Disable(spi);
4
  LL_DMA_DisableStream(DMA1, LL_DMA_STREAM_2);
5
  LL_DMA_DisableStream(DMA1, LL_DMA_STREAM_3);
6
  LL_DMA_SetDataLength(DMA1, LL_DMA_STREAM_2, n);
7
  LL_DMA_SetDataLength(DMA1, LL_DMA_STREAM_3, n);
8
  LL_DMA_SetMemoryAddress(DMA1, LL_DMA_STREAM_2, (uint32_t)&rx[0]);
9
  LL_DMA_SetMemoryAddress(DMA1, LL_DMA_STREAM_3, (uint32_t)&tx[0]);
10
11
  //setBusyFlag(true);
12
  //select();
13
14
  LL_DMA_EnableStream(DMA1, LL_DMA_STREAM_2);
15
  LL_DMA_EnableStream(DMA1, LL_DMA_STREAM_3);
16
17
  LL_SPI_Enable(spi);
18
  LL_SPI_SetTransferSize(spi, n);
19
  LL_SPI_StartMasterTransfer(spi);
20
}

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.