首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >带STM32F7的Slave模式和循环DMA

带STM32F7的Slave模式和循环DMA
EN

Stack Overflow用户
提问于 2021-07-04 02:17:38
回答 1查看 319关注 0票数 0

我目前使用的是以SPI (主模式)通信的外设。该单元发送27位分组,每个单元接收8 x 27位分组。在我的STM32中,我在从机模式(全双工)下使用SPI协议,并使用27位缓冲存储器(RxBuffer 26)进行接收,使用8个27位缓冲进行传输。(TxBufferPKG027,TxBufferPKG127,...,TxBufferPKG727)。接收器工作得很好。问题是一个接一个地发送8个数据包。在传输过程中,我有一个位的移位.不幸的是,我没有一个示波器来查看这些帧。我不想使用216位(8 * 27)的缓冲区。

我使用void SPI ()函数将内存转移到DMA_IRQHandler。但是,我似乎不能使用中断标志来完成发送。我知道标志是DMA_IT_HT和DMA_IT_TC,但我不知道如何正确使用它们。

我想一个接一个地发送27比特的数据包,并且没有延迟。

谢谢你的帮助。

我的代码:

代码语言:javascript
复制
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;
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-07-10 00:05:31

我解决了我的问题。我将DMA循环替换为DMA normal,并调用HAL_SPI_TxRxCpltCallback函数。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/68238897

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档