打印
[STM32F1]

关于用DMA实现SPI通信的问题

[复制链接]
1514|2
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
wenqin1002|  楼主 | 2014-4-10 16:57 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
STM32作为从机,打算用DMA来实现收发,配置如下:
void SPI1_DMA_Configuration(void)
{

DMA_InitTypeDef DMA_InitStructure;
   
   /* DMA1 Channel2 (triggered by SPI1 Rx event) Config */
DMA_DeInit(DMA1_Channel2);  
DMA_InitStructure.DMA_PeripheralBaseAddr = SPI1_DR_Addr;                          //?? SPI1 ????(0x4001300C) ??(????)
// DMA_InitStructure.DMA_MemoryBaseAddr = (u32)SRC_Buffer;                    //?? SRAM ????(????)
        DMA_InitStructure.DMA_MemoryBaseAddr = (u16)SendD;
DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralSRC;                                //???? ??-??
DMA_InitStructure.DMA_BufferSize = buffersize;                         //?? SPI1 ????
DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable;
DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable;
DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_HalfWord;     //Êý¾Ý¿í¶È16λ
DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_HalfWord;
DMA_InitStructure.DMA_Mode = DMA_Mode_Normal;             //¹¤×÷ÔÚÕý³£»º´æģʽ
DMA_InitStructure.DMA_Priority = DMA_Priority_VeryHigh;
DMA_InitStructure.DMA_M2M = DMA_M2M_Disable;
DMA_Init(DMA1_Channel2, &DMA_InitStructure);            //²»ÉèÖÃΪÄÚ´æµ½ÄÚ´æ´«Êä
  
DMA_ITConfig(DMA1_Channel2, DMA_IT_TC, ENABLE);           //¿ªÆô½ÓÊÕÍê³ÉÖжÏ
  /* Enable SPI1 DMA RX request */
SPI1->CR2 |= 1<<0;                                                                 //½ÓÊÕ»º³åÇøDMAʹÄÜ
DMA_Cmd(DMA1_Channel2, ENABLE);            
   
/* DMA1 Channel3 (triggered by SPI1 Tx event) Config */
DMA_DeInit(DMA1_Channel3);   
//DMA_InitStructure.DMA_PeripheralBaseAddr = SPI1_DR_Addr;                          //??  ????(0x4001300C) ??(???)
DMA_InitStructure.DMA_PeripheralBaseAddr = SPI1_DR_Addr;  
// DMA_InitStructure.DMA_MemoryBaseAddr = (u32)DST_Buffer;                    //?? SRAM ????(???)
DMA_InitStructure.DMA_MemoryBaseAddr = (u16)ReceivedD;
DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralDST;                                //???? ??-??
DMA_InitStructure.DMA_BufferSize = buffersize;                           //?? SPI1Êý¾Ý¿í¶È
DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Enable;                  //??????(??)
DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable;                           //??????(??)
DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_HalfWord;           //??????(??)
DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_HalfWord;                   //16λ
DMA_InitStructure.DMA_Mode = DMA_Mode_Normal;                                     //????,???????,?????
DMA_InitStructure.DMA_Priority = DMA_Priority_VeryHigh;                           //????-?(??)
DMA_InitStructure.DMA_M2M = DMA_M2M_Disable;                                      //?????????
DMA_Init(DMA1_Channel3, &DMA_InitStructure);
  
DMA_ITConfig(DMA1_Channel3, DMA_IT_TC, ENABLE);                                   //¿ªÆô·¢ËÍÍê³ÉÖжÏ
//DMA_ITConfig(DMA1_Channel3, DMA_IT_TE, ENABLE);                                   //¿ªÆô·¢ËÍ´íÎóÖжÏ
/* Enable SPI1 DMA TX request */
  SPI1->CR2 |= 1<<1;                                                                //·¢ËÍ»º³åÇøDMAʹÄÜ
  DMA_Cmd(DMA1_Channel3, ENABLE);                                                  //ʹÄÜDMA
}
        /*ÅäÖÃDAMÖжÏ*/
        NVIC_InitStructure.NVIC_IRQChannel = DMA1_Channel2_IRQn;                             //DMAͨµÀ2ÖжÏ
  NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 2;                 //Ö÷ÓÅÏȼ¶Îª2
  NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;                         //´ÓÓÅÏȼ¶Îª0
  NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;                                 //      NVIC_Init(&NVIC_InitStructure);                                                                 
  NVIC_InitStructure.NVIC_IRQChannel = DMA1_Channel3_IRQn;                             
  NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 3;                 //Ö÷ÓÅÏȼ¶Îª2
  NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;                         //´ÓÓÅÏȼ¶Îª0
  NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;                                 //
  NVIC_Init(&NVIC_InitStructure);       
为什么我的程序运行的时候不能正常收发数据呢?
每次程序都会运行到
                B       .

                ENDP

                ALIGN                                                         
沙发
airwill| | 2014-4-10 18:14 | 只看该作者
SPI, 用 DMA 来传输, 是个不错的办法, 可以减少不少中断开销

不过楼主的问题没有描述清楚, "每次程序都会运行到
                B       ."

是不是遇到异常了?  借助调试器跟踪一下

使用特权

评论回复
板凳
wenqin1002|  楼主 | 2014-4-11 08:15 | 只看该作者
airwill 发表于 2014-4-10 18:14
SPI, 用 DMA 来传输, 是个不错的办法, 可以减少不少中断开销

不过楼主的问题没有描述清楚, "每次程序都会 ...

嗯,是的,程序运行到这儿之后就一直在此循环,进不了主函数。我的中断函数为:
void DMA1_Channel2_IRQnHandler(void)
{
        DMA_ClearITPendingBit(DMA1_IT_TC2);          /*Çå³ýDMAÈ«¾ÖÖжϹÒÆð±êÖ¾*/
}
void DMA1_Channel3_IRQnHandler(void)
{
        DMA_ClearITPendingBit(DMA1_IT_TC3);          /*Çå³ýDMAÈ«¾ÖÖжϹÒÆð±êÖ¾*/
}

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

6

主题

13

帖子

0

粉丝