请问一下STM32H7的SPI+DMA该如何配置,之前按照同样的方式配置F4和F7的时候都没有什么问题,这次换了H7的芯片,在移植程序的时候一只卡在SPI+DMA这里无法通过,不加DMA单调试SPI的时候收发都没有问题,就是加上DMA以后一只发生DMA传输错误,请问这是什么原因造成的,附上DPI+DMA的配置代码void SPI1_Init(void)
{
SPI1_Handler.Instance=SPI1; //SP1
SPI1_Handler.Init.Mode=SPI_MODE_MASTER; //设置SPI工作模式,设置为主模式
SPI1_Handler.Init.Direction=SPI_DIRECTION_2LINES; //设置SPI单向或者双向的数据模式:SPI设置为双线模式
SPI1_Handler.Init.DataSize=SPI_DATASIZE_16BIT; //设置SPI的数据大小:SPI发送接收16位帧结构
SPI1_Handler.Init.CLKPolarity=SPI_POLARITY_LOW; //串行同步时钟的空闲状态为低电平
SPI1_Handler.Init.CLKPhase=SPI_PHASE_2EDGE; //串行同步时钟的第一个跳变沿(上升或下降)数据被采样
SPI1_Handler.Init.NSS=SPI_NSS_SOFT; //NSS信号由硬件(NSS管脚)还是软件(使用SSI位)管理:内部NSS信号有SSI位控制
SPI1_Handler.Init.BaudRatePrescaler=SPI_BAUDRATEPRESCALER_32;//定义波特率预分频的值:波特率预分频值为8
SPI1_Handler.Init.FirstBit=SPI_FIRSTBIT_MSB; //指定数据传输从MSB位还是LSB位开始:数据传输从MSB位开始
SPI1_Handler.Init.TIMode=SPI_TIMODE_DISABLE; //关闭TI模式
SPI1_Handler.Init.CRCCalculation=SPI_CRCCALCULATION_DISABLE;//关闭硬件CRC校验
SPI1_Handler.Init.CRCPolynomial=7; //CRC值计算的多项式
HAL_SPI_Init(&SPI1_Handler);
}
void HAL_SPI_MspInit(SPI_HandleTypeDef *hspi)
{
GPIO_InitTypeDef GPIO_Initure;
if(hspi->Instance == SPI1)
{
__HAL_RCC_SPI1_CLK_ENABLE();
__HAL_RCC_GPIOA_CLK_ENABLE();
__HAL_RCC_GPIOC_CLK_ENABLE();
/**SPI1 GPIO Configuration
PA4 ------> SPI1_NSS
PA5 ------> SPI1_SCK
PA6 ------> SPI1_MISO
PA7 ------> SPI1_MOSI
*/
// PA5 PA6 PA7
GPIO_Initure.Pin= GPIO_PIN_5 | GPIO_PIN_6 | GPIO_PIN_7 ; //PA5 PA6 PA7
GPIO_Initure.Mode=GPIO_MODE_AF_PP; //复用推挽输出
GPIO_Initure.Pull=GPIO_NOPULL;
GPIO_Initure.Speed=GPIO_SPEED_FREQ_VERY_HIGH; //高速
GPIO_Initure.Alternate=GPIO_AF5_SPI1; //复用为spi1
HAL_GPIO_Init(GPIOA,&GPIO_Initure); //初始化PI
//片选信号 PA4
GPIO_Initure.Pin= GPIO_PIN_4; //PA4
GPIO_Initure.Mode=GPIO_MODE_OUTPUT_PP; //推挽输出
GPIO_Initure.Pull=GPIO_NOPULL;
GPIO_Initure.Speed=GPIO_SPEED_FREQ_VERY_HIGH; //高速
HAL_GPIO_Init(GPIOA,&GPIO_Initure); //初始化PA
SPI_CS_HIGH; //片选取消
//中断引脚 Pc4
GPIO_Initure.Pin = GPIO_PIN_4;
GPIO_Initure.Mode = GPIO_MODE_INPUT;
GPIO_Initure.Pull=GPIO_PULLDOWN;
GPIO_Initure.Speed=GPIO_SPEED_FREQ_VERY_HIGH; //高速
HAL_GPIO_Init(GPIOC,&GPIO_Initure); //初始化PB
__HAL_SPI_ENABLE(&SPI1_Handler); //启动SPI
SPI1_DMA_Config();
}
}
void SPI1_DMA_Config(void)
{
u8 res = HAL_ERROR;
__HAL_RCC_DMA2_CLK_ENABLE();
//rx DMA配置
hdma_spi1_rx.Instance=DMA2_Stream2; //数据流选择
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_HALFWORD; //外设数据长度:8位
hdma_spi1_rx.Init.MemDataAlignment=DMA_MDATAALIGN_HALFWORD; //存储器数据长度:8位
hdma_spi1_rx.Init.Mode=DMA_NORMAL; //外设普通模式
hdma_spi1_rx.Init.Priority=DMA_PRIORITY_VERY_HIGH; //优先级 非常高.
hdma_spi1_rx.Init.FIFOMode = DMA_FIFOMODE_DISABLE;
res = HAL_DMA_Init(&hdma_spi1_rx);
__HAL_LINKDMA(&SPI1_Handler,hdmarx,hdma_spi1_rx); //将DMA与SPI2联系起来(接受DMA)
//tx
//tx DMA配置
hdma_spi1_tx.Instance=DMA2_Stream3; //数据流选择
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_HALFWORD; //外设数据长度:16位
hdma_spi1_tx.Init.MemDataAlignment=DMA_MDATAALIGN_HALFWORD; //存储器数据长度:16位
hdma_spi1_tx.Init.Mode=DMA_NORMAL; //外设普通模式
hdma_spi1_tx.Init.Priority=DMA_PRIORITY_VERY_HIGH; //优先级 非常高.
hdma_spi1_tx.Init.FIFOMode = DMA_FIFOMODE_DISABLE;
res = HAL_DMA_Init(&hdma_spi1_tx);
__HAL_LINKDMA(&SPI1_Handler,hdmatx,hdma_spi1_tx); //将DMA与SPI2联系起来(接受DMA)
HAL_NVIC_SetPriority(DMA2_Stream3_IRQn, 1, 3);
HAL_NVIC_EnableIRQ(DMA2_Stream3_IRQn);
HAL_NVIC_SetPriority(DMA2_Stream2_IRQn, 1, 4);
HAL_NVIC_EnableIRQ(DMA2_Stream2_IRQn);
}
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
SPI是全双工的 你在发的同时从机肯定有数据过来的 只不过你不关心丢弃掉了而已,了解一下SPI的工作机制你就明白了
嗯,现在是这样,如果我不使用DMA发送,只是用HAL_SPI_Transmit这个函数发送的话,是能够发过去的,但是使用DMA的话就只能发送一次数据(96k的数据),然后后面SPI就一直处于OVR状态。
我 H7 SPI DMA读的数据一直是0
一周热门 更多>