cancel
Showing results for 
Search instead for 
Did you mean: 

硬件不变的情况下,SPI+DMA 循环模式主机接收 采集电压异常,Normal模式却正常

kevin_sa
Visitor

用SPI+DMA驱动AD4001,用片选信号代替 CONV,采集一个正弦信号。Normalnormal正常,循环模式却不对,求大佬解答!!
Normal模式下,每次在 HAL_SPI_RxCpltCallback 函数里面重新启动数据正常,能看到正弦变化规律

               

 

 


                循环模式下数据就不对了,采集的同样一个交流信号,我在半传输完成回调里面查看,按道理后半部分的数据应该是正常的正弦变化才对,实际却不是,但是去采集直流时又是正常的。


                PS:缓冲区开的1200,感觉应该不会更新这么快,就算更新应该局部的数据具有正弦规律

 

 

 

 



我得猜想:
是不是因为我再keil里面是打断点查看的数据,并不会停下SPI+DMA 在循环模式下的硬件工作,导致后台一直在更新,keil显示的数据其实不对


配置:
配置的区别只修改了DMA是正常还是循环
void MX_SPI1_Init(void)
{

/* 用户代码开始 SPI1_Init 0 */

/* 用户代码结束 SPI1_Init 0 */

/* 用户代码开始SPI1_Init 1 */

/* 用户代码结束 SPI1_Init 1 */
hspi1.实例 = SPI1;
HSPI1 的。Init.Mode = SPI_MODE_MASTER;
HSPI1 的。Init.Direction = SPI_DIRECTION_2LINES_RXONLY;
HSPI1 的。Init.DataSize = SPI_DATASIZE_32BIT;
HSPI1 的。Init.CLKPolarity = SPI_POLARITY_LOW;
HSPI1 的。Init.CLKPhase = SPI_PHASE_1EDGE;
HSPI1 的。Init.NSS = SPI_NSS_HARD_OUTPUT;
HSPI1 的。Init.BaudRatePrescaler = SPI_BAUDRATEPRESCALER_2;
HSPI1 的。Init.FirstBit = SPI_FIRSTBIT_MSB;
HSPI1 的。Init.NSSPMode = SPI_NSS_PULSE_ENABLE;
HSPI1 的。Init.NSSPolarity = SPI_NSS_POLARITY_HIGH;
HSPI1 的。Init.FifoThreshold = SPI_FIFO_THRESHOLD_01DATA;
HSPI1 的。Init.MasterSSIdleness = SPI_MASTER_SS_IDLENESS_00CYCLE;
HSPI1 的。Init.MasterInterDataIdleness = SPI_MASTER_INTERDATA_IDLENESS_03CYCLE;
HSPI1 的。Init.MasterReceiverAutoSusp = SPI_MASTER_RX_AUTOSUSP_DISABLE;
HSPI1 的。Init.MasterKeepIOState = SPI_MASTER_KEEP_IO_STATE_DISABLE;
HSPI1 的。Init.IOSwap = SPI_IO_SWAP_DISABLE;
if (HAL_SPI_Init(&hspi1) != HAL_OK)
{
Error_Handler();
}
/* 用户代码开始 SPI1_Init 2 */

/* 用户代码结束 SPI1_Init 2 */

}
/* SPI2 初始化函数 */
void MX_SPI2_Init(void)
{

/* 用户代码开始SPI2_Init 0 */

/* 用户代码结束SPI2_Init 0 */

/* 用户代码开始SPI2_Init 1 */

/* 用户代码结束SPI2_Init 1 */
HSPI2.实例 = SPI2;
HSPI2 的。Init.Mode = SPI_MODE_MASTER;
HSPI2 的。Init.Direction = SPI_DIRECTION_2LINES_RXONLY;
HSPI2 的。Init.DataSize = SPI_DATASIZE_32BIT;
HSPI2 的。Init.CLKPolarity = SPI_POLARITY_LOW;
HSPI2 的。Init.CLKPhase = SPI_PHASE_1EDGE;
HSPI2 的。Init.NSS = SPI_NSS_HARD_OUTPUT;
HSPI2 的。Init.BaudRatePrescaler = SPI_BAUDRATEPRESCALER_2;
HSPI2 的。Init.FirstBit = SPI_FIRSTBIT_MSB;
HSPI2 的。Init.NSSPMode = SPI_NSS_PULSE_ENABLE;
HSPI2 的。Init.NSSPolarity = SPI_NSS_POLARITY_HIGH;
HSPI2 的。Init.FifoThreshold = SPI_FIFO_THRESHOLD_01DATA;
HSPI2 的。Init.MasterSSIdleness = SPI_MASTER_SS_IDLENESS_00CYCLE;
HSPI2 的。Init.MasterInterDataIdleness = SPI_MASTER_INTERDATA_IDLENESS_03CYCLE;
HSPI2 的。Init.MasterReceiverAutoSusp = SPI_MASTER_RX_AUTOSUSP_DISABLE;
HSPI2 的。Init.MasterKeepIOState = SPI_MASTER_KEEP_IO_STATE_DISABLE;
HSPI2 的。Init.IOSwap = SPI_IO_SWAP_DISABLE;
if (HAL_SPI_Init(&hspi2) != HAL_OK)
{
Error_Handler();
}
/* 用户代码开始 SPI2_Init 2 */

/* 用户代码结束 SPI2_Init 2 */

}

