本帖最后由 在路上(起航) 于 2019-2-18 13:46 编辑
HAL库用的是V1.3版本
下面是DMA初始化
[mw_shl_code=applescript,true]void SPI2_DMA_Config(DMA_Stream_TypeDef *DMA_Streamx)
{
if((u32)DMA_Streamx>(u32)DMA2)//得到当前stream是属于DMA2还是DMA1
{
__HAL_RCC_DMA2_CLK_ENABLE();//DMA2时钟使能
}else
{
__HAL_RCC_DMA1_CLK_ENABLE();//DMA1时钟使能
}
//Tx DMA配置
SPI2TxDMA1_Handler.Instance=DMA_Streamx; //数据流选择
SPI2TxDMA1_Handler.Init.Request=DMA_REQUEST_SPI2_TX; //SPI2发送DMA
SPI2TxDMA1_Handler.Init.Direction=DMA_MEMORY_TO_PERIPH; //存储器到外设
SPI2TxDMA1_Handler.Init.PeriphInc=DMA_PINC_DISABLE; //外设非增量模式
SPI2TxDMA1_Handler.Init.MemInc=DMA_MINC_ENABLE; //存储器增量模式
SPI2TxDMA1_Handler.Init.PeriphDataAlignment=DMA_PDATAALIGN_BYTE; //外设数据长度:8位
SPI2TxDMA1_Handler.Init.MemDataAlignment=DMA_MDATAALIGN_BYTE; //存储器数据长度:8位
SPI2TxDMA1_Handler.Init.Mode=DMA_NORMAL; //外设流控模式
SPI2TxDMA1_Handler.Init.Priority=DMA_PRIORITY_HIGH; //中等优先级
SPI2TxDMA1_Handler.Init.FIFOMode=DMA_FIFOMODE_DISABLE;
SPI2TxDMA1_Handler.Init.FIFOThreshold=DMA_FIFO_THRESHOLD_FULL;
SPI2TxDMA1_Handler.Init.MemBurst=DMA_MBURST_SINGLE; //存储器突发单次传输
SPI2TxDMA1_Handler.Init.PeriphBurst=DMA_PBURST_SINGLE; //外设突发单次传输
HAL_DMA_DeInit(&SPI2TxDMA1_Handler);
HAL_DMA_Init(&SPI2TxDMA1_Handler);
__HAL_LINKDMA(&SPI2_Handler,hdmatx,SPI2TxDMA1_Handler); //将DMA与USART1联系起来(发送DMA)
} [/mw_shl_code]
下面是初始化SPI2
[mw_shl_code=applescript,true]void SPI2_Init(void)
{
SPI2_Handler.Instance=SPI2; //SP2
SPI2_Handler.Init.Mode=SPI_MODE_MASTER; //设置SPI工作模式,设置为主模式
SPI2_Handler.Init.Direction=SPI_DIRECTION_2LINES_TXONLY;//设置SPI单向或者双向的数据模式:SPI设置为双线模式
SPI2_Handler.Init.DataSize=SPI_DATASIZE_8BIT; //设置SPI的数据大小:SPI发送接收8位帧结构
SPI2_Handler.Init.CLKPolarity=SPI_POLARITY_LOW; //串行同步时钟的空闲状态为高电平
SPI2_Handler.Init.CLKPhase=SPI_PHASE_1EDGE; //串行同步时钟的第二个跳变沿(上升或下降)数据被采样
SPI2_Handler.Init.NSS=SPI_NSS_SOFT; //NSS信号由硬件(NSS管脚)还是软件(使用SSI位)管理:内部NSS信号有SSI位控制
SPI2_Handler.Init.NSSPMode=SPI_NSS_PULSE_DISABLE;//NSS信号脉冲失能
SPI2_Handler.Init.MasterKeepIOState=SPI_MASTER_KEEP_IO_STATE_ENABLE; //SPI主模式IO状态保持使能
SPI2_Handler.Init.BaudRatePrescaler=SPI_BAUDRATEPRESCALER_4;//定义波特率预分频的值:波特率预分频值为256
SPI2_Handler.Init.FirstBit=SPI_FIRSTBIT_MSB; //指定数据传输从MSB位还是LSB位开始:数据传输从MSB位开始
SPI2_Handler.Init.TIMode=SPI_TIMODE_DISABLE; //关闭TI模式
SPI2_Handler.Init.CRCCalculation=SPI_CRCCALCULATION_DISABLE;//关闭硬件CRC校验
SPI2_Handler.Init.CRCPolynomial=7; //CRC值计算的多项式
HAL_SPI_Init(&SPI2_Handler);
__HAL_SPI_ENABLE(&SPI2_Handler); //使能SPI2
// SPI2_ReadWriteByte(0Xff); //启动传输
}[/mw_shl_code]
下面是循环调用,100MS调用一次
[mw_shl_code=applescript,true]HAL_SPI_DMAStop(&SPI2_Handler); //传输完成以后关闭串口DMA
HAL_SPI_Transmit_DMA(&SPI2_Handler, showBuff, 36); //开启DMA传输[/mw_shl_code]
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
一周热门 更多>