久芯网

SPI DMA 接收数据时会发送及异常中断的问题

avatar erthgfhfghgf 提问时间: 2023-10-04 06:27:36 / 未解决
  1. u8 ad_long[500];
  2. u8 cd_long[400];
  3.   while (1)
  4.   {
  5.           HAL_UART_Transmit(&huart1,(uint8_t *)"DMA_ON",6,100);
  6.           HAL_SPI_Receive_DMA(&hspi1, ad_long, 400);

  7.           HAL_UART_Transmit(&huart1,(uint8_t *)"DMA_OK",6,100);
  8.           
  9.           HAL_Delay(300);

  10.   }
复制代码

stm32f1xx_it.c:
  1. void DMA1_Channel2_IRQHandler(void)
  2. {
  3.   /* USER CODE BEGIN DMA1_Channel2_IRQn 0 */
  4.         HAL_UART_Transmit(&huart1,(uint8_t *)"IRQ_RX",6,100);
  5.   /* USER CODE END DMA1_Channel2_IRQn 0 */
  6.   HAL_DMA_IRQHandler(&hdma_spi1_rx);
  7.   /* USER CODE BEGIN DMA1_Channel2_IRQn 1 */

  8.   /* USER CODE END DMA1_Channel2_IRQn 1 */
  9. }

  10. /**
  11.   * @brief This function handles DMA1 channel3 global interrupt.
  12.   */
  13. void DMA1_Channel3_IRQHandler(void)
  14. {
  15.   /* USER CODE BEGIN DMA1_Channel3_IRQn 0 */
  16.         HAL_UART_Transmit(&huart1,(uint8_t *)"IRQ_TX",6,100);
  17.   /* USER CODE END DMA1_Channel3_IRQn 0 */
  18.   HAL_DMA_IRQHandler(&hdma_spi1_tx);
  19.   /* USER CODE BEGIN DMA1_Channel3_IRQn 1 */

  20.   /* USER CODE END DMA1_Channel3_IRQn 1 */
  21. }
复制代码


代码如上,好像不能直接从剪贴板上传图片。。
简单描述下逻辑分析仪抓到的结果把:
HAL_SPI_Receive_DMA()开始接收后会在MOSI上发送一段0xff,理论上MOSI电平应该不变啊?
DMA接收完成后(SCK不变了),串口会先收到IRQ_TX之后才是IRQ_RX,也就是说同时进入了DMA1 的2和3通道的中断服务函数 这是为什么啊?
1个回答
  • avatar butterflyspring
    回答时间: 2023-10-04 06:44:27

    HAL_SPI_Receive_DMA()这个函数没记错的话应该是发送一段数据为了主接收,产生CLOCK读取数据。至于发送的数据看你代码里填充的什么数据。 DMA要看你使能了哪个中断,调试时看一下使能了哪个DMA中断。打开了相应的中断使能才会进入的。

会员中心 微信客服
客服
回到顶部