429 SPI DMA模式主从双机通讯

本文详细介绍了STM32微控制器中SPI接口的DMA模式配置过程,包括主模式和从模式下的SPI DMA配置,以及如何初始化SPI设备、配置GPIO引脚、设置DMA流和中断。同时,提供了SPI_DMA_Send_Data函数的实现,用于通过DMA方式发送数据。

1.SPI框图

2.SPI DMA模式配置为TI模式可以正常通讯

主模式:



#define SPI5_TX_BUF_SIZE	1*1024
#define SPI5_RX_BUF_SIZE	1*1024
SPI_T s_tSPI5;
static uint8_t s_TxBuf[SPI5_TX_BUF_SIZE];		/* 发送缓冲区 */
static uint8_t s_RxBuf[SPI5_RX_BUF_SIZE];		/* 接收缓冲区 */


void DMA_Use_SPI5_Rx_Init(void)
{
	DMA_InitTypeDef DMA_InitStructure;
    NVIC_InitTypeDef NVIC_InitStructure;
	RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_DMA2, ENABLE); 

    DMA_Cmd(DMA2_Stream3,DISABLE);

	DMA_DeInit(DMA2_Stream3);
	
	DMA_InitStructure.DMA_Channel             = DMA_Channel_2;               
    DMA_InitStructure.DMA_PeripheralBaseAddr  = (uint32_t)&SPI5->DR;   
    DMA_InitStructure.DMA_Memory0BaseAddr     = (uint32_t)s_RxBuf;             
    DMA_InitStructure.DMA_DIR                 = DMA_DIR_PeripheralToMemory;    
    DMA_InitStructure.DMA_BufferSize          = SPI5_RX_BUF_SIZE;                                   
    DMA_InitStructure.DMA_PeripheralInc       = DMA_PeripheralInc_Disable;    
    DMA_InitStructure.DMA_MemoryInc           = DMA_MemoryInc_Enable;         
    DMA_InitStructure.DMA_PeripheralDataSize  = DMA_PeripheralDataSize_Byte;      
    DMA_InitStructure.DMA_MemoryDataSize      = DMA_MemoryDataSize_Byte;      
    DMA_InitStructure.DMA_Mode                = DMA_Mode_Normal;             
    DMA_InitStructure.DMA_Priority            = DMA_Priority_VeryHigh;        
    DMA_InitStructure.DMA_FIFOMode            = DMA_FIFOMode_Disable;          
    DMA_InitStructure.DMA_FIFOThreshold       = DMA_FIFOThreshold_HalfFull; 
    DMA_InitStructure.DMA_MemoryBurst         = DMA_MemoryBurst_Single;      
    DMA_InitStructure.DMA_PeripheralBurst     = DMA_PeripheralBurst_Single;
	
	DMA_Init(DMA2_Stream3, &DMA_InitStructure);
	
	NVIC_InitStructure.NVIC_IRQChannel=DMA2_Stream3_IRQn;
    NVIC_InitStructure.NVIC_IRQChannelCmd=ENABLE;
    NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=0;
    NVIC_InitStructure.NVIC_IRQChannelSubPriority=0;
    NVIC_Init(&NVIC_InitStructure);

    DMA_ClearITPendingBit(DMA2_Stream3, DMA_IT_TCIF3);                            
    DMA_ITConfig(DMA2_Stream3,DMA_IT_TC,ENABLE); 
    DMA_ClearFlag(DMA2_Stream3,DMA_IT_TCIF3);

    SPI_I2S_DMACmd(SPI5,SPI_I2S_DMAReq_Rx,ENABLE);

	DMA_Cmd(DMA2_Stream3,DISABLE);

}

