你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

stm32f4 SPI DMA 通信读取数据,SPI 不发数据,DMA无法中断

[复制链接]
东东-424146 提问时间:2015-12-24 09:47 /
这几天一直在搞SPI + DMA 通信,DMA设置成中断时,SPI无法发送数据,同时也无法产生DMA中断。具体SPI 和DMA的配置如下:
SPI2 初始化

void SPI2_PeriphInit (void)
{
    GPIO_InitTypeDef GPIO_InitStructure;


    RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOB, ENABLE);


    //GPIO_PinAFConfig(GPIOB, GPIO_PinSource12, GPIO_AF_SPI2);        //PB12 NSS   
    GPIO_PinAFConfig(GPIOB, GPIO_PinSource13, GPIO_AF_SPI2);        //PB13 SCK
    GPIO_PinAFConfig(GPIOB, GPIO_PinSource14, GPIO_AF_SPI2);        //PB14 MISO
    GPIO_PinAFConfig(GPIOB, GPIO_PinSource15, GPIO_AF_SPI2);        //PB15 MOSI

    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT;
    GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;
    GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;
    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_12;
    GPIO_Init(GPIOB, &GPIO_InitStructure);   
    GPIO_SetBits(GPIOB, GPIO_Pin_12);

    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;
    GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
    GPIO_InitStructure.GPIO_PuPd  = GPIO_PuPd_DOWN;
    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_13 | GPIO_Pin_15;
    GPIO_Init(GPIOB, &GPIO_InitStructure);

    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;
    GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
    GPIO_InitStructure.GPIO_PuPd  = GPIO_PuPd_NOPULL;
    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_14;
    GPIO_Init(GPIOB, &GPIO_InitStructure);


    SPI_InitTypeDef SPI_InitStructure;

    RCC_APB1PeriphClockCmd(RCC_APB1Periph_SPI2, ENABLE);

    SPI_I2S_DeInit(SPI2);
    SPI_InitStructure.SPI_Direction= SPI_Direction_2Lines_FullDuplex;
    SPI_InitStructure.SPI_DataSize = SPI_DataSize_16b;
    SPI_InitStructure.SPI_Mode = SPI_Mode_Master;
    SPI_InitStructure.SPI_CPOL = SPI_CPOL_Low;
    SPI_InitStructure.SPI_CPHA = SPI_CPHA_2Edge;                              
    SPI_InitStructure.SPI_NSS = SPI_NSS_Soft;
    SPI_InitStructure.SPI_BaudRatePrescaler = SPI_BaudRatePrescaler_4;         
    SPI_InitStructure.SPI_FirstBit = SPI_FirstBit_MSB;
    SPI_InitStructure.SPI_CRCPolynomial = 7;
    SPI_Init(SPI2, &SPI_InitStructure);
    SPI_CalculateCRC(SPI2, DISABLE);  

    SPI_Cmd(SPI2, ENABLE);

}



void SPI2_DMAInit (void)
{
    DMA_InitTypeDef DMA_InitStructure;

    RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_DMA1, ENABLE);

    DMA_DeInit(DMA1_Stream3);
    DMA_DeInit(DMA1_Stream4);


    DMA_InitStructure.DMA_Channel  = DMA_Channel_0;
    DMA_InitStructure.DMA_PeripheralBaseAddr = (uint32_t)(&(SPI2->DR));               
    DMA_InitStructure.DMA_Memory0BaseAddr = (uint32_t)ad7657_revbuf[0];    //ad7657_revbuff 为2维数组 , 2 x 6   
    DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralToMemory;                     
    DMA_InitStructure.DMA_BufferSize = AD7656REVDATALEN;                            //宏定义为6                                          
    DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable;
    DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable;
    DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_HalfWord;  
    DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_HalfWord;         
    DMA_InitStructure.DMA_Mode = DMA_Mode_Normal;
    DMA_InitStructure.DMA_Priority = DMA_Priority_High;
    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(DMA1_Stream3, &DMA_InitStructure);

    DMA_InitStructure.DMA_Memory0BaseAddr = (uint32_t)ad7657_send;       //数组,6个字节
    DMA_InitStructure.DMA_DIR = DMA_DIR_MemoryToPeripheral;                     
    DMA_InitStructure.DMA_BufferSize = AD7656SENDLEN;                               //宏定义 6
    DMA_InitStructure.DMA_Priority = DMA_Priority_Low;
    DMA_Init(DMA1_Stream4, &DMA_InitStructure);

    SPI_I2S_DMACmd(SPI2, SPI_I2S_DMAReq_Tx, ENABLE);
    SPI_I2S_DMACmd(SPI2, SPI_I2S_DMAReq_Rx, ENABLE);

    DMA_ITConfig(DMA1_Stream3, DMA_IT_TC | DMA_IT_TE, ENABLE);
    DMA_ITConfig(DMA1_Stream4, DMA_IT_TC | DMA_IT_TE, ENABLE);

    NVIC_InitTypeDef  NVIC_InitStructure;
    NVIC_InitStructure.NVIC_IRQChannel = DMA1_Stream3_IRQn;
    NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;
    NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
    NVIC_InitStructure.NVIC_IRQChannel =ENABLE;
    NVIC_Init(&NVIC_InitStructure);

    DMA_Cmd(DMA1_Stream3, DISABLE);
    DMA_Cmd(DMA1_Stream4, DISABLE);

}


