DWM1000 自動(dòng)應(yīng)答代碼實(shí)現(xiàn)與實(shí)例
這一節(jié)繼續(xù)繼承之前幀過(guò)濾部分,首先補(bǔ)充一下關(guān)于幀過(guò)濾部分,如果將目標(biāo)地址設(shè)置為0xFFFF,則同一個(gè)網(wǎng)絡(luò)(物理頻道與PANID 都相同),所有節(jié)點(diǎn)都應(yīng)該收到這條信息,這個(gè)信息為廣播信息,0xFFFF為廣播地址。
廣播信息在測(cè)距定位中很有用,標(biāo)簽廣播一個(gè)消息,所有周?chē)幕臼盏綇V播信息回復(fù)即可,標(biāo)簽不同和各個(gè)基站單聊了。
補(bǔ)充完上面的知識(shí),接著說(shuō)自動(dòng)應(yīng)答,自動(dòng)應(yīng)答的作用是收到信息后,通過(guò)幀過(guò)濾后,如果本條信息是發(fā)給我的,我就會(huì)自動(dòng)回復(fù)一條應(yīng)答,這個(gè)回復(fù)行為是硬件實(shí)現(xiàn)的,這個(gè)應(yīng)答時(shí)間非常快,在有應(yīng)答的網(wǎng)絡(luò)通信中,利用應(yīng)答可以保證數(shù)據(jù)正確傳輸。當(dāng)然,我的目標(biāo)是用來(lái)測(cè)距的,利用幀過(guò)濾和自動(dòng)應(yīng)答可以實(shí)現(xiàn)非常快的測(cè)距,雖然還沒(méi)有具體概念,后面慢慢實(shí)現(xiàn)。
先上一段關(guān)于自動(dòng)應(yīng)答的說(shuō)明,直接上英文,沒(méi)空翻譯了
? Frame filtering must be enabled and the received data or MAC command frame must be correctly
addressed and pass through the receive frame filtering, (see section 5.2 - Frame filteringfor
details of frame filtering configuration). ? The ACK request bit in the frame control field of the received frame must be set. ? Auto-acknowledgement must be enabled by the AUTOACK configuration in Register file: 0x04
– System Configuration.
大概意思 1 必須使能幀過(guò)濾 2 收到的信息必須有應(yīng)答請(qǐng)求 3系統(tǒng)必須使能自動(dòng)應(yīng)答
在上一例中已經(jīng)實(shí)現(xiàn)了幀過(guò)濾,只需要在發(fā)送端增加“應(yīng)答請(qǐng)求”,在接收端使能“自動(dòng)應(yīng)答“
發(fā)送端主要代碼修改
msg_f.frameCtrl[0] = 0x1 /*frame type 0x1 == data*/ | 0x40 /*PID comp*/|0x20/* ACK request*/;
接收端使能自動(dòng)應(yīng)答
dwt_enableautoack(1);
其中參數(shù)為turnaround 時(shí)間,接收到信息多久發(fā)出自動(dòng)應(yīng)答,這個(gè)很重要,以后會(huì)用。關(guān)于這個(gè)函數(shù),我略做修改。
void dwt_enableautoack(uint8 responseDelayTime) { uint8 temp = 0; temp |= (uint8)(SYS_CTRL_TXSTRT | SYS_CTRL_TRXOFF) ; dwt_writetodevice(SYS_CTRL_ID,0,1,&temp) ; // Set auto ACK reply delay dwt_write16bitoffsetreg(ACK_RESP_T_ID, 0x2, (responseDelayTime << 8) ) ; //in symbols // Enable auto ACK dw1000local.sysCFGreg |= SYS_CFG_AUTOACK; dwt_write32bitreg(SYS_CFG_ID,dw1000local.sysCFGreg) ; }
增加了對(duì)SYS_CTRL_TXSTRT和SYS_CTRL_TRXOFF寫(xiě)操作,因?yàn)樵贒M1000 手冊(cè)上有如下描述
The most efficient way to ensure the SFD sequence is correctly initialised is to simultaneously initiate and abort a transmission thereby forcing the SFD initialisation. This can be done by writing to the the system control register Register file: 0x0D – System Control Register with both the transmission startbit TXSTRT and the transceiver off bit TRXOFF set at the same time
大概意思是初始化SFD,可以通過(guò)寫(xiě)SYS_CTRL_TXSTRT和SYS_CTRL_TRXOFF 非常有效快速的完成。
上面就是修改的主要代碼了。 關(guān)于自動(dòng)應(yīng)答實(shí)驗(yàn)的方法。
1 TX端發(fā)送信息,在RX端看是否有ATT標(biāo)識(shí),并且是否有TXFRS,ATT標(biāo)識(shí)表明收到一條有應(yīng)答請(qǐng)求的消息,而TXFRS表明接收端已經(jīng)發(fā)送了一條應(yīng)答。
2 在TX端增加接收代碼,打印自動(dòng)應(yīng)答消息
打印結(jié)果如圖,每次回打印5個(gè)字節(jié),下面是多次打印

DM1000手冊(cè)描述,自動(dòng)應(yīng)答為5個(gè)字節(jié),與收到的信息一致。
下面是IEEE 關(guān)于MAC應(yīng)答幀的描述,兩張圖自己看,確實(shí)符合規(guī)范!
還有一點(diǎn),MAC 應(yīng)答幀,幀過(guò)濾不了,直接送到上層!


最后,老規(guī)矩,源碼放到bphero.com.cn 論壇了,有需要學(xué)習(xí)的可以下載

浙公網(wǎng)安備 33010602011771號(hào)