SI4463淘宝卖家教训少占鱼之:SI4463模块发送数据完毕后,IRQ中断脚输出0电平。最简单可靠的就是,while(IRQ_Pin); 跳出等待,说明发送完毕了。然后 读状态寄存器可清除中断。
RW_MultiReg_Ack(SI4463_Txd[1], LocationMac[0] ,LocationMac[1], LocationMac[2], LocationMac[3]); //发送轮询命令
while(SI4463_IRQ_BIT);
SI446X_INT_STATUS( SI4463_Buf );
主函数中等待接收中断,判断命令后应答发送。
while( 1 )
{
if(SI4463_IRQ_BIT==0x00)
{
//disableInterrupts();
SI446X_INT_STATUS( SI4463_Buf );
if( SI4463_Buf[3] & ( 1<<4 ) )
{
//收到一个数据包,翻转LED
length = SI446X_READ_PACKET( SI4463_Buf );
if(modbus_cmd( SI4463_Buf , RW_Reg_Req_Len )==0)//检查功能码并计算校验
{
LED_BIT=0;
//delay_ms(1000);
//delay_us(900);
if(SI4463_Buf[1] == MAC_SCAN_433M)
{
SI4463_Txd[1]=MAC_SCAN_433M;
RW_MultiReg_Ack(SI4463_Txd[1], LocationMac[0] ,LocationMac[1], LocationMac[2], LocationMac[3]); //发送轮询命令
while(SI4463_IRQ_BIT);
SI446X_INT_STATUS( SI4463_Buf );
if(SI4463_IRQ_BIT)
{
delay_ms(100);
LED_BIT=1;
} }
//回到接收模式,继续等待信号
SI446X_START_RX( 0, 0, PACKET_LENGTH,0,3,3 );
delay_ms(20);
//Get_ADC(4);//进行ADC转换,获得AD值
delay_ms(10);
}
} //end if( buffer[3] & ( 1<<4 ) )
} //end if
} //end while(1)
|