void DMA_Use_SPI5_Tx_Init(void)
{
	DMA_InitTypeDef DMA_InitStructure;
    NVIC_InitTypeDef NVIC_InitStructure;
	RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_DMA2, ENABLE); 

    DMA_Cmd(DMA2_Stream4,DISABLE);

    DMA_DeInit(DMA2_Stream4);
	
	DMA_InitStructure.DMA_Channel             = DMA_Channel_2;               
    DMA_InitStructure.DMA_PeripheralBaseAddr  = (uint32_t)&SPI5->DR;   
    DMA_InitStructure.DMA_Memory0BaseAddr     = (uint32_t)s_TxBuf;             
    DMA_InitStructure.DMA_DIR                 = DMA_DIR_MemoryToPeripheral;    
    DMA_InitStructure.DMA_BufferSize          = SPI5_TX_BUF_SIZE;                                   
    DMA_InitStructure.DMA_PeripheralInc       = DMA_PeripheralInc_Disable;    
    DMA_InitStructure.DMA_MemoryInc           = DMA_MemoryInc_Enable;         
    DMA_InitStructure.DMA_PeripheralDataSize  = DMA_PeripheralDataSize_Byte;      
    DMA_InitStructure.DMA_MemoryDataSize      = DMA_MemoryDataSize_Byte;      
    DMA_InitStructure.DMA_Mode                = DMA_Mode_Normal;             
    DMA_InitStructure.DMA_Priority            = DMA_Priority_VeryHigh;        
    DMA_InitStructure.DMA_FIFOMode            = DMA_FIFOMode_Disable;          
    DMA_InitStructure.DMA_FIFOThreshold       = DMA_FIFOThreshold_HalfFull; 
    DMA_InitStructure.DMA_MemoryBurst         = DMA_MemoryBurst_Single;      
    DMA_InitStructure.DMA_PeripheralBurst     = DMA_PeripheralBurst_Single;
	
	DMA_Init(DMA2_Stream4, &DMA_InitStructure);

	NVIC_InitStructure.NVIC_IRQChannel=DMA2_Stream4_IRQn;
    NVIC_InitStructure.NVIC_IRQChannelCmd=ENABLE;
    NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=0;
    NVIC_InitStructure.NVIC_IRQChannelSubPriority=0;
    NVIC_Init(&NVIC_InitStructure);

    DMA_ClearITPendingBit(DMA2_Stream4, DMA_IT_TCIF4);                            
    DMA_ITConfig(DMA2_Stream4,DMA_IT_TC,ENABLE); 
   
    
	SPI_I2S_DMACmd(SPI5,SPI_I2S_DMAReq_Tx,ENABLE);

	DMA_Cmd(DMA2_Stream4, DISABLE);


}

/***********************************************************************************
* Function	    : SPI_Var_Init
* Description	: 初始化
* Input Para	: 
* Output Para	: 
* Return Value  : 
***********************************************************************************/
void SPIVarInit(void)
{
    s_tSPI5.spi = SPI5;						    /* STM32 SPI设备 */
	s_tSPI5.pTxBuf = s_TxBuf;				    /* 发送缓冲区指针 */
	s_tSPI5.pRxBuf = s_RxBuf;				    /* 接收缓冲区指针 */
	s_tSPI5.usTxBufSize = SPI5_TX_BUF_SIZE;	    /* 发送缓冲区大小 */
	s_tSPI5.usRxBufSize = SPI5_RX_BUF_SIZE;	    /* 接收缓冲区大小 */
	s_tSPI5.usRxCount = 0;						/* 接收到的新数据个数 */
	s_tSPI5.usTxFrame = 0;						/* 待发送的数据个数 */	
	s_tSPI5.usRxFrame = 0;	                    /* 接收到数据帧标志 */
	s_tSPI5.SendBefor = 0;		                /* 发送数据前的回调函数 */
	s_tSPI5.SendOver = 0;		                /* 发送完毕后的回调函数 */
}


