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