📄 main.lst
字号:
196 2 for (cCnt=0; cCnt<cP[0]; cCnt++)
197 2 {
198 3 cP[cCnt] = SPIRWByte(0xFF);
199 3 cCheckSum ^= cP[cCnt];
200 3 if(cP[0]>32)
201 3 {
202 4 NSS=1;
203 4 return FAILURE;
204 4 }
205 3 }
206 2 cP[cCnt] = SPIRWByte(0xFF);
207 2
208 2 NSS=1;
209 2 if (cCheckSum == cP[cCnt])
210 2 {
211 3 return SUCCESS;
212 3
213 3 }
214 2 }
215 1 return FAILURE;
216 1 }
217
218 /***** 写SPI总线数据 *********/
219 unsigned char SPI_Write(unsigned char *cP)
220 {
221 1 unsigned char i,cStatus;
222 1 unsigned char cCheckSum = 0;
223 1
224 1 NSS=0;
225 1 cStatus=SPIRWByte(spiwrite);
226 1
227 1 for(i=0; i<cP[0]; i++) // cP[0] 表示数据包的长度
228 1 {
229 2 cCheckSum ^= cP[i];
230 2 cStatus=SPIRWByte(cP[i]);
231 2 }
232 1 cStatus=SPIRWByte(cCheckSum);
233 1 NSS=1;
234 1 return cStatus;
235 1 }
236
237 /******************* serial function ****************************************/
238 /*****************************************************************************
239 *send command to Master over UART
240 *****************************************************************************/
C51 COMPILER V8.02 MAIN 02/25/2008 12:13:54 PAGE 5
241 void UartSend(unsigned char *cg_cReceBuf)
242 {
243 1 unsigned char i;
244 1 unsigned char cCheckSum;
245 1 ES = 0;
246 1 TI = 0;
247 1 g_bReceCommandOk = 0;
248 1 SBUF = 0xAA;
249 1 while (!TI);
250 1 TI = 0;
251 1 SBUF = 0xBB;
252 1 while (!TI);
253 1 cCheckSum = 0;
254 1 for (i=0; i<cg_cReceBuf[0]; i++)
255 1 {
256 2 cCheckSum ^= cg_cReceBuf[i];
257 2 TI = 0;
258 2 SBUF = cg_cReceBuf[i];
259 2 while (!TI);
260 2 if (cg_cReceBuf[i] == 0xAA)
261 2 //if there is a "0xAA" in the data serial but not the command header,
262 2 //add a "0x00" follow the "0xAA", CL (command length) will unchanged
263 2 {
264 3 TI = 0;
265 3 SBUF = 0;
266 3 while (!TI);
267 3 }
268 2 }
269 1 TI = 0;
270 1 SBUF = cCheckSum;
271 1 while (!TI);
272 1 TI = 0;
273 1 ES = 1;
274 1 }
275 /*****************************************************************************
276 *serial interrupt routine
277 *****************************************************************************/
278 seri_int () interrupt 4 using 2
279 {
280 1 static unsigned char i;
281 1 static unsigned char cReceivedData;
282 1 static unsigned char cCheckSum;
283 1 if (RI)
284 1 {
285 2 cReceivedData = SBUF;
286 2 RI = 0;
287 2 if (g_bReceAA)
288 2 {
289 3 g_bReceAA = 0;
290 3 if (0 != cReceivedData)
291 3 {
292 4 g_cReceNum = 0;
293 4 }
294 3 }
295 2 else
296 2 {
297 3 if (0xAA == cReceivedData)
298 3 {
299 4 g_bReceAA = 1;
300 4 }
301 3 g_cReceBuf[g_cReceNum++] = cReceivedData;
302 3
C51 COMPILER V8.02 MAIN 02/25/2008 12:13:54 PAGE 6
303 3 if (g_cReceNum > g_cReceBuf[0])
304 3 {
305 4 cCheckSum = 0;
306 4 for (i=0; i <= g_cReceBuf[0]; i++)
307 4 {
308 5 cCheckSum ^= g_cReceBuf[i];
309 5 }
310 4 if (0 == cCheckSum)
311 4 {
312 5 g_bReceCommandOk = 1;
313 5 ES = 0;
314 5 }
315 4 g_bReceAA = 0;
316 4 g_cReceNum = 0;
317 4 }
318 3 if (g_cReceNum >= sizeof(g_cReceBuf))
319 3 {
320 4 g_cReceNum = 0;
321 4 g_bReceAA = 0;
322 4 }
323 3 }
324 2 }
325 1 if (TI)
326 1 {
327 2 TI = 0;
328 2 }
329 1 }
330
331
332 ///////////////////////////////////////////////////////////////////////
333 // 串口命令处理函数
334 ///////////////////////////////////////////////////////////////////////
335 uchar uart_process(void)
336 {
337 1 uchar cmd;
338 1 uchar cStatus;
339 1 uchar temp;
340 1
341 1 cmd = g_cReceBuf[1];
342 1 switch(cmd)
343 1 {
344 2
345 2 case 0x01: // 读设备型号 8字节
346 2 cStatus =SPI_Write(g_cReceBuf); // 发送命令
347 2 delay_1ms(2); // 延时等待模块执行命令
348 2 cStatus =SPI_Read(cp); // 读取并存入到cP
349 2 if((cStatus==SUCCESS)&&(cp[1]==PCD_PN))
350 2 {
351 3 g_cReceBuf[0]=0x0a;
352 3 g_cReceBuf[1]=cmd;
353 3 memcpy(&g_cReceBuf[2],&cp[2],8);
354 3
355 3 }
356 2
357 2 else
358 2 {
359 3 g_cReceBuf[0]=0x02;
360 3 g_cReceBuf[1]=~cmd;
361 3 cStatus=1;
362 3 }
363 2 break;
364 2 case 0x02: // 读设备序列号 4字节
C51 COMPILER V8.02 MAIN 02/25/2008 12:13:54 PAGE 7
365 2 cStatus =SPI_Write(g_cReceBuf); // 发送命令
366 2 delay_1ms(2); // 延时等待模块执行命令
367 2 cStatus =SPI_Read(cp); // 读取并存入到cP
368 2 if((cStatus==SUCCESS)&&(cp[1]==PCD_SN))
369 2 {
370 3 g_cReceBuf[0]=6;
371 3 g_cReceBuf[1]=cmd;
372 3 memcpy(&g_cReceBuf[2],&cp[2],4);
373 3
374 3 }
375 2
376 2 else
377 2 {
378 3 g_cReceBuf[0]=0x02;
379 3 g_cReceBuf[1]=~cmd;
380 3 cStatus=1;
381 3 }
382 2
383 2 break;
384 2
385 2
386 2 case 0x10: // 读PCD固件版本号 4字节
387 2 cStatus =SPI_Write(g_cReceBuf); // 发送命令
388 2 delay_1ms(2); // 延时等待模块执行命令
389 2 cStatus =SPI_Read(cp); // 读取并存入到cP
390 2 if((cStatus==SUCCESS)&&(cp[1]==FW_REL))
391 2 {
392 3 g_cReceBuf[0]=6;
393 3 g_cReceBuf[1]=cmd;
394 3 memcpy(&g_cReceBuf[2],&cp[2],4);
395 3
396 3 }
397 2
398 2 else
399 2 {
400 3 g_cReceBuf[0]=0x02;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -