ST意法半导体
直播中

刘桂兰

8年用户 1047经验值
私信 关注
[问答]

使用STM32H743对外部一个ADC芯片做数据采集,根据CubeMX配置的驱动无法触发SPI,怎么解决?

最近使用STM32H743对外部一个ADC芯片做数据采集,想通过外部中断信号触发SPI DMA读取数据(每次3byte),但根据CubeMX配置的驱动无法触发SPI(无CLK时钟信号发出)。
工程也已经根据CubeMX生成的代码,增加了如下配置:
pSyncConfig.SyncSignalID = HAL_DMAMUX1_SYNC_EXti0;pSyncConfig.SyncPolarity = HAL_DMAMUX_SYNC_FALLING;pSyncConfig.SyncEnable = ENABLE;pSyncConfig.EventEnable = ENABLE;pSyncConfig.RequestNumber = 3;if (HAL_DMAEx_ConfigMuxSync(&hdma_spi5_rx, &pSyncConfig) != HAL_OK){Error_Handler();}
目前调试发现,外部PA0中断可以正常发生并进入中断入口,
单独使用HAL_SPI_TransmitReceive_DMA 或HAL_SPI_Receive_DMA也可以进行通信
但EXTI0事件却无法触发同步SPI DMA传输,请问是否有大神知道,有哪些细节没有配置到位吗?
首次使用STM32H7,对DMAMUX不是很了解。

回帖(1)

叹久

2025-3-10 16:21:28

在使用STM32H743对外部ADC芯片进行数据采集时,如果遇到SPI无法触发(无CLK时钟信号发出)的问题,可能是由于配置或硬件连接问题导致的。以下是一些可能的解决方案和调试步骤:




1. 检查SPI配置



  • 确保SPI的时钟、数据线、片选信号等引脚配置正确。

  • 检查SPI的时钟频率是否在ADC芯片的允许范围内。

  • 确保SPI的工作模式(主模式/从模式)配置正确。

  • 使用CubeMX生成的代码后,手动检查SPI_HandleTypeDef结构体的配置是否正确。




2. 检查DMA配置



  • 确保DMA通道已正确配置为SPI的接收或发送通道。

  • 检查DMA的触发源是否配置为SPI的传输完成或外部中断。

  • 确保DMA的缓冲区和数据长度设置正确。




3. 检查外部中断配置



  • 确保外部中断引脚配置正确,并且中断信号能够正确触发。

  • 检查外部中断的触发方式(上升沿/下降沿)是否与硬件信号匹配。

  • 在中断服务函数中,确保调用了SPI的启动函数(如HAL_SPI_Transmit_DMAHAL_SPI_Receive_DMA)。




4. 检查DMAMUX同步配置



  • 确保HAL_DMAEx_ConfigMuxSync函数的配置正确,特别是SyncSignalIDSyncPolaritySyncEnable等参数。

  • 检查RequestNumber的值是否合理,避免设置过大或过小。

  • 确保DMAMUX的同步信号源(如EXTI0)能够正确触发。




5. 调试步骤



  • 使用逻辑分析仪或示波器检查SPI的CLK、MOSI、MISO和片选信号,确认是否有信号输出。

  • 在SPI初始化后,手动调用HAL_SPI_TransmitHAL_SPI_Receive函数,测试SPI是否正常工作。

  • 在外部中断服务函数中添加调试信息(如翻转GPIO引脚),确认中断是否被触发。

  • 检查DMA传输是否完成,可以通过HAL_DMA_GetState函数获取DMA的状态。




6. 参考代码


以下是一个简单的SPI DMA接收配置示例,供参考:


// SPI初始化
hspi5.Instance = SPI5;
hspi5.Init.Mode = SPI_MODE_MASTER;
hspi5.Init.Direction = SPI_DIRECTION_2LINES;
hspi5.Init.DataSize = SPI_DATASIZE_8BIT;
hspi5.Init.CLKPolarity = SPI_POLARITY_LOW;
hspi5.Init.CLKPhase = SPI_PHASE_1EDGE;
hspi5.Init.NSS = SPI_NSS_SOFT;
hspi5.Init.BaudRatePrescaler = SPI_BAUDRATEPRESCALER_8;
hspi5.Init.FirstBit = SPI_FIRSTBIT_MSB;
hspi5.Init.TIMode = SPI_TIMODE_DISABLE;
hspi5.Init.CRCCalculation = SPI_CRCCALCULATION_DISABLE;
hspi5.Init.CRCPolynomial = 10;
if (HAL_SPI_Init(&hspi5) != HAL_OK) {
    Error_Handler();
}

// DMA配置
hdma_spi5_rx.Instance = DMA1_Stream0;
hdma_spi5_rx.Init.Channel = DMA_CHANNEL_2;
hdma_spi5_rx.Init.Direction = DMA_PERIPH_TO_MEMORY;
hdma_spi5_rx.Init.PeriphInc = DMA_PINC_DISABLE;
hdma_spi5_rx.Init.MemInc = DMA_MINC_ENABLE;
hdma_spi5_rx.Init.PeriphDataAlignment = DMA_PDATAALIGN_BYTE;
hdma_spi5_rx.Init.MemDataAlignment = DMA_MDATAALIGN_BYTE;
hdma_spi5_rx.Init.Mode = DMA_NORMAL;
hdma_spi5_rx.Init.Priority = DMA_PRIORITY_HIGH;
hdma_spi5_rx.Init.FIFOMode = DMA_FIFOMODE_DISABLE;
if (HAL_DMA_Init(&hdma_spi5_rx) != HAL_OK) {
    Error_Handler();
}

// DMAMUX同步配置
pSyncConfig.SyncSignalID = HAL_DMAMUX1_SYNC_EXTI0;
pSyncConfig.SyncPolarity = HAL_DMAMUX_SYNC_FALLING;
pSyncConfig.SyncEnable = ENABLE;
pSyncConfig.EventEnable = ENABLE;
pSyncConfig.RequestNumber = 3;
if (HAL_DMAEx_ConfigMuxSync(&hdma_spi5_rx, &pSyncConfig) != HAL_OK) {
    Error_Handler();
}

// 启动SPI DMA接收
HAL_SPI_Receive_DMA(&hspi5, spi_rx_buffer, 3);



7. 常见问题



  • SPI时钟未输出:检查SPI是否已启用(__HAL_SPI_ENABLE),或者片选信号是否正确。

  • DMA未触发:检查DMAMUX配置和外部中断是否正常工作。

  • 数据错误:检查SPI的时钟极性和相位配置,确保与ADC芯片匹配。




通过以上步骤,应该能够定位并解决问题。如果仍然无法解决,建议参考STM32H743的参考手册和ADC芯片的数据手册,进一步排查硬件和软件配置。

举报

更多回帖

发帖
×
20
完善资料,
赚取积分