📄 stepbystep.lst
字号:
249 1 do
250 1 {
251 2 temp=*SJA1000_ADDRESS; //读出当前状态
252 2 }while(!(temp&SJA1000_SENT_OVER)); //如正在发送,则等待
253 1
254 1 do
255 1 {
256 2 SJA1000_ADDRESS=SJA1000_STATE;
257 2 temp=*SJA1000_ADDRESS; //读出当前状态
258 2 }
259 1 while(!(temp&SJA1000_SENT_LOCK)); //如发送缓冲区被锁定,则等待释放
260 1
261 1 SJA1000_ADDRESS=SJA1000_TXBUF;
262 1 for(j=0;j<11;j++) //发送到CAN缓冲区
263 1 {
264 2 *(SJA1000_ADDRESS+j)=CAN_TXD_BUF[j];
265 2 }
266 1 SJA1000_ADDRESS=SJA1000_COMMAND; //指向命令寄存器
267 1 *SJA1000_ADDRESS=SJA1000_SENT_COMMAND; //发送请求命令
268 1 LED2=1;
269 1 }
270
271 void sja1000_receiving () interrupt 0 using 0
272 {
273 1 receive_err=1;
274 1 // SJA1000_RECEIVE_IN_INTERR();
275 1 return;
276 1 }
277
278 void SJA1000_RECEIVE()
279 {
280 1 unsigned char data can_temp,j,k,Length;
281 1 bit FF,RTR;
282 1
283 1 receive_err=0;
284 1 LED2=0;;
285 1
286 1 SJA1000_ADDRESS=SJA1000_STATE; //指向状态寄存器
287 1 can_temp=*SJA1000_ADDRESS; //读状态
288 1
289 1 if(can_temp&SJA1000_BUS_ERR) //0xc3 //检查总线状态是否有错
290 1 {
291 2 if(can_temp&SJA1000_BUS_CLOSE) //0x80 //检查是否是总线关闭状态
292 2 {
293 3 SJA1000_ADDRESS=SJA1000_INTERR; //读中断寄存器,清除总线错误中断
294 3 can_temp=*SJA1000_ADDRESS;
295 3 for(k=0;k<255;k++)
296 3 for(j=0;j<255;j++)
297 3 ;
298 3 ;
299 3 k=0;
300 3 j=0;
301 3 SJA1000_ADDRESS=SJA1000_MODEL; //指向模式寄存器
302 3 *SJA1000_ADDRESS=SJA1000_WORK_MODEL; //设置双滤波接收,进入工作模式
303 3 while(*SJA1000_ADDRESS&SJA1000_RESET_MODEL); //等待进入工作模式
C51 COMPILER V6.12 STEPBYSTEP 09/16/2007 21:44:56 PAGE 6
304 3 }
305 2 else
306 2 {
307 3 SJA1000_ADDRESS=SJA1000_INTERR; //读中断寄存器,检查中断类型
308 3 can_temp=*SJA1000_ADDRESS;
309 3
310 3
311 3 if(can_temp&SJA1000_DATA_OVER_INTERR) //0x08 //检查是否是数据溢出中断
312 3 {
313 4 SJA1000_ADDRESS=SJA1000_COMMAND; //指向命令寄存器
314 4 *SJA1000_ADDRESS=SJA1000_CLEAR_DATA_OVER; //清除数据溢出
315 4 }
316 3 else
317 3 {
318 4 if(can_temp&SJA1000_RI_INTERR) //检查是否是接收中断
319 4 {
320 5 SJA1000_ADDRESS=SJA1000_RXBUF; //指向接收数据寄存器首址
321 5 CAN_RXD_BUF[0]=*SJA1000_ADDRESS; //读RX帧信息
322 5
323 5 FF=CAN_RXD_BUF[0]&0x80; //格式
324 5 RTR=CAN_RXD_BUF[0]&0x40; //远程?
325 5 Length=CAN_RXD_BUF[0]&0x0F; //长度
326 5 if(Length>0x08)
327 5 Length=0x08;
328 5 SJA1000_ADDRESS++;
329 5 CAN_RXD_BUF[1]=*SJA1000_ADDRESS;
330 5
331 5 SJA1000_ADDRESS++;
332 5 CAN_RXD_BUF[2]=*SJA1000_ADDRESS;
333 5
334 5 if(FF)
335 5 {
336 6 SJA1000_ADDRESS++;
337 6 CAN_RXD_BUF[3]=*SJA1000_ADDRESS;
338 6 SJA1000_ADDRESS++;
339 6 CAN_RXD_BUF[4]=*SJA1000_ADDRESS;
340 6 }
341 5 for(i=0;i<Length;i++)
342 5 {
343 6 if(FF)
344 6 {
345 7 SJA1000_ADDRESS++;
346 7 CAN_RXD_BUF[i+5]=*SJA1000_ADDRESS;
347 7 }
348 6 else
349 6 {
350 7 SJA1000_ADDRESS++;
351 7 CAN_RXD_BUF[i+3]=*SJA1000_ADDRESS;
352 7 }
353 6 }
354 5 if(FF)
355 5 {
356 6 can_length=Length+5;
357 6 }
358 5 else
359 5 {
360 6 can_length=Length+3;
361 6 }
362 5
363 5 SJA1000_ADDRESS=SJA1000_COMMAND; //指向命令寄存器
364 5 *SJA1000_ADDRESS=SJA1000_RELEASE_FIFO; //释放接收缓冲器
365 5 receive_succeed=1;
C51 COMPILER V6.12 STEPBYSTEP 09/16/2007 21:44:56 PAGE 7
366 5 if(RTR)
367 5 receive_succeed=1; //置接收成功标志
368 5 }
369 4 else
370 4 {
371 5 receive_succeed=0;
372 5 SJA1000_ADDRESS=SJA1000_COMMAND; //指向命令寄存器
373 5 *SJA1000_ADDRESS=SJA1000_RELEASE_FIFO; //释放接收缓冲区
374 5 SJA1000_ADDRESS=SJA1000_ALC; //指向仲裁丢失寄存器
375 5 can_temp=*SJA1000_ADDRESS; //通过读取清除
376 5 SJA1000_ADDRESS=SJA1000_ECC; //指向错误捕捉寄存器
377 5 can_temp=*SJA1000_ADDRESS; //通过读取清除
378 5 }
379 4 }
380 3 }
381 2 }
382 1 SJA1000_ADDRESS=SJA1000_INTERR; //读中断寄存器,检查中断类型
383 1 can_temp=*SJA1000_ADDRESS;
384 1 can_temp=*SJA1000_ADDRESS;
385 1 ET1=1;
386 1 LED2=1;
387 1 }
388
389 void extern1 () interrupt 1 using 0
390 {
391 1 ;
392 1 }
393
394 void TTO () interrupt 2 using 0
395 {
396 1 TL0=0;
397 1 TH0=0;
398 1 receive_count++;
399 1 TR0=1;
400 1 return;
401 1 }
402
403 void URT_INTERR() interrupt 4 using 0
404 {
405 1 LED1=0;;
406 1 if(RI)
407 1 {
408 2 EX0=0;
409 2 RI=0;
410 2 TR0=1;
411 2 r_buf[i]=SBUF;
412 2 i++;
413 2 if(i>=r_buf[0])
414 2 {
415 3 REN=0;
416 3 i=0;
417 3 EX0=1;
418 3 }
419 2 }
420 1 if(TI)
421 1 {
422 2 EX0=0;
423 2 TI=0;
424 2 // P2=0x61;
425 2 }
426 1 LED1=1;
427 1 }
C51 COMPILER V6.12 STEPBYSTEP 09/16/2007 21:44:56 PAGE 8
428
429 void T1_Int() interrupt 3 using 0
430 {
431 1 TR1=0;
432 1 TH1=0xc0;
433 1 TL1=0xff;
434 1 SBUF=t_buf[l];
435 1 l++;
436 1 TR1=1;
437 1 }
438
439 void SetBaund()
440 {
441 1 EA=0;
442 1 TR2=0;
443 1 PCON=0x50;
444 1 T2CON=0x30;
445 1 RCAP2H=0xFF;
446 1 RCAP2L=0xE8;
447 1 SCON=0x50;
448 1 EA=1;
449 1 ACC=SBUF;
450 1 ACC=SBUF;
451 1 TR2=1;
452 1 return;
453 1 }
454
455 void MCU_SENT_TO_CAN()
456 {
457 1 unsigned char i;
458 1 CAN_TXD_BUF[0]=0x08;
459 1 for(i=1;i<11;i++)
460 1 {
461 2 CAN_TXD_BUF[i]=r_buf[i+1];
462 2 }
463 1 SJA1000_SEND();
464 1 }
465
466 void URT_SENT()
467 {
468 1 for(i=0;i<14;i++)
469 1 {
470 2 t_buf[i]=r_buf[i];
471 2 }
472 1 l=0;
473 1 i=0;
474 1 TH1=0xa0;
475 1 TL1=0x00;
476 1 ET1=1;
477 1 REN=0;
478 1 EX0=0;
479 1 ET1=1;
480 1 ES=1;
481 1 TR1=1;
482 1 while(l<t_buf[0])
483 1 ;
484 1 for(l=0;l<16;l++)
485 1 {
486 2 t_buf[l]=0;
487 2 }
488 1 l=0;
489 1 TR1=0;
C51 COMPILER V6.12 STEPBYSTEP 09/16/2007 21:44:56 PAGE 9
490 1 ET1=0;
491 1 REN=1;
492 1 EX0=1;
493 1 }
494 /*
495 void URT_SENDIN() //URT SENDING...
496 {
497 P2=0x66;
498 TI=0;
499 }*/
500
501 void checklink()
502 {
503 1 if(r_buf[1]=='L')
504 1 {
505 2 link=1;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -