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 | }
|