⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 halstack.s51

📁 无线单片机cc2430简化协议的无线收发程序
💻 S51
📖 第 1 页 / 共 5 页
字号:
??halInitRadio_5:
        MOV	A,#0x8
        LCALL	?XSTACK_DISP0_8
        MOV	R4,#(local_radio_flags & 0xff)
        MOV	R5,#((local_radio_flags >> 8) & 0xff)
        MOV	A,#0x2
        LCALL	?MOVE_LONG8_XDATA_XDATA
//  263   // Setting for AUTO CRC
//  264   MDMCTRL0L |= AUTO_CRC;
        MOV	DPTR,#-0x20fd
        MOVX	A,@DPTR
        SETB	0xE0 /* A   */.5
        MOVX	@DPTR,A
//  265 
//  266   //pan
//  267   if (radio_flags.bits.pan_coordinator) {
        MOV	A,#0x8
        LCALL	?XSTACK_DISP0_8
        MOVX	A,@DPTR
        ANL	A,#0x2
        JZ	??halInitRadio_6
//  268     MDMCTRL0H |= PAN_COORDINATOR;  //accepts frames with only source addressing modes
        MOV	DPTR,#-0x20fe
        MOVX	A,@DPTR
        SETB	0xE0 /* A   */.4
        MOVX	@DPTR,A
        SJMP	??halInitRadio_7
//  269   } else {
//  270     MDMCTRL0H &= ~PAN_COORDINATOR;  //rejects frames with only source addressing modes
??halInitRadio_6:
        MOV	DPTR,#-0x20fe
        MOVX	A,@DPTR
        CLR	0xE0 /* A   */.4
        MOVX	@DPTR,A
//  271   }
//  272 
//  273   // Turning on AUTO_TX2RX
//  274   FSMTC1 = ((FSMTC1 & (~AUTO_TX2RX_OFF & ~RX2RX_TIME_OFF))  | ACCEPT_ACKPKT);
??halInitRadio_7:
        MOV	DPTR,#-0x20ac
        MOVX	A,@DPTR
        ANL	A,#0xf3
        ORL	A,#0x1
        MOV	DPTR,#-0x20ac
        MOVX	@DPTR,A
//  275 
//  276   // Turning off abortRxOnSrxon.
//  277   FSMTC1 &= ~0x20;
        MOV	DPTR,#-0x20ac
        MOVX	A,@DPTR
        CLR	0xE0 /* A   */.5
        MOVX	@DPTR,A
//  278 
//  279   //now configure the RX, TX systems.
//  280   // Setting the number of bytes to assert the FIFOP flag
//  281   IOCFG0 = 127;  //set to max value as the FIFOP flag goes high when complete packet received
        MOV	A,#0x7f
        MOV	DPTR,#-0x20b1
        MOVX	@DPTR,A
//  282 
//  283   // Flushing both Tx and Rx FiFo. The flush-Rx is issued twice to reset the SFD.
//  284   // Calibrating the radio and turning on Rx to evaluate the CCA.
//  285   SRXON;
        MOV	0xe1,#-0x3e
//  286   SFLUSHTX;
        MOV	0xe1,#-0x39
//  287   SFLUSHRX;
        MOV	0xe1,#-0x3a
//  288   SFLUSHRX;
        MOV	0xe1,#-0x3a
//  289   STXCALN;
        MOV	0xe1,#-0x3f
//  290   ISSTART;
        MOV	0xe1,#-0x2
//  291 
//  292   SACKPEND;  //routers/
        MOV	0xe1,#-0x37
//  293 
//  294   halSetRadioIEEEAddress();
        ; Setup parameters for call to function halSetRadioIEEEAddress
        LCALL	halSetRadioIEEEAddress
//  295 
//  296    //Radio can interrupt when
//  297    //RX configuration
//  298    //clear flags/mask in radio
//  299    RFIF = 0;
        MOV	0xe9,#0x0
//  300    RFIM = 0;   //all interrupts are masked.
        MOV	0x91,#0x0
//  301    //enable RX interrupt on processor
//  302    INT_SETFLAG_RF(INT_CLR);
        MOV	A,#-0x4
        ANL	A,0x9b
        MOV	R2,A
        MOV	0x9b,R2
//  303    INT_ENABLE_RF(INT_ON);
        MOV	A,#0x1
        ORL	A,0x9a
        MOV	R4,A
        MOV	0x9a,R4
//  304 
//  305    //enable RX RFERR interrupt on processor
//  306    INT_SETFLAG_RFERR(INT_CLR);
        CLR	0x88.1
//  307    INT_ENABLE_RFERR(INT_ON);
        SETB	0xa8.0
//  308 
//  309    //do not use DMA at this point
//  310    //enable the RX receive interrupt here.
//  311    RFIM |= IRQ_FIFOP;
        ORL	0x91,#0x20
