spimgr.s51

来自「用IAR开发的ZIGBEE网络路由例子」· S51 代码 · 共 1,108 行 · 第 1/3 页

S51
1,108
字号
//   81  * @return  None
//   82 ***************************************************************************************************/

        RSEG BANKED_CODE:CODE:NOROOT(0)
//   83 void SPIMgr_Init ()
SPIMgr_Init:
        CFI Block cfiBlock0 Using cfiCommon0
        CFI Function SPIMgr_Init
//   84 {
        FUNCALL SPIMgr_Init, HalUARTOpen
        LOCFRAME ISTACK, 2, STACK
        LOCFRAME XSTACK, 30, STACK
        ARGFRAME ISTACK, 2, STACK
        ARGFRAME XSTACK, 30, 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: 30
        MOV	A,#-0x1e
        LCALL	?ALLOC_XSTACK8
        CFI CFA_XSP16 add(XSP16, 30)
//   85   halUARTCfg_t uartConfig;
//   86 
//   87   /* Initialize APP ID */
//   88   App_TaskID = 0;
        CLR	A
        MOV	DPTR,#App_TaskID
        MOVX	@DPTR,A
//   89 
//   90   /* UART Configuration */
//   91   uartConfig.configured           = TRUE;
        MOV	A,#0x1
        MOV	DPL,?XSP + 0
        MOV	DPH,?XSP + 1
        MOVX	@DPTR,A
//   92   uartConfig.baudRate             = SPI_MGR_DEFAULT_BAUDRATE;
        LCALL	?XSTACK_DISP0_8
        MOV	A,#0x6
        MOVX	@DPTR,A
//   93   uartConfig.flowControl          = SPI_MGR_DEFAULT_OVERFLOW;
        MOV	A,#0x2
        LCALL	?XSTACK_DISP0_8
        CLR	A
        MOVX	@DPTR,A
//   94   uartConfig.flowControlThreshold = SPI_MGR_DEFAULT_THRESHOLD;
        MOV	A,#0x3
        LCALL	?XSTACK_DISP0_8
        MOV	A,#0x30
        MOVX	@DPTR,A
        INC	DPTR
        CLR	A
        MOVX	@DPTR,A
//   95   uartConfig.rx.maxBufSize        = SPI_MGR_DEFAULT_MAX_RX_BUFF;
        MOV	A,#0xa
        LCALL	?XSTACK_DISP0_8
        MOV	A,#-0x80
        MOVX	@DPTR,A
        INC	DPTR
        CLR	A
        MOVX	@DPTR,A
//   96   uartConfig.tx.maxBufSize        = SPI_MGR_DEFAULT_MAX_TX_BUFF;
        MOV	A,#0x12
        LCALL	?XSTACK_DISP0_8
        MOV	A,#-0x80
        MOVX	@DPTR,A
        INC	DPTR
        CLR	A
        MOVX	@DPTR,A
//   97   uartConfig.idleTimeout          = SPI_MGR_DEFAULT_IDLE_TIMEOUT;
        MOV	A,#0x5
        LCALL	?XSTACK_DISP0_8
        MOV	A,#0x6
        MOVX	@DPTR,A
//   98   uartConfig.intEnable            = TRUE;
        MOV	A,#0x16
        LCALL	?XSTACK_DISP0_8
        MOV	A,#0x1
        MOVX	@DPTR,A
//   99 #if defined (ZTOOL_P1) || defined (ZTOOL_P2)
//  100   uartConfig.callBackFunc         = SPIMgr_ProcessZToolData;
//  101 #elif defined (ZAPP_P1) || defined (ZAPP_P2)
//  102   uartConfig.callBackFunc         = SPIMgr_ProcessZAppData;
        MOV	A,#0x1b
        LCALL	?XSTACK_DISP0_8
        MOV	A,#(SPIMgr_ProcessZAppData & 0xff)
        MOVX	@DPTR,A
        INC	DPTR
        MOV	A,#((SPIMgr_ProcessZAppData >> 8) & 0xff)
        MOVX	@DPTR,A
        INC	DPTR
        MOV	A,#((SPIMgr_ProcessZAppData >> 16) & 0xff)
        MOVX	@DPTR,A
//  103 #else
//  104   uartConfig.callBackFunc         = NULL;
//  105 #endif
//  106 
//  107   /* Start UART */
//  108 #if defined (SPI_MGR_DEFAULT_PORT)
//  109   HalUARTOpen (SPI_MGR_DEFAULT_PORT, &uartConfig);
        ; Setup parameters for call to function HalUARTOpen
        MOV	DPL,?XSP + 0
        MOV	DPH,?XSP + 1
        MOV	R2,DPL
        MOV	R3,DPH
        MOV	R1,#0x1
        MOV	DPTR,#(HalUARTOpen & 0xffff)
        MOV	A,#((HalUARTOpen >> 16) & 0xff)
        LCALL	?BCALL               ; Banked call to: DPTR()
