初级会员

- 积分
- 129
- 金钱
- 129
- 注册时间
- 2017-8-3
- 在线时间
- 32 小时
|
void SpiTX_Config(DMA_Stream_TypeDef *DMA_Streamx,u32 chx)
{
if((u32)DMA_Streamx>(u32)DMA2)//μÃμ½μ±Ç°streamêÇêôóúDMA2»1êÇDMA1
{
__HAL_RCC_DMA2_CLK_ENABLE();//DMA2ê±Öóê1Äü
}else
{
__HAL_RCC_DMA1_CLK_ENABLE();//DMA1ê±Öóê1Äü
}
//½«DMAóëUSART1áaÏμÆeà′(·¢ËíDMA)
// HAL_DMA_DeInit(&SPI3TXDMA_Handler);
__HAL_DMA_ENABLE(&SPI3TXDMA_Handler);
__HAL_LINKDMA(&hspi1,hdmatx,SPI3TXDMA_Handler);
// while(HAL_DMA_GetState(&SPI3TXDMA_Handler) != DISABLE){}
//Tx DMAÅäÖÃ
SPI3TXDMA_Handler.Instance=DMA_Streamx; //êy¾Yá÷Ñ¡Ôñ
SPI3TXDMA_Handler.Init.Channel=chx; //í¨μàÑ¡Ôñ
SPI3TXDMA_Handler.Init.Direction=DMA_MEMORY_TO_PERIPH; //′æ′¢Æ÷μ½íaéè
SPI3TXDMA_Handler.Init.PeriphInc=DMA_PINC_DISABLE; //íaéè·ÇÔöá¿Ä£ê½
SPI3TXDMA_Handler.Init.MemInc=DMA_MINC_ENABLE; //′æ′¢Æ÷Ôöá¿Ä£ê½
SPI3TXDMA_Handler.Init.PeriphDataAlignment=DMA_PDATAALIGN_BYTE; //íaéèêy¾Y3¤¶è:8λ
SPI3TXDMA_Handler.Init.MemDataAlignment=DMA_MDATAALIGN_BYTE; //′æ′¢Æ÷êy¾Y3¤¶è:8λ
SPI3TXDMA_Handler.Init.Mode=DMA_CIRCULAR; //íaéèÆÕí¨Ä£ê½
SPI3TXDMA_Handler.Init.Priority=DMA_PRIORITY_HIGH; //ÖDμèóÅÏè¼¶
SPI3TXDMA_Handler.Init.FIFOMode=DMA_FIFOMODE_DISABLE;
SPI3TXDMA_Handler.Init.FIFOThreshold=DMA_FIFO_THRESHOLD_FULL;
SPI3TXDMA_Handler.Init.MemBurst=DMA_MBURST_SINGLE; //′æ′¢Æ÷í»·¢μ¥′Î′«êä
SPI3TXDMA_Handler.Init.PeriphBurst=DMA_PBURST_SINGLE; //íaéèí»·¢μ¥′Î′«êä
HAL_DMA_DeInit(&SPI3TXDMA_Handler);
HAL_DMA_Init(&SPI3TXDMA_Handler);
__HAL_DMA_CLEAR_FLAG(&SPI3TXDMA_Handler,DMA_FLAG_TCIF3_7);
// HAL_DMA_Start_IT(&SPI3TXDMA_Handler,(uint32_t )(&(SPI3->DR)),(uint32_t)0,USART_REC_LEN);
SPI3TXDMA_Handler.Instance->CR |= DMA_IT_TC ;
HAL_NVIC_SetPriority( DMA1_Stream7_IRQn, 5, 1 );
HAL_NVIC_EnableIRQ( DMA1_Stream7_IRQn );
}
void SpiRX_Config(DMA_Stream_TypeDef *DMA_Streamx,u32 chx)
{
if((u32)DMA_Streamx>(u32)DMA2)
{
__HAL_RCC_DMA2_CLK_ENABLE();
}else
{
__HAL_RCC_DMA1_CLK_ENABLE();//DMA1ê±Öóê1Äü
}
//½«DMAóëUSART1áaÏμÆeà′(·¢ËíDMA)
// HAL_DMA_DeInit(&SPI3RXDMA_Handler);
__HAL_DMA_ENABLE(&SPI3RXDMA_Handler);
__HAL_LINKDMA(&hspi1,hdmarx,SPI3RXDMA_Handler);
// while(HAL_DMA_GetState(&SPI3RXDMA_Handler) != DISABLE){}
//Tx DMAÅäÖÃ
SPI3RXDMA_Handler.Instance=DMA_Streamx; //êy¾Yá÷Ñ¡Ôñ
SPI3RXDMA_Handler.Init.Channel=chx; //í¨μàÑ¡Ôñ
SPI3RXDMA_Handler.Init.Direction=DMA_PERIPH_TO_MEMORY; //′æ′¢Æ÷μ½íaéè
SPI3RXDMA_Handler.Init.PeriphInc=DMA_PINC_DISABLE; //íaéè·ÇÔöá¿Ä£ê½
SPI3RXDMA_Handler.Init.MemInc=DMA_MINC_ENABLE; //′æ′¢Æ÷Ôöá¿Ä£ê½
SPI3RXDMA_Handler.Init.PeriphDataAlignment=DMA_PDATAALIGN_BYTE; //íaéèêy¾Y3¤¶è:8λ
SPI3RXDMA_Handler.Init.MemDataAlignment=DMA_MDATAALIGN_BYTE; //′æ′¢Æ÷êy¾Y3¤¶è:8λ
SPI3RXDMA_Handler.Init.Mode=DMA_CIRCULAR; //íaéèÆÕí¨Ä£ê½
SPI3RXDMA_Handler.Init.Priority=DMA_PRIORITY_HIGH; //ÖDμèóÅÏè¼¶
SPI3RXDMA_Handler.Init.FIFOMode=DMA_FIFOMODE_DISABLE;
SPI3RXDMA_Handler.Init.FIFOThreshold=DMA_FIFO_THRESHOLD_FULL;
SPI3RXDMA_Handler.Init.MemBurst=DMA_MBURST_SINGLE; //′æ′¢Æ÷í»·¢μ¥′Î′«êä
SPI3RXDMA_Handler.Init.PeriphBurst=DMA_PBURST_SINGLE; //íaéèí»·¢μ¥′Î′«êä
HAL_DMA_DeInit(&SPI3RXDMA_Handler);
HAL_DMA_Init(&SPI3RXDMA_Handler);
__HAL_DMA_CLEAR_FLAG(&SPI3RXDMA_Handler,DMA_FLAG_TCIF0_4);
// HAL_DMA_Start_IT(&SPI3RXDMA_Handler,(uint32_t )(&(SPI3->DR)),(uint32_t)0,USART_REC_LEN);
SPI3RXDMA_Handler.Instance->CR |= DMA_IT_TC ;
HAL_NVIC_SetPriority( DMA1_Stream0_IRQn, 5, 1 );
HAL_NVIC_EnableIRQ( DMA1_Stream0_IRQn );
}
void MX_SPI1_Init(void)
{
hspi1.Instance = SPI3;
hspi1.Init.Mode = SPI_MODE_MASTER;
hspi1.Init.Direction = SPI_DIRECTION_2LINES;
hspi1.Init.DataSize = SPI_DATASIZE_8BIT;
hspi1.Init.CLKPolarity = SPI_POLARITY_LOW;
hspi1.Init.CLKPhase = SPI_PHASE_1EDGE;
hspi1.Init.NSS = SPI_NSS_SOFT;
hspi1.Init.BaudRatePrescaler = SPI_BAUDRATEPRESCALER_2;
hspi1.Init.FirstBit = SPI_FIRSTBIT_MSB;
hspi1.Init.TIMode = SPI_TIMODE_DISABLE;
hspi1.Init.CRCCalculation = SPI_CRCCALCULATION_DISABLE;
hspi1.Init.CRCPolynomial = 7;
// hspi1.Init.CRCLength = SPI_CRC_LENGTH_DATASIZE;
// hspi1.Init.NSSPMode = SPI_NSS_PULSE_DISABLE;
if (HAL_SPI_Init(&hspi1) != HAL_OK)
{
_Error_Handler(__FILE__, __LINE__);
}
#if USE_DMA
// HAL_SPI_Receive_DMA(&hspi1, USART_RX_BUF, 255);
SpiTX_Config(DMA1_Stream7,DMA_CHANNEL_0);
SpiRX_Config(DMA1_Stream0,DMA_CHANNEL_0);
#endif
}
void DMA1_Stream0_IRQHandler(void)
{
printf("1\r\n");
HAL_DMA_IRQHandler(&SPI3RXDMA_Handler);
}
void DMA1_Stream7_IRQHandler(void)
{
printf("2\r\n");
HAL_DMA_IRQHandler(&SPI3TXDMA_Handler);
}
HAL_SPI_TransmitReceive_DMA( &SpiHandle, txBuffer, rxBuffer, size );//调用该函数进行数据传输
|
|