//  312 
//  313    return(LRWPAN_STATUS_SUCCESS);
        MOV	R1,#0x0
??halInitRadio_2:
        MOV	R7,#0x1
        LJMP	?FUNC_LEAVE_XDATA
        CFI EndBlock cfiBlock17
//  314 }

        RSEG CODE_C:CODE:REORDER:NOROOT(0)
??xxxxromstr:
        DB "halInitRadio()\012"
//  315 
//  316 #define PIN_CCA   CCA    //CCA is defined in hal.h
//  317 
//  318 //regardless of what happens here, we will try TXONCCA after this returns.

        RSEG NEAR_CODE:CODE:NOROOT(0)
//  319 void  doIEEE_backoff(void) {
doIEEE_backoff:
        CFI Block cfiBlock18 Using cfiCommon0
        CFI Function doIEEE_backoff
        FUNCALL doIEEE_backoff, halGetRandomByte
        LOCFRAME ISTACK, 1, STACK
        LOCFRAME XSTACK, 21, STACK
        ARGFRAME ISTACK, 1, STACK
        ARGFRAME XSTACK, 21, STACK
        FUNCALL doIEEE_backoff, halGetMACTimer
        LOCFRAME XSTACK, 21, STACK
        ARGFRAME XSTACK, 21, STACK
        FUNCALL doIEEE_backoff, halGetMACTimer
        LOCFRAME XSTACK, 21, STACK
        ARGFRAME XSTACK, 21, STACK
        MOV	A,#-0xf
        LCALL	?FUNC_ENTER_XDATA
        CFI DPH0 load(1, XDATA, add(CFA_XSP16, literal(-1)))
        CFI DPL0 load(1, XDATA, add(CFA_XSP16, literal(-2)))
        CFI ?RET_HIGH load(1, XDATA, add(CFA_XSP16, literal(-3)))
        CFI ?RET_LOW load(1, XDATA, add(CFA_XSP16, literal(-4)))
        CFI R7 load(1, XDATA, add(CFA_XSP16, literal(-5)))
        CFI V7 load(1, XDATA, add(CFA_XSP16, literal(-6)))
        CFI V6 load(1, XDATA, add(CFA_XSP16, literal(-7)))
        CFI V5 load(1, XDATA, add(CFA_XSP16, literal(-8)))
        CFI V4 load(1, XDATA, add(CFA_XSP16, literal(-9)))
        CFI V3 load(1, XDATA, add(CFA_XSP16, literal(-10)))
        CFI V2 load(1, XDATA, add(CFA_XSP16, literal(-11)))
        CFI V1 load(1, XDATA, add(CFA_XSP16, literal(-12)))
        CFI V0 load(1, XDATA, add(CFA_XSP16, literal(-13)))
        CFI VB load(1, XDATA, add(CFA_XSP16, literal(-14)))
        CFI R6 load(1, XDATA, add(CFA_XSP16, literal(-15)))
        CFI CFA_SP SP+0
        CFI CFA_XSP16 add(XSP16, 15)
        ; Saved register size: 15
        ; Auto size: 6
        MOV	A,#-0x6
        LCALL	?ALLOC_XSTACK8
        CFI CFA_XSP16 add(XSP16, 21)
//  320      BYTE be, nb, tmp, rannum;
//  321     UINT32  delay, start_tick;
//  322 
//  323    be = aMinBE;
        MOV	R6,#0x0
//  324    nb = 0;
        MOV	A,#0x0
        MOV	DPL,?XSP + 0
        MOV	DPH,?XSP + 1
        MOVX	@DPTR,A
//  325   do {
//  326       if (be) {
??doIEEE_backoff_0:
        MOV	A,R6
        JNZ	$+5
        LJMP	??doIEEE_backoff_1
//  327         //do random delay
//  328         tmp = be;
        MOV	A,R6
        PUSH	A
        CFI CFA_SP SP+-1
        MOV	A,#0x1
        LCALL	?XSTACK_DISP0_8
        POP	A
        CFI CFA_SP SP+0
        MOVX	@DPTR,A
//  329         //compute new delay
//  330         delay = 1;
        MOV	DPTR,#__Constant_1
        MOV	R0,#?V0 + 0
        LCALL	?L_MOV_X
        MOV	?V0 + 4,?V0 + 0
        MOV	?V0 + 5,?V0 + 1
        MOV	?V0 + 6,?V0 + 2
        MOV	?V0 + 7,?V0 + 3
//  331         while (tmp) {
??doIEEE_backoff_2:
        MOV	A,#0x1
        LCALL	?XSTACK_DISP0_8
        MOVX	A,@DPTR
        JZ	??doIEEE_backoff_3