//  110 #else
//  111   /* Silence IAR compiler warning */
//  112   (void)uartConfig;
//  113 #endif
//  114 
//  115   /* Initialize for ZApp */
//  116 #if defined (ZAPP_P1) || defined (ZAPP_P2)
//  117   /* Default max bytes that ZAPP can take */
//  118   SPIMgr_MaxZAppBufLen  = 1;
        MOV	DPTR,#SPIMgr_MaxZAppBufLen
        MOV	A,#0x1
        MOVX	@DPTR,A
        INC	DPTR
        CLR	A
        MOVX	@DPTR,A
//  119   SPIMgr_ZAppRxStatus   = SPI_MGR_ZAPP_RX_READY;
        MOV	A,#0x1
        MOV	DPTR,#SPIMgr_ZAppRxStatus
        MOVX	@DPTR,A
//  120 #endif
//  121 
//  122 
//  123 }
        MOV	A,#0x1e
        LCALL	?DEALLOC_XSTACK8
        CFI CFA_XSP16 XSP16+0
        SJMP	??Subroutine0_0
        CFI EndBlock cfiBlock0

        RSEG BANKED_CODE:CODE:NOROOT(0)
?Subroutine0:
        CFI Block cfiBlock1 Using cfiCommon0
        CFI NoFunction
        CFI CFA_SP SP+-5
        CFI DPL0 Frame(CFA_SP, 4)
        CFI DPH0 Frame(CFA_SP, 5)
        MOVX	@DPTR,A
??Subroutine0_0:
        POP	DPH
        CFI CFA_SP SP+-4
        CFI DPH0 SameValue
        POP	DPL
        CFI CFA_SP SP+-3
        CFI DPL0 SameValue
        LJMP	?BRET
        CFI EndBlock cfiBlock1
//  124 
//  125 /***************************************************************************************************
//  126  * @fn      MT_SerialRegisterTaskID
//  127  *
//  128  * @brief
//  129  *
//  130  *   This function registers the taskID of the application so it knows
//  131  *   where to send the messages whent they come in.
//  132  *
//  133  * @param   void
//  134  *
//  135  * @return  void
//  136  ***************************************************************************************************/

        RSEG BANKED_CODE:CODE:NOROOT(0)
//  137 void SPIMgr_RegisterTaskID( byte taskID )
SPIMgr_RegisterTaskID:
        CFI Block cfiBlock2 Using cfiCommon0
        CFI Function SPIMgr_RegisterTaskID
//  138 {
        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
//  139   App_TaskID = taskID;
        MOV	A,R1
        MOV	DPTR,#App_TaskID
        SJMP	?Subroutine0
        CFI EndBlock cfiBlock2
//  140 }
//  141 
//  142 /***************************************************************************************************
//  143  * @fn      SPIMgr_CalcFCS
//  144  *
//  145  * @brief
//  146  *
//  147  *   Calculate the FCS of a message buffer by XOR'ing each byte.
//  148  *   Remember to NOT include SOP and FCS fields, so start at the CMD
//  149  *   field.
//  150  *
//  151  * @param   byte *msg_ptr - message pointer
//  152  * @param   byte len - length (in bytes) of message
//  153  *
//  154  * @return  result byte
//  155  ***************************************************************************************************/

        RSEG BANKED_CODE:CODE:NOROOT(0)
//  156 byte SPIMgr_CalcFCS( uint8 *msg_ptr, uint8 len )
SPIMgr_CalcFCS:
        CFI Block cfiBlock3 Using cfiCommon0
        CFI Function SPIMgr_CalcFCS
//  157 {
        MOV	A,#-0x9
        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 V0 load(1, XDATA, add(CFA_XSP16, literal(-7)))
        CFI VB load(1, XDATA, add(CFA_XSP16, literal(-8)))
        CFI R6 load(1, XDATA, add(CFA_XSP16, literal(-9)))
        CFI CFA_SP SP+0
        CFI CFA_XSP16 add(XSP16, 9)
        ; Saved register size: 9
        ; Auto size: 0
        MOV	A,R1
        MOV	R4,A
//  158   byte x;
//  159   byte xorResult;
//  160 
//  161   xorResult = 0;
        MOV	R1,#0x0
//  162 
//  163   for ( x = 0; x < len; x++, msg_ptr++ )
        MOV	R5,#0x0
        SJMP	??SPIMgr_CalcFCS_0
