DMA发送中断和DMA接收中断必须都打开,如果接受中断不开,貌似只能接收一次成功。同时DMA接收比发送优先级要高,这条没有测试过!!!
以下代码在stm32f407上测试通过
#include "spi_dma.h"
#include "stm32f4xx_dma.h"
#include "stm32f4xx.h"
#include "spi.h"
#include "SRAM.h"
#include "data_process.h"
#include <stdio.h>
#define DMA2_TX_STREAM DMA2_Stream3
#define DMA2_TX_CHANNEL DMA_Channel_3
#define DMA2_RX_STREAM DMA2_Stream0
#define DMA2_RX_CHANNEL DMA_Channel_3
static DMA_InitTypeDef DMA2_Tx_InitStructure;
static DMA_InitTypeDef DMA2_Rx_InitStructure;
int DMA2_Trans_OVER(void)
{
return GET_SPI1_STATE;
}
static void NVIC_DMA2_Configuration(void)
{
NVIC_InitTypeDef NVIC_InitStructure;
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_0);
NVIC_InitStructure.NVIC_IRQChannel = DMA2_Stream3_IRQn;
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&NVIC_InitStructure);
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_0);
NVIC_InitStructure.NVIC_IRQChannel = DMA2_Stream0_IRQn;
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;//½ÓÊÕÓÅÏȼ¶Òª¸ßÓÚ·¢ËÍ
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&NVIC_InitStructure);
}
void DMA2_Configuration(void)
{
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_DMA2,ENABLE);
DMA_DeInit(DMA2_TX_STREAM);
DMA2_Tx_InitStructure.DMA_Channel = DMA2_TX_CHANNEL; //ͨµÀÑ¡Ôñ
DMA2_Tx_InitStructure.DMA_PeripheralBaseAddr = (u32)&SPI1->DR;//ÍâÉèµØÖ·
DMA2_Tx_Ini