📄 mac_csp_tx.lst
字号:
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 ??macCspTxRequestAckTimeoutCallback_3
\ 00006E 759401 MOV 0x94,#0x1
628
629 /* clear the currently loaded CSP, this generates a stop interrupt which must be cleared */
630 CSP_STOP_AND_CLEAR_PROGRAM();
\ ??macCspTxRequestAckTimeoutCallback_3:
\ 000071 75E1FF MOV 0xe1,#-0x1
631 MAC_MCU_CSP_STOP_CLEAR_INTERRUPT();
\ 000074 ; Setup parameters for call to function macMcuWriteRFIF
\ 000074 79FD MOV R1,#-0x3
\ 000076 90.... MOV DPTR,#(macMcuWriteRFIF & 0xffff)
\ 000079 74.. MOV A,#((macMcuWriteRFIF >> 16) & 0xff)
\ 00007B 12.... LCALL ?BCALL ; Banked call to: DPTR()
632
633 /*--------------------------
634 * load CSP program
635 */
636 RFST = WAITX;
\ 00007E 75E1BB MOV 0xe1,#-0x45
637 RFST = WEVENT;
\ 000081 75E1B8 MOV 0xe1,#-0x48
638 /*--------------------------
639 */
640
641 /* run CSP program */
642 MAC_MCU_CSP_STOP_ENABLE_INTERRUPT();
\ 000084 ; Setup parameters for call to function macMcuOrRFIM
\ 000084 7902 MOV R1,#0x2
\ 000086 90.... MOV DPTR,#(macMcuOrRFIM & 0xffff)
\ 000089 74.. MOV A,#((macMcuOrRFIM >> 16) & 0xff)
\ 00008B 12.... LCALL ?BCALL ; Banked call to: DPTR()
643 CSP_START_PROGRAM();
\ 00008E 75E1FE MOV 0xe1,#-0x2
644
645 /*
646 * For bullet proof operation, must account for the boundary condition
647 * where a rollover occurs after count was read but before CSP program
648 * was started.
649 *
650 * If current symbol count is less that the symbol count recorded at the
651 * start of this function, a rollover has occurred.
652 */
653
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -