hi
當前在用nRF24L01進行無線數據通信的解決方案中,在接收方是通過無限循環來接收數據的,這樣無疑會降低程序的運行效率,增大最終系統的功耗。
能不能將nRF24L01接收端改為中斷出發方式,當有數據產生中斷觸發時,在運行接收程序,接收數據。插入P3.2那根線應該就是中斷源,不知我分析得對不對?還有就是把無線接收程序寫為中斷服務程序是否可行?
完全可以,用中斷來喚醒,然后用中斷函數來接受數據,接受完畢后再讓24l01 進入休眠模式.最大限度的降低功耗,只不過網上這方面的例子很少
void ISR_int1(void) interrupt 0 //外部中斷0 { sta=nRF24L01_SPI_Read(STATUS); //讀寄存器STATUS狀態 if(RX_DR){ //接收數據產生中斷 nRF24L01_SPI_Read_Buf(RD_RX_PLOAD,rx_buf,REBACK_WIDTH);//從FIFO中讀接收數據 flag_r=1; //接收到數據標志 } if(TX_DS){ //發送完成 flag_t=1; //發送完成標志 } if(MAX_RT){ //沒有應答 nRF24L01_SPI_RW_Reg(FLUSH_TX,0); //清發送FIFO ? flag_e=1; //出錯標志 } // 清RX_DR 或 TX_DS 或 MAX_RT 中斷標志位 nRF24L01_SPI_RW_Reg(WRITE_REG+STATUS,sta); nRF24L01_Sleep_Mode(0); //休眠 }
你可參考一下這種方式 來修改原來的程序.
能不能將nRF24L01接收端改為中斷出發方式-----觸發方式!
不管你用什么方式,千萬注意一個關鍵問題:
無線電接收是無時無刻的現象,不管是不是你發射的.-------就是只要你的接收電路一旦開始工作,不管是不是發射也工作了,都會接收到無數多的無線電信號.---你如果使用中斷,也會不停進入中斷的!
接收是否正確,實際是依靠你程序的判斷來決定是否接收有效.-----不停中斷,不停否認!
所以啊!中斷方式和輪詢方式,都要有間隔時間,否則其它子程序就不能運行了,或者很少機會運行了!
這也絕非 nRF24L01 所有,其它無線數據傳輸都會遇見這個問題.
你有手機吧?它就不停接到信號,只不過不是你的號碼就忽略了!
僅供參考!
歡迎光臨 (http://www.zg4o1577.cn/bbs/) | Powered by Discuz! X3.1 |