void BSP_SPI5_Init(void)
{	
	SPI_InitTypeDef  SPI_InitStructure;
	GPIO_InitTypeDef GPIO_InitStructure;

    SPIVarInit();
	
	RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOH, ENABLE);
	RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOF, ENABLE); 	
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_SPI5, ENABLE);
	
	/*!< Configure SPI_FLASH_SPI pins: SCK */	
	GPIO_InitStructure.GPIO_Pin    = GPIO_Pin_6|GPIO_Pin_5;
	GPIO_InitStructure.GPIO_Mode   = GPIO_Mode_AF;
	GPIO_InitStructure.GPIO_OType  = GPIO_OType_PP;
	GPIO_InitStructure.GPIO_Speed  = GPIO_Speed_50MHz;
	GPIO_InitStructure.GPIO_PuPd   = GPIO_PuPd_UP;
	GPIO_Init(GPIOH, &GPIO_InitStructure); 
  /*!< Configure SPI_FLASH_SPI pins: MISO */
	GPIO_InitStructure.GPIO_Pin    = GPIO_Pin_7;
	GPIO_InitStructure.GPIO_Mode   = GPIO_Mode_AF;
	GPIO_InitStructure.GPIO_OType  = GPIO_OType_PP;
	GPIO_InitStructure.GPIO_Speed  = GPIO_Speed_50MHz;
	GPIO_InitStructure.GPIO_PuPd   = GPIO_PuPd_UP;
	GPIO_Init(GPIOH, &GPIO_InitStructure);
	 /*!< Configure SPI_FLASH_SPI pins: MOSI */
	GPIO_InitStructure.GPIO_Pin    = GPIO_Pin_9;
	GPIO_InitStructure.GPIO_Mode   = GPIO_Mode_AF;
	GPIO_InitStructure.GPIO_OType  = GPIO_OType_PP;
	GPIO_InitStructure.GPIO_Speed  = GPIO_Speed_50MHz;
	GPIO_InitStructure.GPIO_PuPd   = GPIO_PuPd_UP;
	GPIO_Init(GPIOF, &GPIO_InitStructure); 
	/*!< PinAFConfig */
	GPIO_PinAFConfig(GPIOH,GPIO_PinSource5,GPIO_AF_SPI5);
    GPIO_PinAFConfig(GPIOH,GPIO_PinSource6,GPIO_AF_SPI5);  
    GPIO_PinAFConfig(GPIOH,GPIO_PinSource7,GPIO_AF_SPI5);
    GPIO_PinAFConfig(GPIOF,GPIO_PinSource9,GPIO_AF_SPI5); 
   
    SPI_InitStructure.SPI_Direction = SPI_Direction_2Lines_FullDuplex;
    SPI_InitStructure.SPI_Mode = SPI_Mode_Master;
    SPI_InitStructure.SPI_DataSize = SPI_DataSize_8b;
    SPI_InitStructure.SPI_CPOL = SPI_CPOL_Low;
    SPI_InitStructure.SPI_CPHA = SPI_CPHA_1Edge;
    SPI_InitStructure.SPI_NSS = SPI_NSS_Hard;//
    SPI_InitStructure.SPI_BaudRatePrescaler = SPI_BaudRatePrescaler_256;
    SPI_InitStructure.SPI_FirstBit = SPI_FirstBit_MSB;
    SPI_InitStructure.SPI_CRCPolynomial = 7;
		
    SPI_Init(SPI5, &SPI_InitStructure);
	
		
	DMA_Use_SPI5_Rx_Init();	
	DMA_Use_SPI5_Tx_Init();
	
	SPI5->CR2|= 0x0010;   // SPI TI模式
	
	SPI_Cmd(SPI5, ENABLE);
		 
}