定时触发DMA 发送数据
void TIM2_IRQHandler(void)
{
    if (TIM_GetITStatus (TIM2, TIM_IT_Update) == SET)
    {
        TIM_ClearITPendingBit(TIM2, TIM_IT_Update);

        GPIO_ResetBits(GPIOB, GPIO_Pin_12);
        while (SPI_I2S_GetFlagStatus(SPI2, SPI_I2S_FLAG_TXE) == RESET);
        DMA_SetCurrDataCounter(DMA1_Stream3, 6);
        DMA_SetCurrDataCounter(DMA1_Stream4, 6);
        DMA_Cmd(DMA1_Stream4, ENABLE);
        DMA_Cmd(DMA1_Stream3, ENABLE);


    }
}


DMA 产生中断
void DMA1_Stream3_IRQHandler (void)
{
    if (DMA_GetITStatus(DMA1_Stream3, DMA_IT_TCIF3) == SET)
    {
        DMA_ClearFlag(DMA1_Stream3, DMA_IT_TC);
        DMA_ClearFlag(DMA1_Stream4, DMA_IT_TC);
        DMA_ClearITPendingBit(DMA1_Stream3, DMA_IT_TCIF3);
        DMA_ClearITPendingBit(DMA1_Stream4, DMA_IT_TCIF4);


        GPIO_SetBits(GPIOB, GPIO_Pin_12);
        SPI_I2S_DMACmd(SPI2, SPI_I2S_DMAReq_Tx, DISABLE);
        SPI_I2S_DMACmd(SPI2, SPI_I2S_DMAReq_Rx, DISABLE);
    }
}

收藏 1 评论13 发布时间:2015-12-24 09:47

举报

13个回答
东东-424146 回答时间:2015-12-24 16:00:42
又试了一天还是无果,主SPI+DMA传输无法用中断来完成,不得不用阻塞方式。如果哪位看官需要,可以留言。希望有心人看到能够交流交流
jcx0324 回答时间:2015-12-24 16:38:22
单独DMA操作SPI可以吗? 曾经这个怎么搞都没通,
东东-424146 回答时间:2015-12-24 20:41:44
dma不开中断,操作spi可以
东东-424146 回答时间:2016-1-6 14:17:25
搞定,过来结帖
菜鸟一颗 回答时间:2016-1-27 15:38:18

怎么搞好的,能把程序贴一下或者邮箱发我一下吗 125828526
东东-424146 回答时间:2016-4-26 14:34:43
菜鸟一颗 发表于 2016-1-27 15:38
怎么搞好的,能把程序贴一下或者邮箱发我一下吗 125828526

NVIC_InitTypeDef  NVIC_InitStructure;
NVIC_InitStructure.NVIC_IRQChannel = DMA1_Stream3_IRQn;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
NVIC_InitStructure.NVIC_IRQChannel =ENABLE;
NVIC_Init(&NVIC_InitStructure);

NVIC_IRQChannel 通道设置错误,是要把通道使能的。不知道你问题解决没有
ychlucky 回答时间:2016-4-26 15:18:25
同求 怎么搞的啊
ivtaaa 回答时间:2016-6-26 14:47:18
东东-424146 发表于 2016-4-26 14:34
NVIC_InitTypeDef  NVIC_InitStructure;
NVIC_InitStructure.NVIC_IRQChannel = DMA1_Stream3_IRQn;
NVIC ...

看着和上面的代码一样啊,能发我一份完整的代码吗 ,我在调试这个,一直有问题,谢谢  416575202@qq.com
口圭口塞口丫 回答时间:2016-11-14 18:13:58
方便留个联系方式吗 最近一直在调SPI DMA发送 一直没出来。
fang599956589 回答时间:2017-1-17 11:13:53
最近在弄STM32 SPI 发送数据用DMA方式,可是一直发送不了,求联系方式599956589@QQ.COM
graydon 回答时间:2018-6-19 20:14:51
NVIC_InitStructure.NVIC_IRQChannel =ENABLE;
改为
NVIC_InitStructure.NVIC_IRQChannelCmd =ENABLE;

无意中看到,楼主解决了,又不贴解决的代码!
xiaowang11 回答时间:2018-12-3 15:36:31
楼主你好,最近我也遇到类似的问题,SPI2 DMA配置好后无法接受到数据,对端的DMA正常的在发数据。你之前怎么调好的,谢谢!
xiaowang11 回答时间:2018-12-3 16:07:27
你好,我也遇到SPI2 DMA 接受不到数据,不知道哪里遇到了问题,向大神请教一下。谢谢!

所属标签

相似问题

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
st-img 微信公众号
st-img 手机版