2017-08-16 10 views
0

Je tente de lire un nombre fixe d'octets (27 octets au total) à partir d'un périphérique esclave SPI à l'aide de DMA. Je cours une puce STM32F4.Écriture d'octets fictifs SPI à l'aide du mode circulaire DMA

"Pour pouvoir lire depuis le bus SPI, une horloge doit être générée, donc vous devez écrire pour lire." J'ai mis en place mon contrôleur DMA pour écrire un octet factice (0xFF) en mode circulaire.

uint8_t tx_buffer[] = {0xFF}; 

DMA_InitStruct.DMA_Mode = DMA_Mode_Circular; 
DMA_InitStruct.DMA_BufferSize = 1; 
DMA_InitStruct.DMA_Memory0BaseAddr = (uint32_t)tx_buffer; 

et mon flux Rx dma est configuré en utilisant le double mode tampon:

uint8_t rx_buffer0[27]; 
uint8_t rx_buffer1[27]; 

DMA_InitStruct.DMA_Mode = DMA_Mode_Normal; 
DMA_InitStruct.DMA_BufferSize = 27; 
DMA_InitStruct.DMA_Memory0BaseAddr = (uint32_t)rx_buffer0; 

DMA_DoubleBufferModeConfig(DMA2_Stream0, (uint32_t)rx_buffer1, DMA_Memory_0); 
DMA_DoubleBufferModeCmd(DMA2_Stream0, ENABLE); 

(. Je l'ai omis d'autres initialisations non pertinents)

Après les 27 octets sont reçus un transfert d'interruption complète est déclenché. Le problème est le suivant: Je vois des données correctes dans le premier tampon. Mais pendant que l'interruption déclenche le DMA circulaire Tx continue, en remplissant les premiers octets du deuxième tampon jusqu'à ce qu'il soit désactivé.

Je souhaite éviter de réserver 27 octets pour les données fictives. Existe-t-il donc un moyen d'arrêter un flux DMA circulaire après un nombre fixe de cycles?

Répondre

0

Activer DMA en mode normal et définir le nombre d'éléments sur 27.

Ensuite, désactivez l'augmentation de la mémoire pour la mémoire et pour les périphériques et votre approche fonctionnera.