📄 mss_spi.lst
字号:
227 1 SPItrans(SOH);
228 1 SPItrans('0');
229 1 SPItrans('1');
230 1 SPItrans('0');
231 1 SPItrans('2');
232 1 SPItrans(MSG);
233 1 checksum=MSG;
234 1 SPItrans(STX);
235 1 checksum+=0xc6; // 校验和
236 1 Rstwdt(); // 喂狗
237 1 }
238
239 ///////////////////////////////////////////////////////////////////////////////
240 // 组织发送命令体,命令不同,对应的命令体内容和长度也不相同
241 ///////////////////////////////////////////////////////////////////////////////
C51 COMPILER V7.07 MSS_SPI 09/14/2005 15:20:47 PAGE 5
242 void Command()
243 {
244 1 idata uchar i;
245 1
246 1 for(i=0;i<CommandLen;i++)
247 1 {
248 2 Rstwdt(); // 喂狗
249 2 SPItrans(SPIbuf[i]); // 发送命令体
250 2 checksum+=SPIbuf[i]; // 校验和
251 2 }
252 1 }
253
254 ///////////////////////////////////////////////////////////////////////////////
255 // 组织发送命令尾
256 ///////////////////////////////////////////////////////////////////////////////
257 void Postamble()
258 {
259 1 Rstwdt(); // 喂狗
260 1 SPItrans(ETX);
261 1 checksum+=ETX; // 校验和
262 1 CS_ASCII();
263 1 SPItrans(CSH);
264 1 SPItrans(CSL);
265 1 SPItrans(EOT);
266 1 Rstwdt(); // 喂狗
267 1 }
268
269 ///////////////////////////////////////////////////////////////////////////////
270 // 组织发送整个命令包
271 ///////////////////////////////////////////////////////////////////////////////
272 void SendMsg()
273 {
274 1 Preamble(); // SPI前导数据结构
275 1 Command(); // 命令体
276 1 Postamble(); // SPI校验和结束符
277 1 }
278
279 ///////////////////////////////////////////////////////////////////////////////
280 // 向MSS发送"ACK"或"NAK"
281 ///////////////////////////////////////////////////////////////////////////////
282 void SendNACK(uchar NACK)
283 {
284 1 Rstwdt(); // 喂狗
285 1 SPItrans(SOH);
286 1 SPItrans('0');
287 1 SPItrans('1');
288 1 SPItrans('0');
289 1 SPItrans('2');
290 1 SPItrans(MSG);
291 1 SPItrans(NACK);
292 1 SPItrans(EOT);
293 1 Rstwdt(); // 喂狗
294 1 }
295
296 ///////////////////////////////////////////////////////////////////////////////
297 // HOST接收MSS数据,按照标准信息包进行检查
298 // 如果接收错误向MSS发送NAK,如果3次发送错误返回失败
299 // 如果接收成功向MSS发送ACK
300 // 如果15秒内不能检测到MSS的数据发送中断,那么MSS可能故障
301 ///////////////////////////////////////////////////////////////////////////////
302 bit SPIReceive()
303 {
C51 COMPILER V7.07 MSS_SPI 09/14/2005 15:20:47 PAGE 6
304 1 idata uchar temp; // 临时变量
305 1 idata uchar NAKcounter; // NAK计数器
306 1 idata uint R_BUF; // 接收缓冲区指针
307 1 idata uint i; // 计数器
308 1
309 1 for(R_BUF=0; R_BUF<BUFSIZE; R_BUF++)
310 1 SPIbuf[R_BUF]=0; // 接收缓冲区清零
311 1
312 1 time_out=1500; // 如果15秒内MSS无数据返回退出错误
313 1 do
314 1 {
315 2 Rstwdt(); // 喂狗
316 2 if(time_out==0)
317 2 {
318 3 HandwareErr=ERROR; // MSS可能故障
319 3 time_out=0;
320 3 return ERROR; // 返回
321 3 }
322 2 }while(MSS_INT); // 检测MSS通信中断
323 1
324 1
325 1 NAKcounter=3; // NAK计数器
326 1 do
327 1 {
328 2 R_BUF=0; // 接收缓冲区计数
329 2 SOHptr=0;
330 2 ETXptr=0;
331 2 MSS=1;
332 2
333 2 time_out=1200; // 12000msSPI数据传输一个包时间
334 2 do
335 2 {
336 3 do
337 3 {
338 4 Rstwdt(); // 喂狗
339 4 if(time_out==0)
340 4 {
341 5 HandwareErr=ERROR; // MSS可能故障
342 5 return ERROR; // 返回
343 5 }
344 4 temp=SPItrans(0); // 接收数据
345 4 }while(temp==0);
346 3
347 3 SPIbuf[R_BUF++]=temp; // 非零数据存入缓冲区
348 3
349 3 if(R_BUF>BUFSIZE)break; // 缓冲区满
350 3
351 3 if(time_out==0)
352 3 {
353 4 HandwareErr=ERROR; // MSS可能故障
354 4 return ERROR; // 返回
355 4 }
356 3 }while(temp!=EOT); // 通信结束
357 2
358 2 i=0;
359 2 do
360 2 {
361 3 if(SPIbuf[i]==SOH) // 定位数据头
362 3 {
363 4 SOHptr=i;
364 4 break;
365 4 }
C51 COMPILER V7.07 MSS_SPI 09/14/2005 15:20:47 PAGE 7
366 3 i++;
367 3 Rstwdt(); // 喂狗
368 3 }while(i<R_BUF);
369 2
370 2 if(SOHptr==R_BUF)
371 2 {
372 3 goto SPIerr; // 缓冲区满,数据错误
373 3 }
374 2 else if(SPIbuf[SOHptr+6]!=STX)
375 2 {
376 3 goto SPIerr; // STX错误
377 3 }
378 2 else if(SPIbuf[R_BUF-4]!=ETX)
379 2 {
380 3 goto SPIerr; // ETX错误
381 3 }
382 2 else
383 2 {
384 3 MSG=SPIbuf[SOHptr+5]; // 保存信息号
385 3 ETXptr=R_BUF-4;
386 3 Rstwdt(); // 喂狗
387 3 CSH=SPIbuf[ETXptr+1];
388 3 CSL=SPIbuf[ETXptr+2];
389 3 HEX_CS();
390 3 testchecksum=0;
391 3
392 3 for(i=0;i<ETXptr-SOHptr+1;i++) // 计算校验和
393 3 {
394 4 Rstwdt(); // 喂狗
395 4 testchecksum+=SPIbuf[SOHptr+i];
396 4 }
397 3
398 3 temp=testchecksum+checksum;
399 3 temp=temp&0xff;
400 3 if(temp!=0)
401 3 goto SPIerr; // 校验
402 3
403 3 SendNACK(ACK); // 发送 ACK
404 3
405 3 return OK;
406 3 }
407 2 SPIerr:
408 2 Rstwdt();
409 2 SendNACK(NAK); // 发送 NAK 重新接收DSP数据
410 2 NAKcounter--;
411 2 }while(NAKcounter>0);
412 1
413 1 HandwareErr=ERROR; // MSS可能故障
414 1 return ERROR;
415 1 }
416
417 ///////////////////////////////////////////////////////////////////////////////
418 // HOST接收MSS发送的NAK或ACK数据,按照标准信息包进行检查
419 // 如果2秒内不能检测到MSS的数据发送中断,那么MSS可能故障
420 ///////////////////////////////////////////////////////////////////////////////
421 uchar ACKReceive()
422 {
423 1 idata uchar temp; // 临时变量
424 1 idata uchar R_BUF; // 接收缓冲区计数
425 1
426 1 for(R_BUF=0; R_BUF<255; R_BUF++)
427 1 SPIbuf[R_BUF]=0; // 接收缓冲区清零
C51 COMPILER V7.07 MSS_SPI 09/14/2005 15:20:47 PAGE 8
428 1
429 1 time_out=200; // 如果2秒内MSS无数据返回退出错误
430 1 do
431 1 {
432 2 Rstwdt(); // 喂狗
433 2 if(time_out==0)
434 2 {
435 3 HandwareErr=ERROR; // MSS可能故障
436 3 time_out=0;
437 3 return ERROR; // 返回
438 3 }
439 2 }while(MSS_INT); // 检测MSS通信中断
440 1
441 1
442 1 R_BUF=0;
443 1 time_out=50; // 500ms接收SPI数据包
444 1 do
445 1 {
446 2 do
447 2 {
448 3 temp=SPItrans(0); // 接收SPI字节
449 3
450 3 if(time_out==0)
451 3 {
452 4 HandwareErr=ERROR; // MSS可能故障
453 4 return ERROR; // 返回
454 4 }
455 3 }while(temp==0); // 空字符不接收
456 2
457 2 SPIbuf[R_BUF++]=temp;
458 2 if(R_BUF>20)
459 2 {
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -