OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 2547|回复: 4

stm32F030 SPI+DMA+NRF发送数据缓慢

[复制链接]

1

主题

4

帖子

0

精华

新手入门

积分
18
金钱
18
注册时间
2017-11-17
在线时间
2 小时
发表于 2017-11-17 17:21:36 | 显示全部楼层 |阅读模式
3金钱
各位大佬好!
我在F0的SPI以DMA的方式往NRF发送数据(以正常的方式,不是循环方式)

void SPI1_DMA_Configuration( void )
{
        //RCC_AHBPeriph_DMA1
  DMA_InitTypeDef DMA_InitStructure;
        /* DMA1 Channel12 RX*/
        DMA_DeInit(DMA1_Channel4);  
  DMA_InitStructure.DMA_PeripheralBaseAddr = (uint32_t)(&(SPI2->DR));//?? SPI1 ????(0x4001300C) ??(????)
  DMA_InitStructure.DMA_MemoryBaseAddr = (uint32_t)SPI1_RX_Buff;                    //?? SRAM ????(????)
  DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralSRC;                                //???? ??-??
  DMA_InitStructure.DMA_BufferSize = SPI_SendBufferSize;                         //?? SPI1 ????
  DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable;                                                                //
  DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable;
  DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_Word;
  DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_Word;
  DMA_InitStructure.DMA_Mode = DMA_Mode_Normal;                                                                                                                                                //only once
  DMA_InitStructure.DMA_Priority = DMA_Priority_VeryHigh;
  DMA_InitStructure.DMA_M2M = DMA_M2M_Disable;
  DMA_Init(DMA1_Channel4, &DMA_InitStructure);
       
        DMA_ITConfig(DMA1_Channel4, DMA_IT_TC, DISABLE);                                                      //DISABLE finish trans IRQ
  DMA_ITConfig(DMA1_Channel4, DMA_IT_TE, DISABLE);                   //DISABLE error IRQ

  /* DMA1 Channel5 (triggered by SPI1 Tx event) Config */
  DMA_DeInit(DMA1_Channel5);
  DMA_InitStructure.DMA_PeripheralBaseAddr = (uint32_t)(&(SPI1->DR));                          
  DMA_InitStructure.DMA_MemoryBaseAddr = (uint32_t)SPI1_TX_Buff;                    
  DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralDST;                              
  DMA_InitStructure.DMA_BufferSize = SPI_SendBufferSize;                          
  DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable;                 
  DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable;                        
  DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_Word;      
  DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_Word;  
  DMA_InitStructure.DMA_Mode = DMA_Mode_Normal;                                     //only once
  DMA_InitStructure.DMA_Priority = DMA_Priority_VeryHigh;      
  DMA_InitStructure.DMA_M2M = DMA_M2M_Disable;               
  DMA_Init(DMA1_Channel5, &DMA_InitStructure);


  DMA_ITConfig(DMA1_Channel5, DMA_IT_TC, DISABLE);                              //DMA1_Channel3 end intrrupt-No!!!
  DMA_ITConfig(DMA1_Channel5, DMA_IT_TE, DISABLE);                                   //DMA1_Channel3 error intrrupt

  SPI_I2S_DMACmd(SPI2, SPI_I2S_DMAReq_Rx, ENABLE);                                                                                                                                 
        SPI_I2S_DMACmd(SPI2, SPI_I2S_DMAReq_Tx, ENABLE);                                                                                                                                 //enable spi DMA send
        SPI_Cmd(SPI2, ENABLE);
}




//真正写DMA
void SPI_DMA_Write(U8 *buff, U32 len)
{
       
        DMA_Cmd(DMA1_Channel5, DISABLE);       
        DMA1_Channel5->CPAR = (uint32_t)(&(SPI2->DR));
  DMA1_Channel5->CMAR = (U32) buff;
  DMA1_Channel5->CNDTR = len;

        DMA_Cmd(DMA1_Channel5, ENABLE);

        //uart_puts("SPI_DMA_Write \r\n");
        Delay_us(150);
        while ( DMA_GetFlagStatus(DMA1_FLAG_TC5) == RESET );
}

//封装的接口
unsigned char SPI_DMA_WriteBuf(unsigned char reg, unsigned char buf[], unsigned char len)
{               
        U8 status;
        CSN_0;
        status = SPI_WRByte( reg);
        SPI_DMA_Write(buf, len);
       
        CSN_1;
        return status;
}


这里我必须要最少等待50us,而不是10us,请问下是什么原因

正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

1

主题

4

帖子

0

精华

新手入门

积分
18
金钱
18
注册时间
2017-11-17
在线时间
2 小时
 楼主| 发表于 2017-11-17 17:25:34 | 显示全部楼层
int main(void) {
         SYSTICK_INIT();
          GPIO_INIT();
          USART_INIT();
        //uart_puts("Hello OK....0\r\n");
          //NRF24L01_Initial();
          //uart_puts("Fresh Persimmon all right reserved!\r\n");
          /*************************************/
          SPI_CLK_Configuration();
          SPI_GPIO_Configuration();         SPI_Configuration();
          //DMA         
       SPI1_DMA_Configuration();
      uart_puts("Hello OK....1\r\n");
      SPI_NRF_Init();
      SPI_NRF_Configure();
     NRF24L01_SetMode(Mode_NRF24L01_MODE_TX);
          time1 = GetTickCount();
          for(;;) {
                //uart_puts("A\r\n");
                SPI_DMA_SendData2NRF(tx_buf);
                                   NRF_Bytes2Air();
               }
}
回复

使用道具 举报

1

主题

4

帖子

0

精华

新手入门

积分
18
金钱
18
注册时间
2017-11-17
在线时间
2 小时
 楼主| 发表于 2017-11-17 18:18:27 | 显示全部楼层
我自己顶上去,让大佬看到!
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165524
金钱
165524
注册时间
2010-12-1
在线时间
2116 小时
发表于 2017-11-18 00:42:50 | 显示全部楼层
帮顶
回复

使用道具 举报

1

主题

4

帖子

0

精华

新手入门

积分
18
金钱
18
注册时间
2017-11-17
在线时间
2 小时
 楼主| 发表于 2017-11-20 09:28:40 | 显示全部楼层
继续顶上去
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-6-8 14:19

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表