针对您遇到的STM32U3在I2C通信后SPI+DMA无法使能的问题,以下是逐步排查和解决方案:
HAL_StatusTypeDef i2c_status = HAL_I2C_Mem_Write(&hi2c1, 0x80, HDC2080_DI_REG, 1, data1, 1, 100);
if (i2c_status != HAL_OK) {
Error_Handler(); // 检查I2C写入是否成功
}
while (HAL_I2C_GetState(&hi2c1) != HAL_I2C_STATE_READY); // 确保I2C已完全释放HAL_SPI_DeInit(&hspi2);
MX_SPI2_Init(); // 重新初始化SPI
HAL_DMA_DeInit(hspi2.hdmatx);
MX_DMA_Init(); // 重新初始化DMA// 示例:重新设置SPI的SCK/MOSI引脚为AF模式
GPIO_InitTypeDef gpio_init;
gpio_init.Pin = GPIO_PIN_13 | GPIO_PIN_15; // 根据实际引脚修改
gpio_init.Mode = GPIO_MODE_AF_PP;
gpio_init.Pull = GPIO_NOPULL;
gpio_init.Speed = GPIO_SPEED_FREQ_HIGH;
gpio_init.Alternate = GPIO_AF5_SPI2; // 根据数据手册选择正确的AF
HAL_GPIO_Init(GPIOB, &gpio_init);__HAL_RCC_SPI2_CLK_ENABLE(); // 强制开启SPI时钟
__HAL_RCC_DMA1_CLK_ENABLE(); // 开启DMA时钟(根据实际DMA控制器)new_wave缓冲区地址或大小可能在data1非0时无效。new_wave是否为全局变量或静态分配,避免栈溢出。new_wave地址确认有效性:printf("new_wave address: %pn", new_wave);DMA1_Stream0_IRQHandler)已正确实现并清除标志位。// 在启动DMA传输前,清除可能的残留标志
__HAL_DMA_DISABLE(hspi2.hdmatx);
hspi2.hdmatx->Instance->CCR = 0; // 重置DMA配置寄存器
__HAL_DMA_CLEAR_FLAG(hspi2.hdmatx, DMA_FLAG_TCIFx_4); // 根据数据手册调整标志位HAL_StatusTypeDef spi_status = HAL_SPI_Transmit_DMA(&hspi2, new_wave, sizeof(new_wave));
if (spi_status != HAL_OK) {
printf("SPI DMA Error: %dn", spi_status); // 打印错误码
Error_Handler();
}通过以上步骤应能定位并解决DMA使能失败的问题。如果仍存在问题,建议使用调试器单步跟踪,并观察相关寄存器的实时状态(如SPI->SR、DMA->ISR等)。
举报
更多回帖