STM32H7 SPI mit DMA und Hard NSS

Gast #6961223
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
}

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