//  332           delay = delay << 1;  //delay = 2**be;
        MOV	A,#0x1
        MOV	R0,#?V0 + 4
        LCALL	?L_SHL
//  333            tmp--;
        MOV	A,#0x1
        LCALL	?XSTACK_DISP0_8
        MOVX	A,@DPTR
        ADD	A,#-0x1
        MOVX	@DPTR,A
        SJMP	??doIEEE_backoff_2
//  334          }
//  335         rannum =  halGetRandomByte() & (delay-1); //rannum will be between 0 and delay-1
??doIEEE_backoff_3:
        MOV	A,?V0 + 4
        ADD	A,#-0x1
        PUSH	A
        CFI CFA_SP SP+-1
        ; Setup parameters for call to function halGetRandomByte
        LCALL	halGetRandomByte
        MOV	A,R1
        MOV	R2,A
        POP	A
        CFI CFA_SP SP+0
        ANL	A,R2
        MOV	R7,A
//  336         delay = 0;
        MOV	DPTR,#__Constant_0
        MOV	R0,#?V0 + 0
        LCALL	?L_MOV_X
        MOV	?V0 + 4,?V0 + 0
        MOV	?V0 + 5,?V0 + 1
        MOV	?V0 + 6,?V0 + 2
        MOV	?V0 + 7,?V0 + 3
//  337         while (rannum) {
??doIEEE_backoff_4:
        MOV	A,R7
        JZ	??doIEEE_backoff_5
//  338             delay  += SYMBOLS_TO_MACTICKS(aUnitBackoffPeriod);
        MOV	DPTR,#__Constant_14
        MOV	R0,#?V0 + 4
        LCALL	?L_ADD_X
//  339             rannum--;
        DEC	R7
        SJMP	??doIEEE_backoff_4
//  340          }//delay = aUnitBackoff * rannum
//  341         //now do backoff
//  342        start_tick = halGetMACTimer();
??doIEEE_backoff_5:
        ; Setup parameters for call to function halGetMACTimer
        LCALL	halGetMACTimer
        MOV	?V0 + 0,R2
        MOV	?V0 + 1,R3
        MOV	?V0 + 2,R4
        MOV	?V0 + 3,R5
        MOV	A,#0x2
        LCALL	?XSTACK_DISP0_8
        MOV	R0,#?V0 + 0
        LCALL	?L_MOV_TO_X
//  343         while (halMACTimerNowDelta(start_tick) < delay);
??doIEEE_backoff_6:
        ; Setup parameters for call to function halGetMACTimer
        LCALL	halGetMACTimer
        MOV	?V0 + 0,R2
        MOV	?V0 + 1,R3
        MOV	?V0 + 2,R4
        MOV	?V0 + 3,R5
        MOV	A,#0x2
        LCALL	?XSTACK_DISP0_8
        MOV	R0,#?V0 + 0
        LCALL	?L_SUB_X
        MOV	DPTR,#__Constant_fffff
        MOV	R0,#?V0 + 0
        LCALL	?L_AND_X
        MOV	R0,#?V0 + 4
        MOV	R1,#?V0 + 0
        LCALL	?UL_GT
        JC	??doIEEE_backoff_6
//  344       }
//  345       //check CCA
//  346       if (PIN_CCA)  break;
??doIEEE_backoff_1:
        MOV	DPTR,#-0x209e
        MOVX	A,@DPTR
        MOV	C,0xE0 /* A   */.0
        JC	??doIEEE_backoff_7
//  347       nb++;
        MOV	DPL,?XSP + 0
        MOV	DPH,?XSP + 1
        MOVX	A,@DPTR
        ADD	A,#0x1
        MOVX	@DPTR,A
//  348       be++;
        INC	R6
//  349       if (be > aMaxBE) be =aMaxBE;
        MOV	A,R6
        CLR	C
        SUBB	A,#0x6
        JC	??doIEEE_backoff_8
        MOV	R6,#0x5
//  350    }while (nb <= macMaxCSMABackoffs);
??doIEEE_backoff_8:
        MOV	DPL,?XSP + 0
        MOV	DPH,?XSP + 1
        MOVX	A,@DPTR
        CLR	C
        SUBB	A,#0x5
        JNC	$+5
        LJMP	??doIEEE_backoff_0
//  351   return;
??doIEEE_backoff_7:
        MOV	A,#0x6
        LCALL	?DEALLOC_XSTACK8
        CFI CFA_XSP16 add(XSP16, 15)
        MOV	R7,#0x8
        LJMP	?FUNC_LEAVE_XDATA
        CFI EndBlock cfiBlock18
