📄 halstack.s51
字号:
??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 + -