我目前正在使用循环模式的 DMA 和 SPI 学习 STM32F1xx。我的目标是让 STM32F1 重复发送相同的数据。
我正在使用 cubeMX 生成的代码,使用循环模式设置 SPI-DMA 并使用HAL_SPI_Transmit_DMA()来激活 DMA 传输。
我有一个像这里的数据缓冲区:
char dataBuf[10] = {'a','b','c','d','e','f','g','h','i','j'};
当我使用HAL_SPI_Transmit_DMA(&hspi1,dataBuf,10) 时;它工作正常。STM32F1通过SPI重复发送字符,我可以使用HAL_SPI_DMAStop(&hspi1); 阻止它。
但是如果我只想重复发送 5 个字节的dataBuf,使用HAL_SPI_Transmit_DMA(&hspi1,dataBuf,5),STM32 无法对此做出反应。它只是挂在某个地方,什么也没做。
我想知道为什么会这样。数据量是否需要与声明的缓冲区数组大小相同(实际上,这对我来说没有意义)?如何使用循环模式发送所需的数据量?
更新1
我应该附上我的 SPI 和 DMA 设置,在这里。
SPI设置:
/* SPI1 parameter configuration*/
hspi1.Instance = SPI1;
hspi1.Init.Mode = SPI_MODE_MASTER;
hspi1.Init.Direction = SPI_DIRECTION_2LINES;
hspi1.Init.DataSize = SPI_DATASIZE_8BIT;
hspi1.Init.CLKPolarity = SPI_POLARITY_LOW;
hspi1.Init.CLKPhase = SPI_PHASE_1EDGE;
hspi1.Init.NSS = SPI_NSS_SOFT;
hspi1.Init.BaudRatePrescaler = SPI_BAUDRATEPRESCALER_8;
hspi1.Init.FirstBit = SPI_FIRSTBIT_MSB;
hspi1.Init.TIMode = SPI_TIMODE_DISABLE;
hspi1.Init.CRCCalculation = SPI_CRCCALCULATION_DISABLE;
hspi1.Init.CRCPolynomial = 10;
if (HAL_SPI_Init(&hspi1) != HAL_OK)
{
_Error_Handler(__FILE__, __LINE__);
}
DMA设置:
hdma_spi1_tx.Instance = DMA1_Channel3;
hdma_spi1_tx.Init.Direction = DMA_MEMORY_TO_PERIPH;
hdma_spi1_tx.Init.PeriphInc = DMA_PINC_DISABLE;
hdma_spi1_tx.Init.MemInc = DMA_MINC_ENABLE;
hdma_spi1_tx.Init.PeriphDataAlignment = DMA_PDATAALIGN_BYTE;
hdma_spi1_tx.Init.MemDataAlignment = DMA_MDATAALIGN_BYTE;
hdma_spi1_tx.Init.Mode = DMA_CIRCULAR;
hdma_spi1_tx.Init.Priority = DMA_PRIORITY_LOW;
if (HAL_DMA_Init(&hdma_spi1_tx) != HAL_OK)
{
_Error_Handler(__FILE__, __LINE__);
}
更新2
这是我的代码测试设置:
char spiDataBuf[10] = {'a','b','c','d','e','f','g','h','i','j'};
uint8_t runSPI = 0;
/* Infinite loop */
/* USER CODE BEGIN WHILE */
while (1)
{
//HAL_Delay(500);
if(HAL_GetTick()-lastTick > 1)
{
//calColor2Data(&statusColor, 1);
//updateWs2812();
if(runSPI)
{
HAL_SPI_Transmit_DMA(&hspi1,spiDataBuf,5);
// or HAL_SPI_Transmit_DMA(&hspi1,spiDataBuf,10);
runSPI = 0;
}
else
{
runSPI = 1;
HAL_SPI_DMAStop(&hspi1);
}
lastTick = HAL_GetTick();
}
/* USER CODE END WHILE */
/* USER CODE BEGIN 3 */
}
和逻辑输出:当我设置 10 个字节发送时,它工作正常,STM32 重复发送 abc.. 并按预期暂停。逻辑捕获请看下面的图片。
但是当我发送 5 个字节时,它似乎无法停止。逻辑捕获请参见以下图像。
我的问题仍然存在,为什么当我设置 5 个字节发送时无法停止 DMA?
我确实测试了其他字节数。10、9、8 字节有效。但是 7, 6, 5, 4, 3 ,2 ,1 字节不起作用。SPI DMA 是那些无法停止的情况。
如果需要提供更多信息,请告诉我。
谢谢。
此致。