|

楼主 |
发表于 2025-8-14 17:32:32
|
显示全部楼层
你好,请问下循环模式改为normal模式,怎么代码就跑不起来了。应该传输一次数组才对,请指导,谢谢/
SPI 的初始化为:void MX_SPI1_Init(void)
{
/* USER CODE BEGIN SPI1_Init 0 */
/* USER CODE END SPI1_Init 0 */
/* USER CODE BEGIN SPI1_Init 1 */
/* USER CODE END SPI1_Init 1 */
/* 设置SPI参数 */
hspi1.Instance = SPI1; /* 例化SPI */
hspi1.Init.BaudRatePrescaler = SPI_BAUDRATEPRESCALER_128; /* 设置波特率 -4*/
hspi1.Init.Direction = SPI_DIRECTION_2LINES_TXONLY; /* 半双工 */
hspi1.Init.CLKPhase = SPI_PHASE_2EDGE; /* 配置时钟相位 */
hspi1.Init.CLKPolarity = SPI_POLARITY_LOW; /* 配置时钟极性 */
hspi1.Init.DataSize = SPI_DATASIZE_24BIT; /* 设置数据宽度 */
hspi1.Init.FirstBit = SPI_FIRSTBIT_MSB; /* 数据传输先传高位 */
hspi1.Init.TIMode = SPI_TIMODE_DISABLE; /* 禁止TI模式 */
hspi1.Init.CRCCalculation = SPI_CRCCALCULATION_DISABLE; /* 禁止CRC */
hspi1.Init.CRCPolynomial = 7; /* 禁止CRC后,此位无效 */
hspi1.Init.CRCLength = SPI_CRC_LENGTH_8BIT; /* 禁止CRC后,此位无效 */
hspi1.Init.FifoThreshold = SPI_FIFO_THRESHOLD_01DATA; /* 设置FIFO大小是一个数据项 */
hspi1.Init.NSS = SPI_NSS_HARD_OUTPUT; /* 使用软件方式管理片选引脚 */
hspi1.Init.NSSPMode = SPI_NSS_PULSE_ENABLE; /* 使能脉冲输出 */
hspi1.Init.NSSPolarity = SPI_NSS_POLARITY_LOW; /* 低电平有效 */
hspi1.Init.MasterSSIdleness = SPI_MASTER_SS_IDLENESS_00CYCLE; /* MSS, 插入到NSS有效边沿和第一个数据开始之间的额外延迟,单位SPI时钟周期个数 */
hspi1.Init.MasterInterDataIdleness = SPI_MASTER_INTERDATA_IDLENESS_10CYCLE; /* MIDI, 两个连续数据帧之间插入的最小时间延迟,单位SPI时钟周期个数 */
hspi1.Init.MasterKeepIOState = SPI_MASTER_KEEP_IO_STATE_ENABLE; /* 禁止SPI后,SPI相关引脚保持当前状态 */
hspi1.Init.Mode = SPI_MODE_MASTER; /* SPI工作在主控模式 */
/* 初始化配置 */
if (HAL_SPI_Init(&hspi1) != HAL_OK)
{
Error_Handler();
} DMA的初始化为:void DMA_Init(void)
{
MX_SPI1_Init();
//---------------------------------------------------------------------------------------------------------------------------------
/* 使能DMA时钟 */
__HAL_RCC_DMA1_CLK_ENABLE(); // 根据实际DMA流选择
/* SPI DMA发送配置 */
hdma_spi1_tx.Instance = DMA1_Stream0; /* 例化使用的DMA数据流 */
hdma_spi1_tx.Init.FIFOMode = DMA_FIFOMODE_ENABLE; /* 使能FIFO*/
hdma_spi1_tx.Init.FIFOThreshold = DMA_FIFO_THRESHOLD_FULL; /* 用于设置阀值, 如果禁止FIFO此位不起作用*/
hdma_spi1_tx.Init.MemBurst = DMA_MBURST_SINGLE; /* 用于存储器突发,如果禁止FIFO此位不起作用*/
hdma_spi1_tx.Init.PeriphBurst = DMA_PBURST_SINGLE; /* 用于外设突发,禁止FIFO此位不起作用 */
hdma_spi1_tx.Init.Request = DMA_REQUEST_SPI1_TX; /* 请求类型 */
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_WORD; /* 外设数据传输位宽选择字节,即8bit */
hdma_spi1_tx.Init.MemDataAlignment = DMA_MDATAALIGN_WORD; /* 存储器数据传输位宽选择字节,即8bit */
hdma_spi1_tx.Init.Mode = DMA_CIRCULAR; /* 正常模式 */
hdma_spi1_tx.Init.Priority = DMA_PRIORITY_LOW; /* 优先级低 */
//----------------------------------------------------------------------------------------------------------
/* 初始化DMA */
if(HAL_DMA_Init(&hdma_spi1_tx) != HAL_OK)
{
Error_Handler();
}
/* 关联DMA句柄到SPI */
__HAL_LINKDMA(&hspi1, hdmatx, hdma_spi1_tx);
/* 使能DMA发送中断 */
// HAL_NVIC_SetPriority(DMA1_Stream0_IRQn, 5, 0);
// HAL_NVIC_EnableIRQ(DMA1_Stream0_IRQn);
/* 同步触发配置 */
dmamux_syncParams.EventEnable = ENABLE;//DISABLE;//ENABLE;
dmamux_syncParams.SyncPolarity = HAL_DMAMUX_SYNC_RISING;
dmamux_syncParams.RequestNumber = 1;
dmamux_syncParams.SyncSignalID = HAL_DMAMUX1_SYNC_TIM12_TRGO; /* HAL_DMAMUX1_SYNC_TIM12_TRGO HAL_DMAMUX1_SYNC_LPTIM1_OUT*/
dmamux_syncParams.SyncEnable = ENABLE;
HAL_DMAEx_ConfigMuxSync(&hdma_spi1_tx, &dmamux_syncParams);
/*##-4- 启动DMA双缓冲传输 ################################################*/
/*
1、此函数会开启DMA的TC,TE和DME中断
2、如果用户配置了回调函数DMA_Handle.XferHalfCpltCallback,那么函数HAL_DMA_Init会开启半传输完成中断。
3、如果用户使用了DMAMUX的同步模式,此函数会开启同步溢出中断。
4、如果用户使用了DMAMUX的请求发生器,此函数会开始请求发生器溢出中断。
*/
// if (HAL_DMAEx_MultiBufferStart_IT(&hdma_spi1_tx,
// (uint32_t)dac_buffer3, // 缓冲区1地址
// (uint32_t)&hspi1.Instance->TXDR, // SPI数据寄存器地址
// (uint32_t)dac_buffer4, // 缓冲区2地址
// 8)!= HAL_OK) {
// Error_Handler();
//}
//HAL_DMA_Start(&hdma_spi1_tx, (uint32_t )dac_buffer4, (uint32_t )&SPI1->TXDR,8);
/* 用不到的中断可以直接关闭 */
// DMA1_Stream0->CR &= ~DMA_IT_DME;
// DMA1_Stream0->CR &= ~DMA_IT_TE;
//DMAMUX1_RequestGenerator0->RGCR &= ~DMAMUX_RGxCR_OIE; HAL_DMA_Start_IT(&hdma, src, dst, length); // 启动带中断的DMA
TIM12_Config();
HAL_SPI_Transmit_DMA(&hspi1, (uint8_t*)g_spiTxBuf, 1000); //该函数通过例程运行成功 g_spiLen/4
},为何仅仅改变DMA_CIRCULAR为normal以后,就不正常传输数组一次了? |
|