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