uint8 SPI_DMA_Send_Data(SPI_T* spi,u8 *BufferSRC, uint32_t BufferSize)
{
   uint16 i;
	if(spi->usTxFrame != 0)
	{
	    return _FALSE;                    //上一帧未发送完,不能发送
	}
	else
	{
	    for (i = 0; i < BufferSize; i++)      //将新数据填入发送缓冲区 
		{	
			spi->pTxBuf[i] = BufferSRC[i];
		}
	}
  
    if(spi->spi == SPI5)   
    {
        DMA_Cmd(DMA2_Stream4, DISABLE);        
        DMA_ClearFlag(DMA2_Stream4,DMA_IT_TCIF4);   
        DMA_SetCurrDataCounter(DMA2_Stream4,BufferSize );            //设置要发送的数据长度    
        DMA_SetCurrDataCounter(DMA2_Stream3,BufferSize );            //设置要接收的数据长度
        DMA_Cmd(DMA2_Stream3,ENABLE);
        DMA_Cmd(DMA2_Stream4, ENABLE);        
        
        spi->usTxFrame = 0x01;
    }
    return _TRUE; 

}
void DMA2_Stream4_IRQHandler(void)
{
    if(DMA_GetITStatus(DMA2_Stream4,DMA_IT_TCIF4) != RESET)
    {
        DMA_ClearITPendingBit(DMA2_Stream4,DMA_IT_TCIF4);
        while (SPI_I2S_GetFlagStatus(SPI5,SPI_I2S_FLAG_BSY) != RESET){}
        //Send
        DMA_Cmd(DMA2_Stream4, DISABLE);
    }
}

void SPI_DMA_IRQ(SPI_T *pSpi)
{
   uint32_t temp = 0; 
    if(DMA_GetITStatus(DMA2_Stream3,DMA_IT_TCIF3) != RESET)
    {
        DMA_ClearITPendingBit(DMA2_Stream3,DMA_IT_TCIF3);
        while (SPI_I2S_GetFlagStatus(SPI5,SPI_I2S_FLAG_BSY) != RESET){}
        //Recv
        temp = DMA_GetCurrDataCounter(DMA2_Stream3);
        pSpi->usRxCount = pSpi->usRxBufSize - temp;
        pSpi->usRxFrame = 0x01;

        DMA_Cmd(DMA2_Stream3, DISABLE);
    }
}

void DMA2_Stream3_IRQHandler(void)
{
    SPI_DMA_IRQ(&s_tSPI5);
}



从模式:


#define SPI5_TX_BUF_SIZE	1*1024
#define SPI5_RX_BUF_SIZE	1*1024
SPI_T s_tSPI5;
static uint8_t s_TxBuf[SPI5_TX_BUF_SIZE];		/* 发送缓冲区 */
static uint8_t s_RxBuf[SPI5_RX_BUF_SIZE];		/* 接收缓冲区 */

uint16_t BufferSize = 60;

