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)
|