void HAL_SPI_MspInit(SPI_HandleTypeDef* spiHandle)
{

GPIO_InitTypeDef GPIO_InitStruct = {0};
if(spiHandle->Instance==SPI1)
{
/* 用户代码开始 SPI1_MspInit 0 */

/* 用户代码结束 SPI1_MspInit 0 */
/* SPI1 时钟启用 */
__HAL_RCC_SPI1_CLK_ENABLE();

__HAL_RCC_GPIOA_CLK_ENABLE();
/**SPI1 GPIO 配置
PA4 ------> SPI1_NSS
PA5 ------> SPI1_SCK
PA6 ------> SPI1_MISO
*/
GPIO_InitStruct.Pin = GPIO_PIN_4|GPIO_PIN_5|GPIO_PIN_6;
GPIO_InitStruct.模式 = GPIO_MODE_AF_PP;
GPIO_InitStruct.拉 = GPIO_NOPULL;
GPIO_InitStruct.速度 = GPIO_SPEED_FREQ_VERY_HIGH;
GPIO_InitStruct.备选 = GPIO_AF5_SPI1;
HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);

/* SPI1 DMA 初始化 */
/* SPI1_RX初始化 */
hdma_spi1_rx.实例 = DMA1_Stream0;
hdma_spi1_rx。Init.Request = DMA_REQUEST_SPI1_RX;
hdma_spi1_rx。Init.Direction = DMA_PERIPH_TO_MEMORY;
hdma_spi1_rx。Init.PeriphInc = DMA_PINC_DISABLE;
hdma_spi1_rx。Init.MemInc = DMA_MINC_ENABLE;
hdma_spi1_rx。Init.PeriphDataAlignment = DMA_PDATAALIGN_WORD;
hdma_spi1_rx。Init.MemDataAlignment = DMA_MDATAALIGN_WORD;
hdma_spi1_rx。Init.Mode = DMA_NORMAL;//DMA_NORMAL
hdma_spi1_rx。Init.Priority = DMA_PRIORITY_VERY_HIGH;
hdma_spi1_rx。Init.FIFOMode = DMA_FIFOMODE_ENABLE;
hdma_spi1_rx。Init.FIFOThreshold = DMA_FIFO_THRESHOLD_FULL;
if (HAL_DMA_Init(&hdma_spi1_rx) != HAL_OK)
{
Error_Handler();
}

__HAL_LINKDMA(spiHandle,hdmarx,hdma_spi1_rx);

/* SPI1 中断初始化 */
HAL_NVIC_SetPriority(SPI1_IRQn, 0, 0);
HAL_NVIC_EnableIRQ(SPI1_IRQn);
/* 用户代码开始 SPI1_MspInit 1 */

/* 用户代码结束 SPI1_MspInit 1 */
}
else if(spiHandle->Instance==SPI2)
{
/* 用户代码开始SPI2_MspInit 0 */

/* 用户代码结束 SPI2_MspInit 0 */
/* SPI2 时钟启用 */
__HAL_RCC_SPI2_CLK_ENABLE();

__HAL_RCC_GPIOB_CLK_ENABLE();
/**SPI2 GPIO 配置
PB12 ------> SPI2_NSS
PB13 ------> SPI2_SCK
PB14 ------> SPI2_MISO
*/
GPIO_InitStruct.Pin = GPIO_PIN_12|GPIO_PIN_13|GPIO_PIN_14;
GPIO_InitStruct.模式 = GPIO_MODE_AF_PP;
GPIO_InitStruct.拉 = GPIO_NOPULL;
GPIO_InitStruct.速度 = GPIO_SPEED_FREQ_VERY_HIGH;
GPIO_InitStruct.备选 = GPIO_AF5_SPI2;
HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);

/* SPI2 DMA 初始化 */
/* SPI2_RX初始化 */
hdma_spi2_rx.实例 = DMA2_Stream0;
hdma_spi2_rx。Init.Request = DMA_REQUEST_SPI2_RX;
hdma_spi2_rx。Init.Direction = DMA_PERIPH_TO_MEMORY;
hdma_spi2_rx。Init.PeriphInc = DMA_PINC_DISABLE;
hdma_spi2_rx。Init.MemInc = DMA_MINC_ENABLE;
hdma_spi2_rx。Init.PeriphDataAlignment = DMA_PDATAALIGN_WORD;
hdma_spi2_rx。Init.MemDataAlignment = DMA_MDATAALIGN_WORD;
hdma_spi2_rx。Init.Mode = DMA_NORMAL;//DMA_NORMAL
hdma_spi2_rx.Init.Priority = DMA_PRIORITY_VERY_HIGH;
hdma_spi2_rx。Init.FIFOMode = DMA_FIFOMODE_DISABLE;
if (HAL_DMA_Init(&hdma_spi2_rx) != HAL_OK)
{
Error_Handler();
}

__HAL_LINKDMA(spiHandle,hdmarx,hdma_spi2_rx);

/* SPI2 中断初始化 */
HAL_NVIC_SetPriority(SPI2_IRQn, 0, 0);
HAL_NVIC_EnableIRQ(SPI2_IRQn);
/* 用户代码开始SPI2_MspInit 1 */

/* 用户代码结束SPI2_MspInit 1 */

  }
}

154804hzpook13om0ogbkz.png

154808z1jn00040jl06znf.png

154810og0gd6z72v30cgzv.png

1 REPLY 1
mƎALLEm
ST Employee

Hello @kevin_sa and welcome to the ST community,

1- The official language used in the forum is English. So please use it.

2- Please review how to post a thread in this community especially how to share a code.

See these posts:

How to write your question to maximize your chances to find a solution

How to insert source code

Thank you for your understanding

 

To give better visibility on the answered topics, please click on "Accept as Solution" on the reply which solved your issue or answered your question.