0
votes

I am currently using a peripheral which communicates in SPI (master mode). This unit sends a 27-bit packet and receives 8 x 27-bit packets each. With my STM32, I use the SPI protocol in slave mode (full duplex) and I use a 27-bit buffer memory for reception (RxBuffer [26]) and 8 buffers of 27 bits each for transmission. (TxBufferPKG0[27], TxBufferPKG1[27], ... ,TxBufferPKG7[27]). The receive works very well. The problem is sending 8 packets one after the other. I a shift of bit during the transfert. Unfortunately, I don't have a oscilloscope to view the frames. I don't want to use a 216 bit (8 * 27) buffer.

I am using the void DMA_IRQHandler () function to transfer memory to the SPI. But, I can't seem to use the interrupt flags for the completed send. I know the flags are DMA_IT_HT and DMA_IT_TC but I don't know how to use them correctly.

I would like to send the 27 bit packets one by one and without lag.

Thanks for your help.

My code :

uint8_t TbufferPKG0[27] = { 0, 0x7F, 0x7F, 0x63, 0x41, 0x00, 0x00, 0x20, 0x10, 0x08, 0x04, 0x02, 0x00, 0x20, 0x10, 0x08, 0x04, 0x02, 0x00, 0x20, 0x10, 0x08, 0x04, 0x02, 0x00, 0, 0 };
uint8_t TbufferPKG1[27] = { 24, 0x7E, 0x11, 0x11, 0x11, 0x7E, 0x00, 0x7F, 0x49, 0x49, 0x49, 0x36, 0x00, 0x3E, 0x41, 0x41, 0x41, 0x22, 0x00, 0x7F, 0x41, 0x41, 0x41, 0x3E, 0x00, 0, 0 };
uint8_t TbufferPKG2[27] = { 48, 0x7F, 0x49, 0x49, 0x49, 0x41, 0x00, 0x7F, 0x09, 0x09, 0x09, 0x01, 0x00, 0x3E, 0x41, 0x49, 0x49, 0x3A, 0x00, 0x7F, 0x08, 0x08, 0x08, 0x7F, 0x00, 0, 0 };
uint8_t TbufferPKG3[27] = { 72, 0x02, 0x04, 0x08, 0x10, 0x20, 0x00, 0x02, 0x04, 0x08, 0x10, 0x20, 0x00, 0x02, 0x04, 0x08, 0x10, 0x20, 0x00, 0x00, 0x41, 0x63, 0x7F, 0x7F, 0x00, 0, 0 };
uint8_t TbufferPKG4[27] = { 96, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 };
uint8_t TbufferPKG5[27] = { 120, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 };
uint8_t TbufferPKG6[27] = { 144, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 };
uint8_t TbufferPKG7[27] = { 168, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0x0C, 0, 0x20, 0, 0, 0, 0x58, 0, 0, 0 };

uint8_t Tbuffer[27] = { 168, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0x0C, 0, 0x20, 0, 0, 0, 0x58, 0, 0, 0 };

uint8_t Rbuffer[27] = {0};

void DMA1_Stream4_IRQHandler(void) {

HAL_DMA_IRQHandler(&hdma_spi2_tx);

if (TxPKG_SPI2 == 0) { memmove(Tbuffer, TbufferPKG0, sizeof(Tbuffer)); }
if (TxPKG_SPI2 == 1) { memmove(Tbuffer, TbufferPKG1, sizeof(Tbuffer)); }
if (TxPKG_SPI2 == 2) { memmove(Tbuffer, TbufferPKG2, sizeof(Tbuffer)); }
if (TxPKG_SPI2 == 3) { memmove(Tbuffer, TbufferPKG3, sizeof(Tbuffer)); }
if (TxPKG_SPI2 == 4) { memmove(Tbuffer, TbufferPKG4, sizeof(Tbuffer)); }
if (TxPKG_SPI2 == 5) { memmove(Tbuffer, TbufferPKG5, sizeof(Tbuffer)); }
if (TxPKG_SPI2 == 6) { memmove(Tbuffer, TbufferPKG6, sizeof(Tbuffer)); }
if (TxPKG_SPI2 == 7) { memmove(Tbuffer, TbufferPKG7, sizeof(Tbuffer)); }

TxPKG_SPI2 += 1;
if (TxPKG_SPI2 >= 8) { TxPKG_SPI2 = 0; }

}

/* SPI2_TX Init */
hdma_spi2_tx.Instance = DMA1_Stream4;
hdma_spi2_tx.Init.Channel = DMA_CHANNEL_0;
hdma_spi2_tx.Init.Direction = DMA_MEMORY_TO_PERIPH;
hdma_spi2_tx.Init.PeriphInc = DMA_PINC_DISABLE;
hdma_spi2_tx.Init.MemInc = DMA_MINC_ENABLE;
hdma_spi2_tx.Init.PeriphDataAlignment = DMA_PDATAALIGN_BYTE;
hdma_spi2_tx.Init.MemDataAlignment = DMA_MDATAALIGN_BYTE;
hdma_spi2_tx.Init.Mode = DMA_CIRCULAR;
hdma_spi2_tx.Init.Priority = DMA_PRIORITY_VERY_HIGH;
hdma_spi2_tx.Init.FIFOMode = DMA_FIFOMODE_DISABLE;
1
You say 27 bit, but the code declares arrays of 27 bytes, which do you mean?Tom V
Also you have the DMA set up in circular mode. This will transmit the same buffer over and over forever without going on to the next one.Tom V
A shift of one bit can be caused by using the incorrect clock edge. Check that you have the clock polarity and phase set correctly at both ends.Tom V
This is a 27-bit array for the buffer. This array is used for transmission in SPI. TxBuffer[27]Dominique
How next one buffer to another with circular DMA ?Dominique

1 Answers

0
votes

I solved my problem. I replace DMA circular by DMA normal and I call the HAL_SPI_TxRxCpltCallback function.