//  352 }
//  353 
//  354 //transmit packet
//  355 //hdrlen - header lenth
//  356 //hdr - pointer to header data
//  357 //plen - payload length
//  358 //pload - pointer to payload
//  359 

        RSEG NEAR_CODE:CODE:NOROOT(0)
//  360 LRWPAN_STATUS_ENUM halSendPacket(BYTE flen, BYTE *frm)
halSendPacket:
        CFI Block cfiBlock19 Using cfiCommon0
        CFI Function halSendPacket
//  361 {
        FUNCALL halSendPacket, halWait
        LOCFRAME XSTACK, 11, STACK
        ARGFRAME XSTACK, 11, STACK
        FUNCALL halSendPacket, doIEEE_backoff
        LOCFRAME XSTACK, 11, STACK
        ARGFRAME XSTACK, 11, STACK
        FUNCALL halSendPacket, phyTxStartCallBack
        LOCFRAME XSTACK, 11, STACK
        ARGFRAME XSTACK, 11, STACK
        MOV	A,#-0xb
        LCALL	?FUNC_ENTER_XDATA
        CFI DPH0 load(1, XDATA, add(CFA_XSP16, literal(-1)))
        CFI DPL0 load(1, XDATA, add(CFA_XSP16, literal(-2)))
        CFI ?RET_HIGH load(1, XDATA, add(CFA_XSP16, literal(-3)))
        CFI ?RET_LOW load(1, XDATA, add(CFA_XSP16, literal(-4)))
        CFI R7 load(1, XDATA, add(CFA_XSP16, literal(-5)))
        CFI V3 load(1, XDATA, add(CFA_XSP16, literal(-6)))
        CFI V2 load(1, XDATA, add(CFA_XSP16, literal(-7)))
        CFI V1 load(1, XDATA, add(CFA_XSP16, literal(-8)))
        CFI V0 load(1, XDATA, add(CFA_XSP16, literal(-9)))
        CFI VB load(1, XDATA, add(CFA_XSP16, literal(-10)))
        CFI R6 load(1, XDATA, add(CFA_XSP16, literal(-11)))
        CFI CFA_SP SP+0
        CFI CFA_XSP16 add(XSP16, 11)
        ; Saved register size: 11
        ; Auto size: 0
        MOV	?V0 + 0,R1
        MOV	A,R2
        MOV	R6,A
        MOV	A,R3
        MOV	R7,A
//  362   BYTE len,state;
//  363   LRWPAN_STATUS_ENUM res;
//  364 
//  365 
//  366 
//  367 
//  368   //if you print out the packet, this can cause timeouts on waits
//  369   //dbgPrintPacket(frm,flen+2);
//  370 
//  371   //total length, does not include length byte itself
//  372   //last two bytes are the FCS bytes that are added automatically
//  373   len = flen + PACKET_FOOTER_SIZE;
        MOV	A,#0x2
        ADD	A,?V0 + 0
        MOV	?V0 + 1,A
//  374 
//  375   // Clearing RF interrupt flags and enabling RF interrupts.
//  376   if(FSMSTATE == 6 && RXFIFOCNT > 0)
        MOV	DPTR,#-0x20c7
        MOVX	A,@DPTR
        XRL	A,#0x6
        JNZ	??halSendPacket_0
        MOV	DPTR,#-0x20ad
        MOVX	A,@DPTR
        CLR	C
        SUBB	A,#0x1
        JC	??halSendPacket_0
//  377   {
//  378     ISFLUSHRX;
        MOV	0xe1,#-0x1a
//  379     ISFLUSHRX;
        MOV	0xe1,#-0x1a
//  380   }
//  381 
//  382   RFIF &= ~IRQ_TXDONE;      //Clear the RF TXDONE flag
??halSendPacket_0:
        ANL	0xe9,#0xbf
//  383   INT_SETFLAG_RF(INT_CLR);  //Clear processor interrupt flag
        MOV	A,#-0x4
        ANL	A,0x9b
        MOV	R2,A
        MOV	0x9b,R2
//  384 
//  385   //write packet length
//  386   RFD = len;
        MOV	0xd9,?V0 + 1
//  387 
//  388 
//  389   //DEBUG_STRING(DBG_TX,"halSendPacket()-len:");
//  390   //DEBUG_UINT8(DBG_TX,flen);   DEBUG_STRING(DBG_TX," data:");
//  391   while (flen)
??halSendPacket_1:
        MOV	A,?V0 + 0
        JZ	??halSendPacket_2
//  392   {
//  393      RFD = *frm;
        MOV	DPL,R6
        MOV	DPH,R7
        MOVX	A,@DPTR
        MOV	0xd9,A
//  394      //DEBUG_UINT8(DBG_TX,*frm);  DEBUG_STRING(DBG_TX,",");
//  395      frm++;
        MOV	DPL,R6
        MOV	DPH,R7
        INC

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -