📄 spimgr.lst
字号:
85 halUARTCfg_t uartConfig;
86
87 /* Initialize APP ID */
88 App_TaskID = 0;
\ 000004 E4 CLR A
\ 000005 REQUIRE ?Subroutine0
\ 000005 ; // Fall through to label ?Subroutine0
89
90 /* UART Configuration */
91 uartConfig.configured = TRUE;
92 uartConfig.baudRate = SPI_MGR_DEFAULT_BAUDRATE;
93 uartConfig.flowControl = SPI_MGR_DEFAULT_OVERFLOW;
94 uartConfig.flowControlThreshold = SPI_MGR_DEFAULT_THRESHOLD;
95 uartConfig.rx.maxBufSize = SPI_MGR_DEFAULT_MAX_RX_BUFF;
96 uartConfig.tx.maxBufSize = SPI_MGR_DEFAULT_MAX_TX_BUFF;
97 uartConfig.idleTimeout = SPI_MGR_DEFAULT_IDLE_TIMEOUT;
98 uartConfig.intEnable = TRUE;
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;
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);
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;
119 SPIMgr_ZAppRxStatus = SPI_MGR_ZAPP_RX_READY;
120 #endif
121
122
123 }
\ In segment BANKED_CODE, align 1, keep-with-next
\ ?Subroutine0:
\ 000000 90.... MOV DPTR,#App_TaskID
\ 000003 F0 MOVX @DPTR,A
\ 000004 D083 POP DPH
\ 000006 D082 POP DPL
\ 000008 02.... LJMP ?BRET
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 ***************************************************************************************************/
\ In segment BANKED_CODE, align 1, keep-with-next
137 void SPIMgr_RegisterTaskID( byte taskID )
\ SPIMgr_RegisterTaskID:
138 {
\ 000000 C082 PUSH DPL
\ 000002 C083 PUSH DPH
\ 000004 ; Saved register size: 2
\ 000004 ; Auto size: 0
139 App_TaskID = taskID;
\ 000004 E9 MOV A,R1
\ 000005 80.. SJMP ?Subroutine0
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 ***************************************************************************************************/
\ In segment BANKED_CODE, align 1, keep-with-next
156 byte SPIMgr_CalcFCS( uint8 *msg_ptr, uint8 len )
\ SPIMgr_CalcFCS:
157 {
\ 000000 74F7 MOV A,#-0x9
\ 000002 12.... LCALL ?BANKED_ENTER_XDATA
\ 000005 ; Saved register size: 9
\ 000005 ; Auto size: 0
\ 000005 E9 MOV A,R1
\ 000006 FC MOV R4,A
158 byte x;
159 byte xorResult;
160
161 xorResult = 0;
\ 000007 7900 MOV R1,#0x0
162
163 for ( x = 0; x < len; x++, msg_ptr++ )
\ 000009 7D00 MOV R5,#0x0
\ 00000B 800E SJMP ??SPIMgr_CalcFCS_0
164 xorResult = xorResult ^ *msg_ptr;
\ ??SPIMgr_CalcFCS_1:
\ 00000D 8A82 MOV DPL,R2
\ 00000F 8B83 MOV DPH,R3
\ 000011 E0 MOVX A,@DPTR
\ 000012 C9 XCH A,R1
\ 000013 69 XRL A,R1
\ 000014 F9 MOV R1,A
\ 000015 0D INC R5
\ 000016 A3 INC DPTR
\ 000017 AA82 MOV R2,DPL
\ 000019 AB83 MOV R3,DPH
\ ??SPIMgr_CalcFCS_0:
\ 00001B ED MOV A,R5
\ 00001C C3 CLR C
\ 00001D 9C SUBB A,R4
\ 00001E 40ED JC ??SPIMgr_CalcFCS_1
165
166 return ( xorResult );
\ 000020 7F01 MOV R7,#0x1
\ 000022 02.... LJMP ?BANKED_LEAVE_XDATA
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];
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -