spimgr.s51
来自「用IAR开发的ZIGBEE网络路由例子」· S51 代码 · 共 1,108 行 · 第 1/3 页
S51
1,108 行
// 275 default:
// 276 break;
// 277 }
// 278
// 279
// 280 }
// 281 }
// 282 }
// 283 #endif //ZTOOL
// 284
// 285 #if defined (ZAPP_P1) || defined (ZAPP_P2)
// 286 /***************************************************************************************************
// 287 * @fn SPIMgr_ProcessZAppRxData
// 288 *
// 289 * @brief | SOP | CMD | Data Length | FSC |
// 290 * | 1 | 2 | 1 | 1 |
// 291 *
// 292 * Parses the data and determine either is SPI or just simply serial data
// 293 * then send the data to correct place (MT or APP)
// 294 *
// 295 * @param pBuffer - pointer to the buffer that contains the data
// 296 * length - length of the buffer
// 297 *
// 298 *
// 299 * @return None
// 300 ***************************************************************************************************/
RSEG BANKED_CODE:CODE:NOROOT(0)
// 301 void SPIMgr_ProcessZAppData ( uint8 port, uint8 event )
SPIMgr_ProcessZAppData:
CFI Block cfiBlock4 Using cfiCommon0
CFI Function SPIMgr_ProcessZAppData
// 302 {
FUNCALL SPIMgr_ProcessZAppData, Hal_UART_RxBufLen
LOCFRAME XSTACK, 12, STACK
ARGFRAME XSTACK, 12, STACK
FUNCALL SPIMgr_ProcessZAppData, SPIMgr_AppFlowControl
LOCFRAME XSTACK, 12, STACK
ARGFRAME XSTACK, 12, STACK
FUNCALL SPIMgr_ProcessZAppData, osal_msg_allocate
LOCFRAME XSTACK, 12, STACK
ARGFRAME XSTACK, 12, STACK
FUNCALL SPIMgr_ProcessZAppData, HalUARTRead
LOCFRAME XSTACK, 12, STACK
ARGFRAME XSTACK, 12, STACK
FUNCALL SPIMgr_ProcessZAppData, osal_msg_send
LOCFRAME XSTACK, 12, STACK
ARGFRAME XSTACK, 12, STACK
MOV A,#-0xc
LCALL ?BANKED_ENTER_XDATA
CFI DPH0 load(1, XDATA, add(CFA_XSP16, literal(-1)))
CFI DPL0 load(1, XDATA, add(CFA_XSP16, literal(-2)))
CFI ?BRET_EXT load(1, XDATA, add(CFA_XSP16, literal(-3)))
CFI ?RET_HIGH load(1, XDATA, add(CFA_XSP16, literal(-4)))
CFI ?RET_LOW load(1, XDATA, add(CFA_XSP16, literal(-5)))
CFI R7 load(1, XDATA, add(CFA_XSP16, literal(-6)))
CFI V3 load(1, XDATA, add(CFA_XSP16, literal(-7)))
CFI V2 load(1, XDATA, add(CFA_XSP16, literal(-8)))
CFI V1 load(1, XDATA, add(CFA_XSP16, literal(-9)))
CFI V0 load(1, XDATA, add(CFA_XSP16, literal(-10)))
CFI VB load(1, XDATA, add(CFA_XSP16, literal(-11)))
CFI R6 load(1, XDATA, add(CFA_XSP16, literal(-12)))
CFI CFA_SP SP+0
CFI CFA_XSP16 add(XSP16, 12)
; Saved register size: 12
; Auto size: 0
MOV ?V0 + 0,R2
// 303
// 304 osal_event_hdr_t *msg_ptr;
// 305 uint16 length = 0;
// 306 uint16 rxBufLen = Hal_UART_RxBufLen(SPI_MGR_DEFAULT_PORT);
; Setup parameters for call to function Hal_UART_RxBufLen
MOV R1,#0x1
MOV DPTR,#(Hal_UART_RxBufLen & 0xffff)
MOV A,#((Hal_UART_RxBufLen >> 16) & 0xff)
LCALL ?BCALL ; Banked call to: DPTR()
MOV ?V0 + 2,R2
MOV ?V0 + 3,R3
MOV R0,?V0 + 2
MOV R1,?V0 + 3
// 307
// 308 /*
// 309 If maxZAppBufferLength is 0 or larger than current length
// 310 the entire length of the current buffer is returned.
// 311 */
// 312 if ((SPIMgr_MaxZAppBufLen != 0) && (SPIMgr_MaxZAppBufLen <= rxBufLen))
MOV DPTR,#SPIMgr_MaxZAppBufLen
MOVX A,@DPTR
JNZ ??SPIMgr_ProcessZAppData_0
INC DPTR
MOVX A,@DPTR
??SPIMgr_ProcessZAppData_0:
JZ ??SPIMgr_ProcessZAppData_1
MOV DPTR,#SPIMgr_MaxZAppBufLen
MOVX A,@DPTR
MOV R2,A
INC DPTR
MOVX A,@DPTR
MOV R3,A
CLR C
MOV A,R0
SUBB A,R2
MOV A,R1
SUBB A,R3
JC ??SPIMgr_ProcessZAppData_1
// 313 {
// 314 length = SPIMgr_MaxZAppBufLen;
MOV DPTR,#SPIMgr_MaxZAppBufLen
MOVX A,@DPTR
MOV R6,A
INC DPTR
MOVX A,@DPTR
SJMP ??SPIMgr_ProcessZAppData_2
// 315 }
// 316 else
// 317 {
// 318 length = rxBufLen;
??SPIMgr_ProcessZAppData_1:
MOV A,R0
MOV R6,A
MOV A,R1
??SPIMgr_ProcessZAppData_2:
MOV R7,A
// 319 }
// 320
// 321 /* Verify events */
// 322 if (event == HAL_UART_TX_FULL)
MOV A,#0x8
XRL A,?V0 + 0
JZ ??SPIMgr_ProcessZAppData_3
// 323 {
// 324 // Do something when TX if full
// 325 return;
// 326 }
// 327
// 328 if (event & ( HAL_UART_RX_FULL | HAL_UART_RX_ABOUT_FULL | HAL_UART_RX_TIMEOUT))
MOV A,#0x7
ANL A,?V0 + 0
JZ ??SPIMgr_ProcessZAppData_3
// 329 {
// 330 if ( App_TaskID )
MOV DPTR,#App_TaskID
MOVX A,@DPTR
JZ ??SPIMgr_ProcessZAppData_3
// 331 {
// 332 /*
// 333 If Application is ready to receive and there is something
// 334 in the Rx buffer then send it up
// 335 */
// 336 if ((SPIMgr_ZAppRxStatus == SPI_MGR_ZAPP_RX_READY ) && (length != 0))
MOV DPTR,#SPIMgr_ZAppRxStatus
MOVX A,@DPTR
XRL A,#0x1
JNZ ??SPIMgr_ProcessZAppData_3
MOV A,R6
JNZ ??SPIMgr_ProcessZAppData_4
MOV A,R7
??SPIMgr_ProcessZAppData_4:
JZ ??SPIMgr_ProcessZAppData_3
// 337 {
// 338 /* Disable App flow control until it processes the current data */
// 339 SPIMgr_AppFlowControl ( SPI_MGR_ZAPP_RX_NOT_READY );
; Setup parameters for call to function SPIMgr_AppFlowControl
MOV R1,#0x0
MOV DPTR,#(SPIMgr_AppFlowControl & 0xffff)
MOV A,#((SPIMgr_AppFlowControl >> 16) & 0xff)
LCALL ?BCALL ; Banked call to: DPTR()
// 340
// 341 /* 2 more bytes are added, 1 for CMD type, other for length */
// 342 msg_ptr = (osal_event_hdr_t *)osal_msg_allocate( length + sizeof(osal_event_hdr_t) );
; Setup parameters for call to function osal_msg_allocate
MOV A,#0x2
ADD A,R6
MOV R2,A
CLR A
ADDC A,R7
MOV R3,A
MOV DPTR,#(osal_msg_allocate & 0xffff)
MOV A,#((osal_msg_allocate >> 16) & 0xff)
LCALL ?BCALL ; Banked call to: DPTR()
MOV ?V0 + 0,R2
MOV ?V0 + 1,R3
// 343 if ( msg_ptr )
MOV A,R2
JNZ ??SPIMgr_ProcessZAppData_5
MOV A,R3
??SPIMgr_ProcessZAppData_5:
JZ ??SPIMgr_ProcessZAppData_3
// 344 {
// 345 msg_ptr->event = SPI_INCOMING_ZAPP_DATA;
MOV A,#0x22
MOV DPL,R2
MOV DPH,R3
MOVX @DPTR,A
// 346 msg_ptr->status = length;
MOV A,R6
INC DPTR
MOVX @DPTR,A
// 347
// 348 /* Read the data of Rx buffer */
// 349 HalUARTRead( SPI_MGR_DEFAULT_PORT, (uint8 *)(msg_ptr + 1), length );
; Setup parameters for call to function HalUARTRead
MOV R4,A
MOV A,R7
MOV R5,A
MOV A,R2
ADD A,#0x2
INC R2
INC R2
MOV A,R3
ADDC A,#0x0
MOV R3,A
MOV R1,#0x1
MOV DPTR,#(HalUARTRead & 0xffff)
MOV A,#((HalUARTRead >> 16) & 0xff)
LCALL ?BCALL ; Banked call to: DPTR()
// 350
// 351 /* Send the raw data to application...or where ever */
// 352 osal_msg_send( App_TaskID, (uint8 *)msg_ptr );
; Setup parameters for call to function osal_msg_send
MOV R2,?V0 + 0
MOV R3,?V0 + 1
MOV DPTR,#App_TaskID
MOVX A,@DPTR
MOV R1,A
MOV DPTR,#(osal_msg_send & 0xffff)
MOV A,#((osal_msg_send >> 16) & 0xff)
LCALL ?BCALL ; Banked call to: DPTR()
??SPIMgr_ProcessZAppData_3:
MOV R7,#0x4
LJMP ?BANKED_LEAVE_XDATA
CFI EndBlock cfiBlock4
// 353 }
// 354 }
// 355 }
// 356 }
// 357 }
// 358
// 359 /***************************************************************************************************
// 360 * @fn SPIMgr_ZAppBufferLengthRegister
// 361 *
// 362 * @brief
// 363 *
// 364 * @param maxLen - Max Length that the application wants at a time
// 365 *
// 366 * @return None
// 367 *
// 368 ***************************************************************************************************/
RSEG BANKED_CODE:CODE:NOROOT(0)
// 369 void SPIMgr_ZAppBufferLengthRegister ( uint16 maxLen )
SPIMgr_ZAppBufferLengthRegister:
CFI Block cfiBlock5 Using cfiCommon0
CFI Function SPIMgr_ZAppBufferLengthRegister
// 370 {
PUSH DPL
CFI DPL0 Frame(CFA_SP, 4)
CFI CFA_SP SP+-4
PUSH DPH
CFI DPH0 Frame(CFA_SP, 5)
CFI CFA_SP SP+-5
; Saved register size: 2
; Auto size: 0
// 371 /* If the maxLen is larger than the RX buff, something is not right */
// 372 if (maxLen <= SPI_MGR_DEFAULT_MAX_RX_BUFF)
CLR C
MOV A,R2
SUBB A,#-0x7f
MOV A,R3
SUBB A,#0x0
MOV DPTR,#SPIMgr_MaxZAppBufLen
JNC ??SPIMgr_ZAppBufferLengthRegister_0
// 373 SPIMgr_MaxZAppBufLen = maxLen;
MOV A,R2
MOVX @DPTR,A
INC DPTR
MOV A,R3
SJMP ??SPIMgr_ZAppBufferLengthRegister_1
// 374 else
// 375 SPIMgr_MaxZAppBufLen = 1; /* default is 1 byte */
??SPIMgr_ZAppBufferLengthRegister_0:
MOV A,#0x1
MOVX @DPTR,A
INC DPTR
CLR A
??SPIMgr_ZAppBufferLengthRegister_1:
LJMP ?Subroutine0 & 0xFFFF
CFI EndBlock cfiBlock5
// 376 }
// 377
// 378 /***************************************************************************************************
// 379 * @fn SPIMgr_AppFlowControl
// 380 *
// 381 * @brief
// 382 *
// 383 * @param status - ready to send or not
// 384 *
// 385 * @return None
// 386 *
// 387 ***************************************************************************************************/
RSEG BANKED_CODE:CODE:NOROOT(0)
// 388 void SPIMgr_AppFlowControl ( bool status )
SPIMgr_AppFlowControl:
CFI Block cfiBlock6 Using cfiCommon0
CFI Function SPIMgr_AppFlowControl
// 389 {
FUNCALL SPIMgr_AppFlowControl, SPIMgr_ProcessZAppData
LOCFRAME ISTACK, 2, STACK
ARGFRAME ISTACK, 2, STACK
PUSH DPL
CFI DPL0 Frame(CFA_SP, 4)
CFI CFA_SP SP+-4
PUSH DPH
CFI DPH0 Frame(CFA_SP, 5)
CFI CFA_SP SP+-5
; Saved register size: 2
; Auto size: 0
// 390
// 391 /* Make sure only update if needed */
// 392 if (status != SPIMgr_ZAppRxStatus )
MOV DPTR,#SPIMgr_ZAppRxStatus
MOVX A,@DPTR
XRL A,R1
JZ ??SPIMgr_AppFlowControl_0
// 393 {
// 394 SPIMgr_ZAppRxStatus = status;
MOV A,R1
MOVX @DPTR,A
// 395 }
// 396
// 397 /* App is ready to read again, ProcessZAppData have to be triggered too */
// 398 if (status == SPI_MGR_ZAPP_RX_READY)
??SPIMgr_AppFlowControl_0:
MOV A,#0x1
XRL A,R1
JNZ ??SPIMgr_AppFlowControl_1
// 399 {
// 400 SPIMgr_ProcessZAppData ( SPI_MGR_DEFAULT_PORT, HAL_UART_RX_TIMEOUT );
; Setup parameters for call to function SPIMgr_ProcessZAppData
MOV R2,#0x4
MOV R1,#0x1
MOV DPTR,#(SPIMgr_ProcessZAppData & 0xffff)
MOV A,#((SPIMgr_ProcessZAppData >> 16) & 0xff)
LCALL ?BCALL ; Banked call to: DPTR()
// 401 }
// 402
// 403 }
??SPIMgr_AppFlowControl_1:
LJMP ??Subroutine0_0 & 0xFFFF
CFI EndBlock cfiBlock6
END
// 404
// 405 #endif //ZAPP
// 406
// 407 /***************************************************************************************************
// 408 ***************************************************************************************************/
//
// 445 bytes in segment BANKED_CODE
// 4 bytes in segment XDATA_Z
//
// 445 bytes of CODE memory
// 4 bytes of XDATA memory
//
//Errors: none
//Warnings: none
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?