void DMA_Use_SPI5_Rx_Init(void)
{
	DMA_InitTypeDef DMA_InitStructure;
    NVIC_InitTypeDef NVIC_InitStructure;
	RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_DMA2, ENABLE); 

    DMA_Cmd(DMA2_Stream3,DISABLE);

	DMA_DeInit(DMA2_Stream3);
	
	DMA_InitStructure.DMA_Channel             = DMA_Channel_2;               
    DMA_InitStructure.DMA_PeripheralBaseAddr  = (uint32_t)&SPI5->DR;   
    DMA_InitStructure.DMA_Memory0BaseAddr     = (uint32_t)s_RxBuf;             
    DMA_InitStructure.DMA_DIR                 = DMA_DIR_PeripheralToMemory;    
    DMA_InitStructure.DMA_BufferSize          = BufferSize;                                   
    DMA_InitStructure.DMA_PeripheralInc       = DMA_PeripheralInc_Disable;    
    DMA_InitStructure.DMA_MemoryInc           = DMA_MemoryInc_Enable;         
    DMA_InitStructure.DMA_PeripheralDataSize  = DMA_PeripheralDataSize_Byte;      
    DMA_InitStructure.DMA_MemoryDataSize      = DMA_MemoryDataSize_Byte;      
    DMA_InitStructure.DMA_Mode                = DMA_Mode_Circular;             
    DMA_InitStructure.DMA_Priority            = DMA_Priority_VeryHigh;        
    DMA_InitStructure.DMA_FIFOMode            = DMA_FIFOMode_Disable;          
    DMA_InitStructure.DMA_FIFOThreshold       = DMA_FIFOThreshold_HalfFull; 
    DMA_InitStructure.DMA_MemoryBurst         = DMA_MemoryBurst_Single;      
    DMA_InitStructure.DMA_PeripheralBurst     = DMA_PeripheralBurst_Single;
	
	DMA_Init(DMA2_Stream3, &DMA_InitStructure);
	
	NVIC_InitStructure.NVIC_IRQChannel=DMA2_Stream3_IRQn;
    NVIC_InitStructure.NVIC_IRQChannelCmd=ENABLE;
    NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=0;
    NVIC_InitStructure.NVIC_IRQChannelSubPriority=0;
    NVIC_Init(&NVIC_InitStructure);

    DMA_ClearITPendingBit(DMA2_Stream3, DMA_IT_TCIF3);                            
    DMA_ITConfig(DMA2_Stream3,DMA_IT_TC,ENABLE); 
    DMA_ClearFlag(DMA2_Stream3,DMA_IT_TCIF3);

    SPI_I2S_DMACmd(SPI5,SPI_I2S_DMAReq_Rx,ENABLE);

	DMA_Cmd(DMA2_Stream3,ENABLE);

}

void DMA_Use_SPI5_Tx_Init(void)
{
	DMA_InitTypeDef DMA_InitStructure;
    NVIC_InitTypeDef NVIC_InitStructure;
	RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_DMA2, ENABLE); 

    DMA_Cmd(DMA2_Stream4,DISABLE);

    DMA_DeInit(DMA2_Stream4);
	
	DMA_InitStructure.DMA_Channel             = DMA_Channel_2;               
    DMA_InitStructure.DMA_PeripheralBaseAddr  = (uint32_t)&SPI5->DR;   
    DMA_InitStructure.DMA_Memory0BaseAddr     = (uint32_t)s_TxBuf;             
    DMA_InitStructure.DMA_DIR                 = DMA_DIR_MemoryToPeripheral;    
    DMA_InitStructure.DMA_BufferSize          = BufferSize;                                   
    DMA_InitStructure.DMA_PeripheralInc       = DMA_PeripheralInc_Disable;    
    DMA_InitStructure.DMA_MemoryInc           = DMA_MemoryInc_Enable;         
    DMA_InitStructure.DMA_PeripheralDataSize  = DMA_PeripheralDataSize_Byte;      
    DMA_InitStructure.DMA_MemoryDataSize      = DMA_MemoryDataSize_Byte;      
    DMA_InitStructure.DMA_Mode                = DMA_Mode_Circular;             
    DMA_InitStructure.DMA_Priority            = DMA_Priority_VeryHigh;        
    DMA_InitStructure.DMA_FIFOMode            = DMA_FIFOMode_Disable;          
    DMA_InitStructure.DMA_FIFOThreshold       = DMA_FIFOThreshold_HalfFull; 
    DMA_InitStructure.DMA_MemoryBurst         = DMA_MemoryBurst_Single;      
    DMA_InitStructure.DMA_PeripheralBurst     = DMA_PeripheralBurst_Single;
	
	DMA_Init(DMA2_Stream4, &DMA_InitStructure);

	NVIC_InitStructure.NVIC_IRQChannel=DMA2_Stream4_IRQn;
    NVIC_InitStructure.NVIC_IRQChannelCmd=ENABLE;
    NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=0;
    NVIC_InitStructure.NVIC_IRQChannelSubPriority=0;
    NVIC_Init(&NVIC_InitStructure);

    DMA_ClearITPendingBit(DMA2_Stream4, DMA_IT_TCIF4);                            
    DMA_ITConfig(DMA2_Stream4,DMA_IT_TC,ENABLE); 
   
    
	SPI_I2S_DMACmd(SPI5,SPI_I2S_DMAReq_Tx,ENABLE);

	DMA_Cmd(DMA2_Stream4, ENABLE);


}

