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 + -
显示快捷键?