利用原子的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); //清除标志
}
}
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
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不能工作。
请大神解惑!!!!!!!!!!!!!!!!!!!
一周热门 更多>