/***********************************************************************************
* Function	    : SPI_Var_Init
* Description	: 串口初始化
* Input Para	: 
* Output Para	: 
* Return Value  : 
***********************************************************************************/
void SPIVarInit(void)
{
    s_tSPI5.spi = SPI5;						    /* STM32 SPI设备 */
	s_tSPI5.pTxBuf = s_TxBuf;				    /* 发送缓冲区指针 */
	s_tSPI5.pRxBuf = s_RxBuf;				    /* 接收缓冲区指针 */
	s_tSPI5.usTxBufSize = SPI5_TX_BUF_SIZE;	    /* 发送缓冲区大小 */
	s_tSPI5.usRxBufSize = SPI5_RX_BUF_SIZE;	    /* 接收缓冲区大小 */
	s_tSPI5.usRxCount = 0;						/* 接收到的新数据个数 */
	s_tSPI5.usTxFrame = 0;						/* 待发送的数据个数 */	
	s_tSPI5.usRxFrame = 0;	                    /* 接收到数据帧标志 */
	s_tSPI5.SendBefor = 0;		                /* 发送数据前的回调函数 */
	s_tSPI5.SendOver = 0;		                /* 发送完毕后的回调函数 */
}


void BSP_SPI5_Init(void)
{	
	SPI_InitTypeDef  SPI_InitStructure;
	GPIO_InitTypeDef GPIO_InitStructure;

    SPIVarInit();
	
	RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOH, ENABLE);
	RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOF, ENABLE); 	
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_SPI5, ENABLE);
	
	/*!< Configure SPI_FLASH_SPI pins: SCK */	
	GPIO_InitStructure.GPIO_Pin    = GPIO_Pin_6|GPIO_Pin_5;
	GPIO_InitStructure.GPIO_Mode   = GPIO_Mode_AF;
	GPIO_InitStructure.GPIO_OType  = GPIO_OType_PP;
	GPIO_InitStructure.GPIO_Speed  = GPIO_Speed_50MHz;
	GPIO_InitStructure.GPIO_PuPd   = GPIO_PuPd_NOPULL;
	GPIO_Init(GPIOH, &GPIO_InitStructure); 
  /*!< Configure SPI_FLASH_SPI pins: MISO */
	GPIO_InitStructure.GPIO_Pin    = GPIO_Pin_7;
	GPIO_InitStructure.GPIO_Mode   = GPIO_Mode_AF;
	GPIO_InitStructure.GPIO_OType  = GPIO_OType_PP;
	GPIO_InitStructure.GPIO_Speed  = GPIO_Speed_50MHz;
	GPIO_InitStructure.GPIO_PuPd   = GPIO_PuPd_NOPULL;
	GPIO_Init(GPIOH, &GPIO_InitStructure);
	 /*!< Configure SPI_FLASH_SPI pins: MOSI */
	GPIO_InitStructure.GPIO_Pin    = GPIO_Pin_9;
	GPIO_InitStructure.GPIO_Mode   = GPIO_Mode_AF;
	GPIO_InitStructure.GPIO_OType  = GPIO_OType_PP;
	GPIO_InitStructure.GPIO_Speed  = GPIO_Speed_50MHz;
	GPIO_InitStructure.GPIO_PuPd   = GPIO_PuPd_NOPULL;
	GPIO_Init(GPIOF, &GPIO_InitStructure); 
	/*!< PinAFConfig */
	GPIO_PinAFConfig(GPIOH,GPIO_PinSource5,GPIO_AF_SPI5);  
    GPIO_PinAFConfig(GPIOH,GPIO_PinSource6,GPIO_AF_SPI5);  
    GPIO_PinAFConfig(GPIOH,GPIO_PinSource7,GPIO_AF_SPI5);
    GPIO_PinAFConfig(GPIOF,GPIO_PinSource9,GPIO_AF_SPI5); 
   
    SPI_InitStructure.SPI_Direction = SPI_Direction_2Lines_FullDuplex;
    SPI_InitStructure.SPI_Mode = SPI_Mode_Slave;
    SPI_InitStructure.SPI_DataSize = SPI_DataSize_8b;
    SPI_InitStructure.SPI_CPOL = SPI_CPOL_Low;
    SPI_InitStructure.SPI_CPHA = SPI_CPHA_1Edge;
    SPI_InitStructure.SPI_NSS = SPI_NSS_Hard;//
    SPI_InitStructure.SPI_BaudRatePrescaler = SPI_BaudRatePrescaler_256;
    SPI_InitStructure.SPI_FirstBit = SPI_FirstBit_MSB;
    SPI_InitStructure.SPI_CRCPolynomial = 7;
		
    SPI_Init(SPI5, &SPI_InitStructure);
	
		
	DMA_Use_SPI5_Rx_Init();	
	DMA_Use_SPI5_Tx_Init();
	SPI5->CR2|= 0x0010;   // SPI TI模式
	SPI_Cmd(SPI5, ENABLE);
		 
}

