如何解决使用 STM32F7 的 SPI 从模式和循环 DMA
我目前正在使用以 SPI(主模式)进行通信的外设。 本机发送一个 27 位数据包,每个数据包接收 8 个 27 位数据包。 对于我的 STM32,我在从模式(全双工)下使用 SPI 协议,并使用 27 位缓冲存储器进行接收(RxBuffer [26])和 8 个每个 27 位的缓冲区进行传输。 (TxBufferPKG0[27]、TxBufferPKG1[27]、...、TxBufferPKG7[27])。 接收效果很好。 问题是一个接一个地发送 8 个数据包。 我在传输过程中发生了位移。不幸的是,我没有示波器来查看帧。 我不想使用 216 位 (8 * 27) 缓冲区。
我正在使用 void DMA_IRQHandler() 函数将内存传输到 SPI。但是,我似乎无法使用中断标志来完成发送。 我知道标志是 DMA_IT_HT 和 DMA_IT_TC,但我不知道如何正确使用它们。
我想一个一个没有延迟地发送27位数据包。
感谢您的帮助。
我的代码:
uint8_t TbufferPKG0[27] = { 0,0x7F,0x63,0x41,0x00,0x20,0x10,0x08,0x04,0x02,0 };
uint8_t TbufferPKG1[27] = { 24,0x7E,0x11,0x49,0x36,0x3E,0x22,0 };
uint8_t TbufferPKG2[27] = { 48,0x09,0x01,0x3A,0 };
uint8_t TbufferPKG3[27] = { 72,0 };
uint8_t TbufferPKG4[27] = { 96,0 };
uint8_t TbufferPKG5[27] = { 120,0 };
uint8_t TbufferPKG6[27] = { 144,0 };
uint8_t TbufferPKG7[27] = { 168,0x0C,0x58,0 };
uint8_t Tbuffer[27] = { 168,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;
解决方法
我解决了我的问题。 我用 DMA normal 替换了 DMA 循环,并调用了 HAL_SPI_TxRxCpltCallback 函数。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。