void TM_SPI_DMA_InitWithStreamAndChannel(SPI_TypeDef* SPIx, DMA_Stream_TypeDef* TX_Stream, uint32_t TX_Channel, DMA_Stream_TypeDef* RX_Stream, uint32_t RX_Channel) { /* Get USART settings */ TM_SPI_DMA_INT_t* Settings = TM_SPI_DMA_INT_GetSettings(SPIx); /* Set values */ Settings->RX_Channel = RX_Channel; Settings->RX_Stream = RX_Stream; Settings->TX_Channel = TX_Channel; Settings->TX_Stream = TX_Stream; /* Init SPI */ TM_SPI_DMA_Init(SPIx); }
int main(void) { /* Initialize system */ SystemInit(); /* Initialize delay */ TM_DELAY_Init(); /* Init SPI */ TM_SPI_Init(SPI1, TM_SPI_PinsPack_1); /* Init SPI DMA */ TM_SPI_DMA_Init(SPI1); /* Set fake SPI TX buffer */ memset(TX_Buffer, 0x00, sizeof(TX_Buffer)); val = TM_GENERAL_DWTCounterEnable(); /* Set CS low first here before you send data over SPI */ TM_GENERAL_DWTCounterSetValue(0); /* Send data over SPI1 with DMA */ /* Exchange data with SPI slave using SPI DMA */ /* Exchange 5 bytes of data */ TM_SPI_DMA_Transmit(SPI1, TX_Buffer, RX_Buffer, sizeof(TX_Buffer)); /* Wait till SPI DMA do it's job */ /* You can do other stuff instead */ while (TM_SPI_DMA_Working(SPI1)); val = TM_GENERAL_DWTCounterGetValue(); /* Little delay, for debug */ Delayms(10); TM_GENERAL_DWTCounterSetValue(0); TM_SPI_SendMulti(SPI1, TX_Buffer, RX_Buffer, sizeof(TX_Buffer)); val = TM_GENERAL_DWTCounterGetValue(); /* Send 5 bytes of data and don't care what you receive back from slave via DMA */ /* RX_Buffer should not be changed in debug window */ TM_SPI_DMA_Transmit(SPI1, TX_Buffer, NULL, 5); /* Wait till SPI DMA do it's job */ /* You can do other stuff instead */ while (TM_SPI_DMA_Working(SPI1)); /* Little delay, for debug */ Delayms(10); /* Receive 5 bytes of data, sent dummy 0x00 bytes to slave via DMA */ TM_SPI_DMA_Transmit(SPI1, NULL, RX_Buffer, 5); /* Wait till SPI DMA do it's job */ /* You can do other stuff instead */ while (TM_SPI_DMA_Working(SPI1)); /* Set CS high here after last byte is done by SPI */ while (1) { } }