uint8 SPI_DMA_Send_Data(SPI_T* spi,u8 *BufferSRC, uint32_t BufferSize)
{

}


void SPI_DMA_T_IRQ(SPI_T *pSpi)
{
    uint8 i;
    uint8 BufferSRC;
    static uint8 num = 0;
    if(DMA_GetITStatus(DMA2_Stream4,DMA_IT_TCIF4) != RESET)
    {
        DMA_ClearITPendingBit(DMA2_Stream4,DMA_IT_TCIF4);
        while (SPI_I2S_GetFlagStatus(SPI5,SPI_I2S_FLAG_BSY) != RESET){}
        //Send
       
        for (i = 0; i < BufferSize; i++)      //将新数据填入发送缓冲区 
        {	
            pSpi->pTxBuf[i] = pSpi->pRxBuf[i];
        }

        pSpi->usRxFrame = 0x01;

        
    }
}

void DMA2_Stream4_IRQHandler(void)
{
    SPI_DMA_T_IRQ(&s_tSPI5); 
}


void SPI_DMA_IRQ(SPI_T *pSpi)
{
   uint32_t temp = 0; 
    if(DMA_GetITStatus(DMA2_Stream3,DMA_IT_TCIF3) != RESET)
    {
        DMA_ClearITPendingBit(DMA2_Stream3,DMA_IT_TCIF3);
        while (SPI_I2S_GetFlagStatus(SPI5,SPI_I2S_FLAG_BSY) != RESET){}
        //Recv
  
        temp = DMA_GetCurrDataCounter(DMA2_Stream3);
        pSpi->usRxCount = pSpi->usRxBufSize - temp;
//    如果设置成DMA_Mode_Normal,则打开此部分代码,因为配置必须要先关闭
//         DMA_Cmd(DMA2_Stream4, DISABLE);  
//         DMA_Cmd(DMA2_Stream3, DISABLE);  
//         DMA_ClearFlag(DMA2_Stream4,DMA_IT_TCIF4);    
//         DMA_ClearFlag(DMA2_Stream3,DMA_IT_TCIF4);

//         DMA_SetCurrDataCounter(DMA2_Stream4,BufferSize);            //设置要发送的数据长度    
//         DMA_SetCurrDataCounter(DMA2_Stream3,BufferSize);            //设置要接收的数据长度
//         DMA_Cmd(DMA2_Stream4,ENABLE);
//         DMA_Cmd(DMA2_Stream3, ENABLE); 
  

    }
}

void DMA2_Stream3_IRQHandler(void)
{
    SPI_DMA_IRQ(&s_tSPI5);
}



 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值