//  164     xorResult = xorResult ^ *msg_ptr;
??SPIMgr_CalcFCS_1:
        MOV	DPL,R2
        MOV	DPH,R3
        MOVX	A,@DPTR
        XCH	A,R1
        XRL	A,R1
        MOV	R1,A
        INC	R5
        INC	DPTR
        MOV	R2,DPL
        MOV	R3,DPH
??SPIMgr_CalcFCS_0:
        MOV	A,R5
        CLR	C
        SUBB	A,R4
        JC	??SPIMgr_CalcFCS_1
//  165 
//  166   return ( xorResult );
        MOV	R7,#0x1
        LJMP	?BANKED_LEAVE_XDATA
        CFI EndBlock cfiBlock3
//  167 }
//  168 
//  169 
//  170 #if defined (ZTOOL_P1) || defined (ZTOOL_P2)
//  171 /***************************************************************************************************
//  172  * @fn      SPIMgr_ProcessZToolRxData
//  173  *
//  174  * @brief   | SOP | CMD  |   Data Length   | FSC  |
//  175  *          |  1  |  2   |       1         |  1   |
//  176  *
//  177  *          Parses the data and determine either is SPI or just simply serial data
//  178  *          then send the data to correct place (MT or APP)
//  179  *
//  180  * @param   pBuffer  - pointer to the buffer that contains the data
//  181  *          length   - length of the buffer
//  182  *
//  183  *
//  184  * @return  None
//  185  ***************************************************************************************************/
//  186 void SPIMgr_ProcessZToolData ( uint8 port, uint8 event )
//  187 {
//  188   uint8  ch;
//  189 
//  190   /* Verify events */
//  191   if (event == HAL_UART_TX_FULL)
//  192   {
//  193     // Do something when TX if full
//  194     return;
//  195   }
//  196 
//  197   if (event & (HAL_UART_RX_FULL | HAL_UART_RX_ABOUT_FULL | HAL_UART_RX_TIMEOUT))
//  198   {
//  199     while (Hal_UART_RxBufLen(SPI_MGR_DEFAULT_PORT))
//  200     {
//  201       HalUARTRead (SPI_MGR_DEFAULT_PORT, &ch, 1);
//  202 
//  203       switch (state)
//  204       {
//  205         case SOP_STATE:
//  206           if (ch == SOP_VALUE)
//  207             state = CMD_STATE1;
//  208           break;
//  209 
//  210         case CMD_STATE1:
//  211           CMD_Token[0] = ch;
//  212           state = CMD_STATE2;
//  213           break;
//  214 
//  215         case CMD_STATE2:
//  216           CMD_Token[1] = ch;
//  217           state = LEN_STATE;
//  218           break;
//  219 
//  220         case LEN_STATE:
//  221           LEN_Token = ch;
//  222           if (ch == 0)
//  223             state = FCS_STATE;
//  224           else
//  225             state = DATA_STATE;
//  226 
//  227           tempDataLen = 0;
//  228 
//  229           /* Allocate memory for the data */
//  230           SPI_Msg = (mtOSALSerialData_t *)osal_msg_allocate( sizeof ( mtOSALSerialData_t ) + 2+1+LEN_Token );
//  231 
//  232           if (SPI_Msg)
//  233           {
//  234             /* Fill up what we can */
//  235             SPI_Msg->hdr.event = CMD_SERIAL_MSG;
//  236             SPI_Msg->msg = (uint8*)(SPI_Msg+1);
//  237             SPI_Msg->msg[0] = CMD_Token[0];
//  238             SPI_Msg->msg[1] = CMD_Token[1];
//  239             SPI_Msg->msg[2] = LEN_Token;
//  240           }
//  241           else
//  242           {
//  243             state = SOP_STATE;
//  244             return;
//  245           }
//  246 
//  247           break;
//  248 
//  249         case DATA_STATE:
//  250             SPI_Msg->msg[3 + tempDataLen++] = ch;
//  251             if ( tempDataLen == LEN_Token )
//  252               state = FCS_STATE;
//  253           break;
//  254 
//  255         case FCS_STATE:
//  256 
//  257           FSC_Token = ch;
//  258 
//  259           /* Make sure it's correct */
//  260           if ((SPIMgr_CalcFCS ((uint8*)&SPI_Msg->msg[0], 2 + 1 + LEN_Token) == FSC_Token))
//  261           {
//  262             osal_msg_send( MT_TaskID, (byte *)SPI_Msg );
//  263           }
//  264           else
//  265           {
//  266             /* deallocate the msg */
//  267             osal_msg_deallocate ( (uint8 *)SPI_Msg);
//  268           }
//  269 
//  270           /* Reset the state, send or discard the buffers at this point */
//  271           state = SOP_STATE;
//  272 
//  273           break;
//  274 

⌨️ 快捷键说明

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