In the RX_AACK operating mode, described in section 5.2.3 (RX_AACK_ON Receive with Automatic ACK) of the AT86RF212 datasheet, incoming frames are checked against the address filter and for a valid FCS. If these checks are passed, the TRX_IRQ_TRX_END interrupt is generated at the end of the received frame and an optional required acknowledgement frame is transmitted.
| coord | This bit specifies, whether the radio transceiver is operated as PAN coordinator {1} or as device {0}. | |
| pendd | This bit specifies, whether the device has pending data. During generation of an acknowledgment, the radio transceiver will copy this bit into the frame pending subfield of the frame control field in response to a data request MAC command. | |
| slmode | This bit specifies, whether the radio transceiver is operated in slotted {1} or unslotted {0} operation mode, as described in section 5.2.3.5 (Slotted Operation, Slotted Acknowledgement) of the AT86RF212 datasheet. |
| tracstat | Result of a RX_AACK transaction from sub register SR_TRAC_STATUS :
|
/* AT86RF212::[CONFIG] */ trx_bit_write(SR_AACK_I_AM_COORD, coord); trx_bit_write(SR_SLOTTED_OPERATION, slmode);
pendd in an automatically generated acknowledgement frame. After the reception of a MAC command frame of type "Data Request" (command frame identifier 0x04), the content of the sub register SR_AACK_SET_PD is copied into the frame pending subfield of the generated acknowledgement frame (see section 7.2.2.3.1 of the IEEE 802.15.4-2006 standard). For all other frames requesting an ACK, the frame pending subfield is set to 0, regardless of the content of sub register SR_AACK_SET_PD.
/* AT86RF212::[ACTIVE] */ trx_bit_write(SR_AACK_SET_PD, pendd);
pendd during state BUSY_RX_AACK. After the interrupt TRX_IRQ_AMI the frame upload can be started using the Frame Buffer Empty Indicator sequence. With the interrupt TRX_IRQ_TRX_END occured, the frame upload is finished and the value of pendd can be computed within tTxAck in order to take effect with the automatically generated acknowledgement frame.
/* AT86RF212::[BUSY_RX_AACK] */ /* TRX_IRQ_AMI occurs here */ frm = trx_frame_read_blm(); /* TRX_IRQ_TRX_END occurs here */ pendd = proc_frm(frm); trx_bit_write(SR_AACK_SET_PD, pendd);
The transmission of the ACK frame starts tWaitAck after the end of the frame reception. The complete ACK frame is on air after tAckDone.
The internal timing for the ACK frame processing in RX_AACK mode is shown below:
== RX ==:======================= TX =========================:======= RX =======
0 12 100 BPSK
0 12 34 OQPSK
+---| |---+---+---+---+---+---+---+---+---+---+---| time [symbols]
--| F |---------| Preamble |SFD|PHR| ACK frame |------------------>
+---| |---+---+---+---+---+---+---+---+---+---+---|
| | |
t0 t1 t2
/* AT86RF212::RX_AACK_ON && AT86RF212::BUSY_RX_AACK */ delay(tFrame); tracstat = trx_bit_read(SR_TRAC_STATUS); frm = trx_frame_read(); /* AT86RF212::RX_AACK_ON */
The result tracstat of a RX_AACK transaction is stored in the sub register SR_TRAC_STATUS after the TRX_IRQ_TRX_END interrupt. In slotted operation mode tracstat can be either TRAC_SUCCESS, TRAC_SUCCESS_WAIT_FOR_ACK, or TRAC_INVALID.
The internal timing for the ACK frame processing in RX_AACK mode is shown below:
== RX ==:== IDLE ==:=================== TX ====================:======== RX =======
0 tack 88+tack BPSK
0 tack 22+tack OQPSK
+---| |---+---+---+---+---+---+---+---+---+---+---| time [symbols]
--| F |-----+-----| Preamble |SFD|PHR| ACK frame |------------------>
+---| | |---+---+---+---+---+---+---+---+---+---+---|
| | | |
t0a t1a t2a t3a
tack = tSlWait + tTR10
/* AT86RF212::RX_AACK_ON && AT86RF212::BUSY_RX_AACK */ delay(tFrame); tracstat = trx_bit_read(SR_TRAC_STATUS); ASSERT(tracstat==SUCCESS_WAIT_FOR_ACK); trx_pinset_slptr(1); delay(t7); trx_pinset_slptr(0); frm = trx_frame_read(); /* AT86RF212::RX_AACK_ON */
1.5.6