About frame filtering and receive frame wait timeout


  There are some problems when I use frame filtering. I used frame filtering. I set the receiver RX timeout and opened the receiver.  When frame rejection occurs(AFFREJ set 1), my receive timeout disappears and does not trigger. Dose the chip think the receiving process ends when it receives a rejection frame? Dose the chip automatically shuts down my receiver and my timeout?

But I found that in the mannual:
“When frame filtering is employed, any frames rejected are not treated as valid RX frames (neither RXDFR or RXFCG are set) so the receiver and the receive frame wait timeout just continues its countdown”—On page 77, dw1000_user_manual_2.10

Did I missed any other configuration to make the above case work?
Is it because my chip version is too low? My dwm1000 serial number is:RUPF-G001A, DW7925, 2A018

Thanks and Regards,


I had a similar issue, where rejected frames lead to some strange behavior. In my case, rejected frames stopped the receiving process, but did not trigger any callback function. What helped me, was to include the DWT_INT_ARFE field in the dwt_setinterrupt function. Now my rx_error callback was triggered and I could restart receiving in it. I don’t know if this is the intended behavior though.

yes the frame filter rejection (AFFREJ) ends the receiver operation, and thus you will not get any other receiver events.
The UM is not clear, as you point out, should be reworded.

When the AFFREJ is received, just re-enable the receiver.

Unfortunately I faced the same problem, as soon as I enable Frame Filtering my timeout won’t work since SYS_STATUS_AFFREJ flag appear and it breaks out of the while. So I managed to solve the problem by changing the wait while to this :

In beginning of my main.c


whenever I need to wait for the status to change :

while (!((status_reg = dwt_read32bitreg(SYS_STATUS_ID)) & (SYS_STATUS_RXFCG | SYS_STATUS_ALL_RX_TO | SYS_STATUS_ALL_RX_ERR_EXCEPT_AFF))) { if (BusyWaitForDWMData()) { break; } };

uint8_t BusyWaitForDWMData() // Returns Break Status { // next flag is important to prevent the DWM system clock counter overflow which cause the host processor infinite waiting if (status_reg & SYS_STATUS_HPDWARN) { dwt_forcetrxoff(); return 1; } // And this is neccassry for uisng frame filtering feature which will re enable the receiver . if (status_reg & SYS_STATUS_AFFREJ) { dwt_write16bitoffsetreg(SYS_CTRL_ID, SYS_CTRL_OFFSET, (uint16) SYS_CTRL_RXENAB); } return 0; }