SPI DMA无法进入中断

2019-07-21 02:57发布

利用原子的mini板,带2个nRF24L01+,一发一收。
为了实现SPI DMA (SPI至内存),在接受nRF24L01的中断函数中放入命令DMA_Cmd(DMA1_Channel2, ENABLE)。


不放入此命令时,中断正常进入,一旦放入命令,中断无法进入。


整了两天,没有结果。有让知道原因?


//nRF24L01中断服务程序
void EXTI1_IRQHandler(void)
{
u8 istatus;
u8 retry=0;  
u8   pipeNum;
u8   SendBuffer[10] = {0 };
u8 sta,status;   
u8 datalen;
int iLen=0;
u8  u8_ctr;

//判断是否是线路1引起的中断
if (EXTI_GetITStatus(EXTI_Line1)!=RESET)
{
  if(GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_1)==0)
   {
    //istatus=0;
    istatus=NRF24L01_Read_Reg(STATUS,1);            // 读取状态寄存其来判断数据接收状况
    nrf_flag=istatus;
   if(istatus & (1<<RX_DR))//bit6:数据接收中断
    {

     pipeNum = (istatus>>1) & 0x07;
     Labling[pipeNum]=1;
     iLen=HexToStr((u8*)SendBuffer,Tick);
     L01_WriteAck_Payload((u8*)SendBuffer, iLen,pipeNum,1);

     datalen= L01_ReadTopFIFOWidth(1);
     if(datalen>9)
      datalen=9;
     
     tmp_buf1[0]=pipeNum;

     NRF24L01_01_CSN = 0;           //使能SPI传输
     
     
     status=SPI_ReadWriteByte(RD_RX_PLOAD,1);//SPI step1发送寄存器值(位置),并读取状态值   
     

     printf("%d",tmp_buf1[0]);
     printf(" ");
     
     //SPI1_Read_Starting(tmp_buf1,datalen);
      DMA_Cmd(DMA1_Channel2, ENABLE);
     for(u8_ctr=0;u8_ctr<datalen;u8_ctr++)
     {

      while (SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_TXE) == RESET) //检查指定的SPI标志位设置与否:发送缓存空标志位
      {//=SET时,表示发送完成,缓存为空。当缓存不为空时,在此空循环。
      retry++;
      if(retry>200)return ;
      }     
     SPI_I2S_SendData(SPI1, 0xFF); //通过外设SPIx发送一个数据。只要放进去SPI->DR,时钟在运行,就向外发送。
     retry=0;

     while (SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_RXNE) == RESET)//检查指定的SPI标志位设置与否:接受缓存非空标志位
      {
      retry++;
      if(retry>200)return ;
      }         

     }//读出数据
     NRF24L01_01_CSN=1;       //关闭SPI传输
     
     memset(tmp_buf1,0,sizeof(tmp_buf1));
     
     NRF24L01_Write_Reg(NRF_WRITE_REG+STATUS,(istatus ),1); //清除TX_DS或MAX_RT中断标志
     NRF24L01_Write_Reg(FLUSH_RX,0xff,1);//清除RX FIFO寄存器

     
    }
   else if((istatus&0x10)>0)////达到最大发送次数中断
    {
    NRF24L01_Write_Reg(FLUSH_TX,0xff,1);//清除TX FIFO寄存器
     //NRF24L01_RX_Mode();   //发送结束,转为接收状态。
     //(可以在中断中转为接收状态,也可在NRF24L01_TxPacket之后转为接收状态)。如果不处理达到最大发送次数的情况下。中断中转换更好一点。
    }
   else if((istatus&0x20)>0)//TX发送完成中断
    {
     NRF24L01_Write_Reg(FLUSH_TX,0xff,1);//清除TX FIFO寄存器
     //NRF24L01_RX_Mode();   //发送结束,转为接收状态。
    }
   NRF24L01_Write_Reg(NRF_WRITE_REG+STATUS,istatus | ((1<<RX_DR) | (1<<TX_DS) | (1<<MAX_RT)),1);//清除状态寄存器
   // istatus=NRF24L01_Read_Reg(STATUS,1);
  }
  EXTI_ClearITPendingBit(EXTI_Line1); //清除标志
}
}


友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
2条回答
myopendev2019
2019-07-21 03:39
这个问题已经一周了,还是没有结论。而且还发现:
SPI_I2S_DMACmd(SPI1, SPI_I2S_DMAReq_Rx, ENABLE);
DMA_Cmd(DMA1_Channel2, ENABLE);

以上2条命令,写一条,会进入中断,写2条,就不能进入以上中断(NRF24L01的IRQ中断,PA1引脚)。
无论这2条命令写在什么地方。

但使用PA1接地时,可以触发NRF24L01的IRQ中断。怀疑以上2条命令均写时,导致NRF24L01不能工作。

请大神解惑!!!!!!!!!!!!!!!!!!!

一周热门 更多>