📄 mac_csp_tx.lst
字号:
529 * This is needed for correct operation of the WAITX instruction. As with an
530 * initial backoff countdown value of zero, if this case does occur, it means the
531 * transmit function was not called early enough for a properly timed slotted transmit.
532 * The transmit will be late.
533 *
534 * Finally, worth noting, writes to CSPX may not work if the CSP is executing the WAITX
535 * instruction and a timer rollover occurs. In this case, however, there is no possibility
536 * of that happening. If CSPX is updated here, a rollover has just occurred so a
537 * collision is not possible (still within a critical section here too).
538 */
539 if ((lowByteOfBackoffCount != T2OF0) && (backoffCountdown > 1))
\ 000036 E5A1 MOV A,0xa1
\ 000038 6C XRL A,R4
\ 000039 600D JZ ??macCspTxGoSlotted_0
\ 00003B EA MOV A,R2
\ 00003C C3 CLR C
\ 00003D 9402 SUBB A,#0x2
\ 00003F 4007 JC ??macCspTxGoSlotted_0
540 {
541 CSPX = backoffCountdown - 1;
\ 000041 74FF MOV A,#-0x1
\ 000043 2A ADD A,R2
\ 000044 90DF12 MOV DPTR,#-0x20ee
\ 000047 F0 MOVX @DPTR,A
542 }
543
544 HAL_EXIT_CRITICAL_SECTION(s);
\ ??macCspTxGoSlotted_0:
\ 000048 EB MOV A,R3
\ 000049 A2E0 MOV C,0xE0 /* A */.0
\ 00004B 92AF MOV 0xa8.7,C
545 }
\ 00004D 80.. SJMP ??Subroutine0_1
546
547
548 /**************************************************************************************************
549 * @fn macCspForceTxDoneIfPending
550 *
551 * @brief The function clears out any pending TX done logic. Used by receive logic
552 * to make sure its ISR does not prevent transmit from completing in a reasonable
553 * amount of time.
554 *
555 * @param none
556 *
557 * @return none
558 **************************************************************************************************
559 */
\ In segment BANKED_CODE, align 1, keep-with-next
560 void macCspForceTxDoneIfPending(void)
\ macCspForceTxDoneIfPending:
561 {
\ 000000 C082 PUSH DPL
\ 000002 C083 PUSH DPH
\ 000004 ; Saved register size: 2
\ 000004 ; Auto size: 0
562 ///////////////////////////////////////////////////////////////////////////////////////
563 // REV_B_WORKAROUND : work workaround for chip bug #273. The instruction DECZ might
564 // be incorrectly executed twice, resulting an illegal value for CSPZ.
565 // Delete when Rev B is obsolete.
566 ///////////////////////////////////////////////////////////////////////////////////////
567 #ifndef _REMOVE_REV_B_WORKAROUNDS
568 if (CSPZ >= 0xF8) { CSPZ = 0; }
\ 000004 90DF14 MOV DPTR,#-0x20ec
\ 000007 E0 MOVX A,@DPTR
\ 000008 C3 CLR C
\ 000009 94F8 SUBB A,#-0x8
\ 00000B 4002 JC ??macCspForceTxDoneIfPending_0
\ 00000D E4 CLR A
\ 00000E F0 MOVX @DPTR,A
569 #endif
570 ///////////////////////////////////////////////////////////////////////////////////////
571
572 if ((CSPZ == CSPZ_CODE_TX_DONE) && MAC_MCU_CSP_STOP_INTERRUPT_IS_ENABLED())
\ ??macCspForceTxDoneIfPending_0:
\ 00000F E0 MOVX A,@DPTR
\ 000010 7026 JNZ ??macCspForceTxDoneIfPending_1
\ 000012 E591 MOV A,0x91
\ 000014 A2E1 MOV C,0xE0 /* A */.1
\ 000016 5020 JNC ??macCspForceTxDoneIfPending_1
573 {
574 MAC_MCU_CSP_STOP_DISABLE_INTERRUPT();
\ 000018 ; Setup parameters for call to function macMcuAndRFIM
\ 000018 79FD MOV R1,#-0x3
\ 00001A 90.... MOV DPTR,#(macMcuAndRFIM & 0xffff)
\ 00001D 74.. MOV A,#((macMcuAndRFIM >> 16) & 0xff)
\ 00001F 12.... LCALL ?BCALL ; Banked call to: DPTR()
575 if (MAC_MCU_CSP_INT_INTERRUPT_IS_ENABLED())
\ 000022 E591 MOV A,0x91
\ 000024 A2E0 MOV C,0xE0 /* A */.0
\ 000026 5008 JNC ??macCspForceTxDoneIfPending_2
576 {
577 macCspTxIntIsr();
\ 000028 ; Setup parameters for call to function macCspTxIntIsr
\ 000028 90.... MOV DPTR,#(macCspTxIntIsr & 0xffff)
\ 00002B 74.. MOV A,#((macCspTxIntIsr >> 16) & 0xff)
\ 00002D 12.... LCALL ?BCALL ; Banked call to: DPTR()
578 }
579 macTxDoneCallback();
\ ??macCspForceTxDoneIfPending_2:
\ 000030 ; Setup parameters for call to function macTxDoneCallback
\ 000030 90.... MOV DPTR,#(macTxDoneCallback & 0xffff)
\ 000033 74.. MOV A,#((macTxDoneCallback >> 16) & 0xff)
\ 000035 12.... LCALL ?BCALL ; Banked call to: DPTR()
580 }
581 }
\ ??macCspForceTxDoneIfPending_1:
\ 000038 02.... LJMP ??Subroutine0_1 & 0xFFFF
582
583
584 /**************************************************************************************************
585 * @fn macCspTxRequestAckTimeoutCallback
586 *
587 * @brief Requests a callback after the ACK timeout period has expired. At that point,
588 * the function macTxAckTimeoutCallback() is called via an interrupt.
589 *
590 * @param none
591 *
592 * @return none
593 **************************************************************************************************
594 */
\ In segment BANKED_CODE, align 1, keep-with-next
595 void macCspTxRequestAckTimeoutCallback(void)
\ macCspTxRequestAckTimeoutCallback:
596 {
\ 000000 74F4 MOV A,#-0xc
\ 000002 12.... LCALL ?BANKED_ENTER_XDATA
\ 000005 ; Saved register size: 12
\ 000005 ; Auto size: 0
597 uint8 startSymbol;
598 uint8 symbols;
599 uint8 rollovers;
600
601 MAC_ASSERT(!(RFIM & IM_CSP_STOP)); /* already an active CSP program */
\ 000005 E591 MOV A,0x91
\ 000007 A2E1 MOV C,0xE0 /* A */.1
\ 000009 5008 JNC ??macCspTxRequestAckTimeoutCallback_0
\ 00000B ; Setup parameters for call to function halAssertHandler
\ 00000B 90.... MOV DPTR,#(halAssertHandler & 0xffff)
\ 00000E 74.. MOV A,#((halAssertHandler >> 16) & 0xff)
\ 000010 12.... LCALL ?BCALL ; Banked call to: DPTR()
602
603 /* record current symbol count */
604 startSymbol = CSP_WEVENT_READ_COUNT_SYMBOLS();
\ ??macCspTxRequestAckTimeoutCallback_0:
\ 000013 E5A6 MOV A,0xa6
\ 000015 AAA7 MOV R2,0xa7
\ 000017 8A82 MOV DPL,R2
\ 000019 A882 MOV R0,DPL
\ 00001B 7900 MOV R1,#0x0
\ 00001D 7A02 MOV R2,#0x2
\ 00001F 7B00 MOV R3,#0x0
\ 000021 12.... LCALL ?S_DIV_MOD
\ 000024 E8 MOV A,R0
\ 000025 F5.. MOV ?V0 + 0,A
605
606 /* set symbol timeout from PIB */
607 symbols = macPib.ackWaitDuration;
\ 000027 90.... MOV DPTR,#macPib
\ 00002A E0 MOVX A,@DPTR
\ 00002B FE MOV R6,A
608
609 /* make sure delay value is not too small for logic to handle */
610 MAC_ASSERT(symbols > MAC_A_UNIT_BACKOFF_PERIOD); /* symbols timeout period must be great than a backoff */
\ 00002C C3 CLR C
\ 00002D 9415 SUBB A,#0x15
\ 00002F 5008 JNC ??macCspTxRequestAckTimeoutCallback_1
\ 000031 ; Setup parameters for call to function halAssertHandler
\ 000031 90.... MOV DPTR,#(halAssertHandler & 0xffff)
\ 000034 74.. MOV A,#((halAssertHandler >> 16) & 0xff)
\ 000036 12.... LCALL ?BCALL ; Banked call to: DPTR()
611
612 /* subtract out symbols left in current backoff period */
613 symbols = symbols - (MAC_A_UNIT_BACKOFF_PERIOD - startSymbol);
\ ??macCspTxRequestAckTimeoutCallback_1:
\ 000039 74EC MOV A,#-0x14
\ 00003B 25.. ADD A,?V0 + 0
\ 00003D 2E ADD A,R6
\ 00003E FE MOV R6,A
614
615 /* calculate rollovers needed for remaining symbols */
616 rollovers = symbols / MAC_A_UNIT_BACKOFF_PERIOD;
\ 00003F 75F014 MOV B,#0x14
\ 000042 84 DIV AB
\ 000043 FF MOV R7,A
617
618 /* calculate symbols that still need counted after last rollover */
619 symbols = symbols - (rollovers * MAC_A_UNIT_BACKOFF_PERIOD);
\ 000044 75F014 MOV B,#0x14
\ 000047 A4 MUL AB
\ 000048 CE XCH A,R6
\ 000049 9E SUBB A,R6
\ 00004A FE MOV R6,A
620
621 /* add one to rollovers to account for symbols remaining in the current backoff period */
622 rollovers++;
\ 00004B 0F INC R7
623
624 /* set up parameters for CSP program */
625 CSPZ = CSPZ_CODE_TX_ACK_TIME_OUT;
\ 00004C 7402 MOV A,#0x2
\ 00004E 90DF14 MOV DPTR,#-0x20ec
\ 000051 F0 MOVX @DPTR,A
626 CSPX = rollovers;
\ 000052 EF MOV A,R7
\ 000053 90DF12 MOV DPTR,#-0x20ee
\ 000056 F0 MOVX @DPTR,A
627 CSP_WEVENT_SET_TRIGGER_SYMBOLS(symbols);
\ 000057 EE MOV A,R6
\ 000058 C3 CLR C
\ 000059 9415 SUBB A,#0x15
\ 00005B 4008 JC ??macCspTxRequestAckTimeoutCallback_2
\ 00005D ; Setup parameters for call to function halAssertHandler
\ 00005D 90.... MOV DPTR,#(halAssertHandler & 0xffff)
\ 000060 74.. MOV A,#((halAssertHandler >> 16) & 0xff)
\ 000062 12.... LCALL ?BCALL ; Banked call to: DPTR()
\ ??macCspTxRequestAckTimeoutCallback_2:
\ 000065 EE MOV A,R6
\ 000066 C3 CLR C
\ 000067 33 RLC A
\ 000068 F594 MOV 0x94,A
\ 00006A E594 MOV A,0x94
\ 00006C 7003 JNZ ??mac
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -