├── README.md
├── bit_parse.c
├── bit_parse.h
├── can_ctl.c
├── can_ctl.h
├── sync_task.c
├── timing_task.c
└── timing_task.h
/README.md:
--------------------------------------------------------------------------------
1 | # raw_can
2 | A software implemented can bus controller.
3 | Now is run in a freescale(NXP) K60 chip, system clock is 96Mhz.
4 | The can bus can run at bitrate 20Kb.
5 | Becareful most CAN transceiver have a low bitrate limite, such as TJA1050 minimum rate 20Kb.
6 | # use
7 | It can be used to understand the principle of the CAN bus.
8 | It can be used in some applications that are cost sensitive and are not high for transmission rates, such as replacing some of the original RS485 based applications.
9 | It can be used as data transmission between multiple CPU on board, using open - out output, and not using CAN transceiver.
10 | A custom protocol based on CAN protocol can be used to communicate, increasing the complexity of the system and improving the difficulty of solving the problem.
11 |
12 | # 软件CAN控制器
13 | 这是一个软件实现的CAN控制器。
14 | 当前是运行在飞思卡尔K60处理器上,时钟96MHz。
15 | CAN速率运行在20Kb(理论上最高可以到40Kb)。
16 | 需要注意的是,很多CAN收发器有一个最低速率的限制,比如tja1050限制最低速率为20Kb。
17 | # 用处
18 | 可以用来深入理解CAN总线的原理。
19 | 可以用在一些对成本敏感,对传输速率要求不高的应用中,比如替换一些原来基于RS485的应用中。
20 | 可以用作板上多CPU之间的数据传输,使用开漏输出,不使用CAN收发器。
21 | 可以基于CAN协议自定义协议用于通讯,增加系统的复杂度,提高破解难度。
22 |
23 |
--------------------------------------------------------------------------------
/bit_parse.c:
--------------------------------------------------------------------------------
1 | #ifndef BIT_PARSE_C_
2 | #define BIT_PARSE_C_
3 | #endif
4 | #include "sf_Driver.h"
5 | #include "bit_parse.h"
6 |
7 | #pragma define_section code_in_ram ".app_code_ram" abs32 RWX
8 | #pragma section code_in_ram begin
9 |
10 | uint8 can_bit_stuff(TY_BIT_RX_PARSE *p_parse, uint8 bit_val);
11 |
12 |
13 | uint16 can_crc(uint16 crc, uint8 bit)
14 | {
15 | uint16 tmp;
16 |
17 | tmp = bit;
18 | tmp <<= 14;
19 | tmp = tmp^crc;
20 | tmp &= (1<<14);
21 | if(tmp)
22 | tmp = 0x4599;
23 | else
24 | tmp = 0x0000;
25 |
26 | crc <<= 1;
27 |
28 | crc = crc^tmp;
29 | crc &= 0x7fff;
30 |
31 | return crc;
32 | }
33 |
34 | /// 计算CAN报文的CRC
35 | /// 1、SOF不参与计算
36 | /// @param p_frame [i]接收到的CAN报文
37 | /// @retval 计算出来的CRC结果
38 | uint16 can_frame_crc(TY_CAN_FRM *p_frame)
39 | {
40 | TY_CAN_FRM tmp = *p_frame;
41 | uint16 crc=0;
42 | uint8 bit;
43 | uint8 cnt, loop;
44 |
45 | for(cnt=0; cnt<11; cnt++)
46 | {
47 | if(tmp.id & 0x10000000)
48 | {
49 | bit = 1;
50 | }
51 | else
52 | {
53 | bit = 0;
54 | }
55 | tmp.id <<= 1;
56 | crc = can_crc(crc, bit);
57 | }
58 |
59 | for(cnt=0; cnt<1; cnt++)
60 | {
61 | if(tmp.flag & F_SRR)
62 | {
63 | bit = 1;
64 | }
65 | else
66 | {
67 | bit = 0;
68 | }
69 | crc = can_crc(crc, bit);
70 | }
71 |
72 | for(cnt=0; cnt<1; cnt++)
73 | {
74 | if(tmp.flag & F_IDE)
75 | {
76 | bit = 1;
77 | }
78 | else
79 | {
80 | bit = 0;
81 | }
82 | crc = can_crc(crc, bit);
83 | }
84 |
85 | for(cnt=0; cnt<18; cnt++)
86 | {
87 | if(tmp.id & 0x10000000)
88 | {
89 | bit = 1;
90 | }
91 | else
92 | {
93 | bit = 0;
94 | }
95 | tmp.id <<= 1;
96 | crc = can_crc(crc, bit);
97 | }
98 |
99 | for(cnt=0; cnt<1; cnt++)
100 | {
101 | if(tmp.flag & F_RTR)
102 | {
103 | bit = 1;
104 | }
105 | else
106 | {
107 | bit = 0;
108 | }
109 | crc = can_crc(crc, bit);
110 | }
111 |
112 | for(cnt=0; cnt<1; cnt++)
113 | {
114 | if(tmp.flag & F_R0)
115 | {
116 | bit = 1;
117 | }
118 | else
119 | {
120 | bit = 0;
121 | }
122 | crc = can_crc(crc, bit);
123 | }
124 |
125 | for(cnt=0; cnt<1; cnt++)
126 | {
127 | if(tmp.flag & F_R1)
128 | {
129 | bit = 1;
130 | }
131 | else
132 | {
133 | bit = 0;
134 | }
135 | crc = can_crc(crc, bit);
136 | }
137 |
138 | for(cnt=0; cnt<4; cnt++)
139 | {
140 | if(tmp.len & 0x08)
141 | {
142 | bit = 1;
143 | }
144 | else
145 | {
146 | bit = 0;
147 | }
148 | tmp.len <<= 1;
149 | crc = can_crc(crc, bit);
150 | }
151 |
152 | for(cnt=0; cnt<8; cnt++)
153 | {
154 | for(loop=0; loop<8; loop++)
155 | {
156 | if(tmp.dat[cnt] & 0x80)
157 | {
158 | bit = 1;
159 | }
160 | else
161 | {
162 | bit = 0;
163 | }
164 | tmp.dat[cnt] <<= 1;
165 | crc = can_crc(crc, bit);
166 | }
167 | }
168 | return crc;
169 | }
170 |
171 | void bit_rx_parse_init(TY_BIT_RX_PARSE *p_parse)
172 | {
173 | memset(p_parse, 0, sizeof(TY_BIT_RX_PARSE));
174 | }
175 |
176 | void bit_rx_parse_rst(TY_BIT_RX_PARSE *p_parse)
177 | {
178 | p_parse->valid_bit_st = BIT_IDLE;
179 | p_parse->frm_parse_st = 0;
180 | }
181 |
182 | /// 输入若干个bit,解析出can报文,现在实际只处理一位
183 | /// 1、剔除填充位
184 | /// 2、使用状态机对有效bit流进行处理
185 | /// 3、通过返回值+p_parse结构体的信息可以得到当前解码的详细状态
186 | /// @param p_parse [io]解析器句柄
187 | /// @param p_bit [i] bit流缓冲区
188 | /// @param bit_num [i] bit数
189 | /// @param p_can_frm [o] CAN帧缓冲区
190 | /// @param p_can_frm_num [io]输入是CAN帧缓冲区的大小,输出是解码出来的CAN帧的个数
191 | /// @retval true 接收到CRC界定符(接收完毕)
192 | /// @retval false 其他情况
193 | //#define BIT_RX_PARSE_TM
194 | //#define BIT_RX_PARSE_TS
195 | bool bit_rx_parse(TY_BIT_RX_PARSE *p_parse, uint8 bit_val)
196 | {
197 | #ifdef BIT_RX_PARSE_TM
198 | uint32 stat = (p_parse->valid_bit_st<<8)+p_parse->frm_parse_st;
199 | uint32 tm_probe;
200 | #endif
201 | bool res=false;
202 |
203 | #ifdef BIT_RX_PARSE_TM
204 | tm_probe = getTimeTicks();
205 | #endif
206 |
207 | p_parse->valid_bit = 0;
208 | // remove the stuff bit
209 | switch(p_parse->valid_bit_st)
210 | {
211 | case BIT_IDLE:
212 | if(bit_val)
213 | {
214 | p_parse->frm_parse_st = 0;
215 | p_parse->valid_bit_st = BIT_IDLE;
216 | }
217 | else
218 | {
219 | p_parse->valid_bit_st = BIT_L_1;
220 | }
221 | break;
222 | case BIT_H_1: // have rx 1 bit 1
223 | if(bit_val)
224 | p_parse->valid_bit_st = BIT_H_2;
225 | else
226 | p_parse->valid_bit_st = BIT_L_1;
227 | break;
228 | case BIT_H_2:
229 | if(bit_val)
230 | p_parse->valid_bit_st = BIT_H_3;
231 | else
232 | p_parse->valid_bit_st = BIT_L_1;
233 | break;
234 | case BIT_H_3:
235 | if(bit_val)
236 | p_parse->valid_bit_st = BIT_H_4;
237 | else
238 | p_parse->valid_bit_st = BIT_L_1;
239 | break;
240 | case BIT_H_4: // have rx 4 bit 1
241 | if(bit_val)
242 | p_parse->valid_bit_st = BIT_H_5;
243 | else
244 | p_parse->valid_bit_st = BIT_L_1;
245 | break;
246 | case BIT_H_5: // have rx 5 bit 1
247 | // rx 6 bit 1 means bus in idle
248 | // rx 5 bit 1 then rx bit 0 means bit 0 is a stuff bit
249 | if(bit_val)
250 | {
251 | p_parse->error |= ERR_BIT1;
252 | p_parse->frm_parse_st = 0;
253 | p_parse->valid_bit_st = BIT_IDLE;
254 | }
255 | else
256 | {
257 | p_parse->valid_bit_st = BIT_L_1;
258 | p_parse->stf_bit = 1;
259 | #ifdef BIT_RX_PARSE_TM
260 | tm_probe = tm_probe-getTimeTicks();
261 | if(p_parse->tm_max < tm_probe)
262 | {
263 | p_parse->tm_max_stat = stat;
264 | p_parse->tm_max = tm_probe;
265 | }
266 | #endif
267 | return false;
268 | }
269 | break;
270 | case BIT_L_1:
271 | if(!bit_val)
272 | p_parse->valid_bit_st = BIT_L_2;
273 | else
274 | p_parse->valid_bit_st = BIT_H_1;
275 | break;
276 | case BIT_L_2:
277 | if(!bit_val)
278 | p_parse->valid_bit_st = BIT_L_3;
279 | else
280 | p_parse->valid_bit_st = BIT_H_1;
281 | break;
282 | case BIT_L_3:
283 | if(!bit_val)
284 | p_parse->valid_bit_st = BIT_L_4;
285 | else
286 | p_parse->valid_bit_st = BIT_H_1;
287 | break;
288 | case BIT_L_4:
289 | if(!bit_val)
290 | p_parse->valid_bit_st = BIT_L_5;
291 | else
292 | p_parse->valid_bit_st = BIT_H_1;
293 | break;
294 | case BIT_L_5:
295 | // rx 6 bit 0 means bus in error
296 | // rx 5 bit 0 then rx bit 1 means bit 1 is a stuff bit
297 | if(!bit_val)
298 | {
299 | p_parse->error |= ERR_BIT0;
300 | p_parse->frm_parse_st = 0;
301 | p_parse->valid_bit_st = BIT_L_5;
302 | }
303 | else
304 | {
305 | p_parse->valid_bit_st = BIT_H_1;
306 | p_parse->stf_bit = 1;
307 | #ifdef BIT_RX_PARSE_TM
308 | tm_probe = tm_probe-getTimeTicks();
309 | if(p_parse->tm_max < tm_probe)
310 | {
311 | p_parse->tm_max_stat = stat;
312 | p_parse->tm_max = tm_probe;
313 | }
314 | #endif
315 | return false;
316 | }
317 | break;
318 | default:
319 | p_parse->error |= ERR_SM_BIT;
320 | p_parse->frm_parse_st = 0;
321 | p_parse->valid_bit_st = BIT_IDLE;
322 | break;
323 | }
324 | p_parse->stf_bit = 0;
325 | p_parse->valid_bit = 1;
326 |
327 | switch(p_parse->frm_parse_st)
328 | {
329 | case 0:
330 | // SOF
331 | p_parse->valid_bit = 0;
332 | if(bit_val)
333 | {
334 | ;
335 | }
336 | else
337 | {
338 | p_parse->frm_parse_st = 1;
339 | }
340 | break;
341 | case 1:
342 | // EX-ID 28, BASE-ID 10
343 | p_parse->can_frm.id = 0;
344 | if(bit_val)
345 | {
346 | p_parse->can_frm.id |= 0x00000400;
347 | }
348 | else
349 | {
350 | p_parse->can_frm.id &= 0xfffffbff;
351 | }
352 | p_parse->frm_parse_st = 2;
353 | break;
354 | case 2:
355 | // EX-ID 27, BASE-ID 9
356 | if(bit_val)
357 | {
358 | p_parse->can_frm.id |= 0x00000200;
359 | }
360 | else
361 | {
362 | p_parse->can_frm.id &= 0xfffffdff;
363 | }
364 | p_parse->frm_parse_st = 3;
365 | break;
366 | case 3:
367 | // EX-ID 26, BASE-ID 8
368 | if(bit_val)
369 | {
370 | p_parse->can_frm.id |= 0x00000100;
371 | }
372 | else
373 | {
374 | p_parse->can_frm.id &= 0xfffffeff;
375 | }
376 | p_parse->frm_parse_st = 4;
377 | break;
378 | case 4:
379 | // EX-ID 25, BASE-ID 7
380 | if(bit_val)
381 | {
382 | p_parse->can_frm.id |= 0x00000080;
383 | }
384 | else
385 | {
386 | p_parse->can_frm.id &= 0xffffff7f;
387 | }
388 | p_parse->frm_parse_st = 5;
389 | break;
390 | case 5:
391 | // EX-ID 24, BASE-ID 6
392 | if(bit_val)
393 | {
394 | p_parse->can_frm.id |= 0x00000040;
395 | }
396 | else
397 | {
398 | p_parse->can_frm.id &= 0xffffffbf;
399 | }
400 | p_parse->frm_parse_st = 6;
401 | break;
402 | case 6:
403 | // EX-ID 23, BASE-ID 5
404 | if(bit_val)
405 | {
406 | p_parse->can_frm.id |= 0x00000020;
407 | }
408 | else
409 | {
410 | p_parse->can_frm.id &= 0xffffffdf;
411 | }
412 | p_parse->frm_parse_st = 7;
413 | break;
414 | case 7:
415 | // EX-ID 22, BASE-ID 4
416 | if(bit_val)
417 | {
418 | p_parse->can_frm.id |= 0x00000010;
419 | }
420 | else
421 | {
422 | p_parse->can_frm.id &= 0xffffffef;
423 | }
424 | p_parse->frm_parse_st = 8;
425 | break;
426 | case 8:
427 | // EX-ID 21, BASE-ID 3
428 | if(bit_val)
429 | {
430 | p_parse->can_frm.id |= 0x00000008;
431 | }
432 | else
433 | {
434 | p_parse->can_frm.id &= 0xfffffff7;
435 | }
436 | p_parse->frm_parse_st = 9;
437 | break;
438 | case 9:
439 | // EX-ID 20, BASE-ID 2
440 | if(bit_val)
441 | {
442 | p_parse->can_frm.id |= 0x00000004;
443 | }
444 | else
445 | {
446 | p_parse->can_frm.id &= 0xfffffffb;
447 | }
448 | p_parse->frm_parse_st = 10;
449 | break;
450 | case 10:
451 | // EX-ID 19, BASE-ID 1
452 | if(bit_val)
453 | {
454 | p_parse->can_frm.id |= 0x00000002;
455 | }
456 | else
457 | {
458 | p_parse->can_frm.id &= 0xfffffffd;
459 | }
460 | p_parse->frm_parse_st = 11;
461 | break;
462 | case 11:
463 | // EX-ID 18, BASE-ID 0
464 | if(bit_val)
465 | {
466 | p_parse->can_frm.id |= 0x00000001;
467 | }
468 | else
469 | {
470 | p_parse->can_frm.id &= 0xfffffffe;
471 | }
472 | p_parse->frm_parse_st = 12;
473 | break;
474 | case 12:
475 | // SRR
476 | if(bit_val)
477 | {
478 | p_parse->can_frm.flag |= F_SRR;
479 | }
480 | else
481 | {
482 | p_parse->can_frm.flag &= ~F_SRR;
483 | }
484 | p_parse->frm_parse_st = 13;
485 | break;
486 | case 13:
487 | // IDE
488 | if(bit_val)
489 | {
490 | p_parse->can_frm.flag |= F_IDE;
491 | p_parse->can_frm.id <<= 18;
492 | p_parse->frm_parse_st = 14;
493 | }
494 | else
495 | {
496 | p_parse->can_frm.flag &= ~F_IDE;
497 | p_parse->frm_parse_st = 32;
498 | }
499 | break;
500 | case 14:
501 | // EX-ID 17
502 | if(bit_val)
503 | {
504 | p_parse->can_frm.id |= 0x00020000;
505 | }
506 | else
507 | {
508 | p_parse->can_frm.id &= 0xfffdffff;
509 | }
510 | p_parse->frm_parse_st = 15;
511 | break;
512 | case 15:
513 | // EX-ID 16
514 | if(bit_val)
515 | {
516 | p_parse->can_frm.id |= 0x00010000;
517 | }
518 | else
519 | {
520 | p_parse->can_frm.id &= 0xfffeffff;
521 | }
522 | p_parse->frm_parse_st = 16;
523 | break;
524 | case 16:
525 | // EX-ID 15
526 | if(bit_val)
527 | {
528 | p_parse->can_frm.id |= 0x00008000;
529 | }
530 | else
531 | {
532 | p_parse->can_frm.id &= 0xffff7fff;
533 | }
534 | p_parse->frm_parse_st = 17;
535 | break;
536 | case 17:
537 | // EX-ID 14
538 | if(bit_val)
539 | {
540 | p_parse->can_frm.id |= 0x00004000;
541 | }
542 | else
543 | {
544 | p_parse->can_frm.id &= 0xffffbfff;
545 | }
546 | p_parse->frm_parse_st = 18;
547 | break;
548 | case 18:
549 | // EX-ID 13
550 | if(bit_val)
551 | {
552 | p_parse->can_frm.id |= 0x00002000;
553 | }
554 | else
555 | {
556 | p_parse->can_frm.id &= 0xffffdfff;
557 | }
558 | p_parse->frm_parse_st = 19;
559 | break;
560 | case 19:
561 | // EX-ID 12
562 | if(bit_val)
563 | {
564 | p_parse->can_frm.id |= 0x00001000;
565 | }
566 | else
567 | {
568 | p_parse->can_frm.id &= 0xffffefff;
569 | }
570 | p_parse->frm_parse_st = 20;
571 | break;
572 | case 20:
573 | // EX-ID 11
574 | if(bit_val)
575 | {
576 | p_parse->can_frm.id |= 0x00000800;
577 | }
578 | else
579 | {
580 | p_parse->can_frm.id &= 0xfffff7ff;
581 | }
582 | p_parse->frm_parse_st = 21;
583 | break;
584 | case 21:
585 | // EX-ID 10
586 | if(bit_val)
587 | {
588 | p_parse->can_frm.id |= 0x00000400;
589 | }
590 | else
591 | {
592 | p_parse->can_frm.id &= 0xfffffbff;
593 | }
594 | p_parse->frm_parse_st = 22;
595 | break;
596 | case 22:
597 | // EX-ID 9
598 | if(bit_val)
599 | {
600 | p_parse->can_frm.id |= 0x00000200;
601 | }
602 | else
603 | {
604 | p_parse->can_frm.id &= 0xfffffdff;
605 | }
606 | p_parse->frm_parse_st = 23;
607 | break;
608 | case 23:
609 | // EX-ID 8
610 | if(bit_val)
611 | {
612 | p_parse->can_frm.id |= 0x00000100;
613 | }
614 | else
615 | {
616 | p_parse->can_frm.id &= 0xfffffeff;
617 | }
618 | p_parse->frm_parse_st = 24;
619 | break;
620 | case 24:
621 | // EX-ID 7
622 | if(bit_val)
623 | {
624 | p_parse->can_frm.id |= 0x00000080;
625 | }
626 | else
627 | {
628 | p_parse->can_frm.id &= 0xffffff7f;
629 | }
630 | p_parse->frm_parse_st = 25;
631 | break;
632 | case 25:
633 | // EX-ID 6
634 | if(bit_val)
635 | {
636 | p_parse->can_frm.id |= 0x00000040;
637 | }
638 | else
639 | {
640 | p_parse->can_frm.id &= 0xffffffbf;
641 | }
642 | p_parse->frm_parse_st = 26;
643 | break;
644 | case 26:
645 | // EX-ID 5
646 | if(bit_val)
647 | {
648 | p_parse->can_frm.id |= 0x00000020;
649 | }
650 | else
651 | {
652 | p_parse->can_frm.id &= 0xffffffdf;
653 | }
654 | p_parse->frm_parse_st = 27;
655 | break;
656 | case 27:
657 | // EX-ID 4
658 | if(bit_val)
659 | {
660 | p_parse->can_frm.id |= 0x00000010;
661 | }
662 | else
663 | {
664 | p_parse->can_frm.id &= 0xffffffef;
665 | }
666 | p_parse->frm_parse_st = 28;
667 | break;
668 | case 28:
669 | // EX-ID 3
670 | if(bit_val)
671 | {
672 | p_parse->can_frm.id |= 0x00000008;
673 | }
674 | else
675 | {
676 | p_parse->can_frm.id &= 0xfffffff7;
677 | }
678 | p_parse->frm_parse_st = 29;
679 | break;
680 | case 29:
681 | // EX-ID 2
682 | if(bit_val)
683 | {
684 | p_parse->can_frm.id |= 0x00000004;
685 | }
686 | else
687 | {
688 | p_parse->can_frm.id &= 0xfffffffb;
689 | }
690 | p_parse->frm_parse_st = 30;
691 | break;
692 | case 30:
693 | // EX-ID 1
694 | if(bit_val)
695 | {
696 | p_parse->can_frm.id |= 0x00000002;
697 | }
698 | else
699 | {
700 | p_parse->can_frm.id &= 0xfffffffd;
701 | }
702 | p_parse->frm_parse_st = 31;
703 | break;
704 | case 31:
705 | // EX-ID 0
706 | if(bit_val)
707 | {
708 | p_parse->can_frm.id |= 0x00000001;
709 | }
710 | else
711 | {
712 | p_parse->can_frm.id &= 0xfffffffe;
713 | }
714 | p_parse->frm_parse_st = 32;
715 | break;
716 | case 32:
717 | // F_RTR
718 | if(bit_val)
719 | {
720 | p_parse->can_frm.flag |= F_RTR;
721 | }
722 | else
723 | {
724 | p_parse->can_frm.flag &= ~F_RTR;
725 | }
726 | p_parse->frm_parse_st = 33;
727 | break;
728 | case 33:
729 | // F_R0
730 | if(bit_val)
731 | {
732 | p_parse->can_frm.flag |= F_R0;
733 | }
734 | else
735 | {
736 | p_parse->can_frm.flag &= ~F_R0;
737 | }
738 | p_parse->frm_parse_st = 34;
739 | break;
740 | case 34:
741 | // F_R1
742 | if(bit_val)
743 | {
744 | p_parse->can_frm.flag |= F_R1;
745 | }
746 | else
747 | {
748 | p_parse->can_frm.flag &= ~F_R1;
749 | }
750 | p_parse->frm_parse_st = 35;
751 | break;
752 | case 35:
753 | // LEN bit 3
754 | p_parse->can_frm.len = 0;
755 | if(bit_val)
756 | {
757 | p_parse->can_frm.len |= 0x08;
758 | }
759 | else
760 | {
761 | p_parse->can_frm.len &= 0xf7;
762 | }
763 | p_parse->frm_parse_st = 36;
764 | break;
765 | case 36:
766 | // LEN bit 2
767 | if(bit_val)
768 | {
769 | p_parse->can_frm.len |= 0x04;
770 | }
771 | else
772 | {
773 | p_parse->can_frm.len &= 0xfb;
774 | }
775 | p_parse->frm_parse_st = 37;
776 | break;
777 | case 37:
778 | // LEN bit 1
779 | if(bit_val)
780 | {
781 | p_parse->can_frm.len |= 0x02;
782 | }
783 | else
784 | {
785 | p_parse->can_frm.len &= 0xfd;
786 | }
787 | p_parse->frm_parse_st = 38;
788 | break;
789 | case 38:
790 | // LEN bit 0
791 | if(bit_val)
792 | {
793 | p_parse->can_frm.len |= 0x01;
794 | }
795 | else
796 | {
797 | p_parse->can_frm.len &= 0xfe;
798 | }
799 | if(0 == p_parse->can_frm.len)
800 | {
801 | p_parse->frm_parse_st = 103;
802 | }
803 | else if(8 >= p_parse->can_frm.len)
804 | {
805 | p_parse->frm_parse_st = 39;
806 | }
807 | else
808 | {
809 | p_parse->frm_parse_st = 0;
810 | }
811 | break;
812 | case 39:
813 | // DATA 0 bit 7
814 | if(bit_val)
815 | {
816 | p_parse->can_frm.dat[0] |= 0x80;
817 | }
818 | else
819 | {
820 | p_parse->can_frm.dat[0] &= 0x7f;
821 | }
822 | p_parse->frm_parse_st = 40;
823 | break;
824 | case 40:
825 | // DATA 0 bit 6
826 | if(bit_val)
827 | {
828 | p_parse->can_frm.dat[0] |= 0x40;
829 | }
830 | else
831 | {
832 | p_parse->can_frm.dat[0] &= 0xbf;
833 | }
834 | p_parse->frm_parse_st = 41;
835 | break;
836 | case 41:
837 | // DATA 0 bit 5
838 | if(bit_val)
839 | {
840 | p_parse->can_frm.dat[0] |= 0x20;
841 | }
842 | else
843 | {
844 | p_parse->can_frm.dat[0] &= 0xdf;
845 | }
846 | p_parse->frm_parse_st = 42;
847 | break;
848 | case 42:
849 | // DATA 0 bit 4
850 | if(bit_val)
851 | {
852 | p_parse->can_frm.dat[0] |= 0x10;
853 | }
854 | else
855 | {
856 | p_parse->can_frm.dat[0] &= 0xef;
857 | }
858 | p_parse->frm_parse_st = 43;
859 | break;
860 | case 43:
861 | // DATA 0 bit 3
862 | if(bit_val)
863 | {
864 | p_parse->can_frm.dat[0] |= 0x08;
865 | }
866 | else
867 | {
868 | p_parse->can_frm.dat[0] &= 0xf7;
869 | }
870 | p_parse->frm_parse_st = 44;
871 | break;
872 | case 44:
873 | // DATA 0 bit 2
874 | if(bit_val)
875 | {
876 | p_parse->can_frm.dat[0] |= 0x04;
877 | }
878 | else
879 | {
880 | p_parse->can_frm.dat[0] &= 0xfb;
881 | }
882 | p_parse->frm_parse_st = 45;
883 | break;
884 | case 45:
885 | // DATA 0 bit 1
886 | if(bit_val)
887 | {
888 | p_parse->can_frm.dat[0] |= 0x02;
889 | }
890 | else
891 | {
892 | p_parse->can_frm.dat[0] &= 0xfd;
893 | }
894 | p_parse->frm_parse_st = 46;
895 | break;
896 | case 46:
897 | // DATA 0 bit 0
898 | if(bit_val)
899 | {
900 | p_parse->can_frm.dat[0] |= 0x01;
901 | }
902 | else
903 | {
904 | p_parse->can_frm.dat[0] &= 0xfe;
905 | }
906 | if(p_parse->can_frm.len > 1)
907 | {
908 | p_parse->frm_parse_st = 47;
909 | }
910 | else
911 | {
912 | p_parse->frm_parse_st = 103;
913 | }
914 | break;
915 | case 47:
916 | // DATA 1 bit 7
917 | if(bit_val)
918 | {
919 | p_parse->can_frm.dat[1] |= 0x80;
920 | }
921 | else
922 | {
923 | p_parse->can_frm.dat[1] &= 0x7f;
924 | }
925 | p_parse->frm_parse_st = 48;
926 | break;
927 | case 48:
928 | // DATA 1 bit 6
929 | if(bit_val)
930 | {
931 | p_parse->can_frm.dat[1] |= 0x40;
932 | }
933 | else
934 | {
935 | p_parse->can_frm.dat[1] &= 0xbf;
936 | }
937 | p_parse->frm_parse_st = 49;
938 | break;
939 | case 49:
940 | // DATA 1 bit 5
941 | if(bit_val)
942 | {
943 | p_parse->can_frm.dat[1] |= 0x20;
944 | }
945 | else
946 | {
947 | p_parse->can_frm.dat[1] &= 0xdf;
948 | }
949 | p_parse->frm_parse_st = 50;
950 | break;
951 | case 50:
952 | // DATA 1 bit 4
953 | if(bit_val)
954 | {
955 | p_parse->can_frm.dat[1] |= 0x10;
956 | }
957 | else
958 | {
959 | p_parse->can_frm.dat[1] &= 0xef;
960 | }
961 | p_parse->frm_parse_st = 51;
962 | break;
963 | case 51:
964 | // DATA 1 bit 3
965 | if(bit_val)
966 | {
967 | p_parse->can_frm.dat[1] |= 0x08;
968 | }
969 | else
970 | {
971 | p_parse->can_frm.dat[1] &= 0xf7;
972 | }
973 | p_parse->frm_parse_st = 52;
974 | break;
975 | case 52:
976 | // DATA 1 bit 2
977 | if(bit_val)
978 | {
979 | p_parse->can_frm.dat[1] |= 0x04;
980 | }
981 | else
982 | {
983 | p_parse->can_frm.dat[1] &= 0xfb;
984 | }
985 | p_parse->frm_parse_st = 53;
986 | break;
987 | case 53:
988 | // DATA 1 bit 1
989 | if(bit_val)
990 | {
991 | p_parse->can_frm.dat[1] |= 0x02;
992 | }
993 | else
994 | {
995 | p_parse->can_frm.dat[1] &= 0xfd;
996 | }
997 | p_parse->frm_parse_st = 54;
998 | break;
999 | case 54:
1000 | // DATA 1 bit 0
1001 | if(bit_val)
1002 | {
1003 | p_parse->can_frm.dat[1] |= 0x01;
1004 | }
1005 | else
1006 | {
1007 | p_parse->can_frm.dat[1] &= 0xfe;
1008 | }
1009 | if(p_parse->can_frm.len > 2)
1010 | {
1011 | p_parse->frm_parse_st = 55;
1012 | }
1013 | else
1014 | {
1015 | p_parse->frm_parse_st = 103;
1016 | }
1017 | break;
1018 | case 55:
1019 | // DATA 2 bit 7
1020 | if(bit_val)
1021 | {
1022 | p_parse->can_frm.dat[2] |= 0x80;
1023 | }
1024 | else
1025 | {
1026 | p_parse->can_frm.dat[2] &= 0x7f;
1027 | }
1028 | p_parse->frm_parse_st = 56;
1029 | break;
1030 | case 56:
1031 | // DATA 2 bit 6
1032 | if(bit_val)
1033 | {
1034 | p_parse->can_frm.dat[2] |= 0x40;
1035 | }
1036 | else
1037 | {
1038 | p_parse->can_frm.dat[2] &= 0xbf;
1039 | }
1040 | p_parse->frm_parse_st = 57;
1041 | break;
1042 | case 57:
1043 | // DATA 2 bit 5
1044 | if(bit_val)
1045 | {
1046 | p_parse->can_frm.dat[2] |= 0x20;
1047 | }
1048 | else
1049 | {
1050 | p_parse->can_frm.dat[2] &= 0xdf;
1051 | }
1052 | p_parse->frm_parse_st = 58;
1053 | break;
1054 | case 58:
1055 | // DATA 2 bit 4
1056 | if(bit_val)
1057 | {
1058 | p_parse->can_frm.dat[2] |= 0x10;
1059 | }
1060 | else
1061 | {
1062 | p_parse->can_frm.dat[2] &= 0xef;
1063 | }
1064 | p_parse->frm_parse_st = 59;
1065 | break;
1066 | case 59:
1067 | // DATA 2 bit 3
1068 | if(bit_val)
1069 | {
1070 | p_parse->can_frm.dat[2] |= 0x08;
1071 | }
1072 | else
1073 | {
1074 | p_parse->can_frm.dat[2] &= 0xf7;
1075 | }
1076 | p_parse->frm_parse_st = 60;
1077 | break;
1078 | case 60:
1079 | // DATA 2 bit 2
1080 | if(bit_val)
1081 | {
1082 | p_parse->can_frm.dat[2] |= 0x04;
1083 | }
1084 | else
1085 | {
1086 | p_parse->can_frm.dat[2] &= 0xfb;
1087 | }
1088 | p_parse->frm_parse_st = 61;
1089 | break;
1090 | case 61:
1091 | // DATA 2 bit 1
1092 | if(bit_val)
1093 | {
1094 | p_parse->can_frm.dat[2] |= 0x02;
1095 | }
1096 | else
1097 | {
1098 | p_parse->can_frm.dat[2] &= 0xfd;
1099 | }
1100 | p_parse->frm_parse_st = 62;
1101 | break;
1102 | case 62:
1103 | // DATA 2 bit 0
1104 | if(bit_val)
1105 | {
1106 | p_parse->can_frm.dat[2] |= 0x01;
1107 | }
1108 | else
1109 | {
1110 | p_parse->can_frm.dat[2] &= 0xfe;
1111 | }
1112 | if(p_parse->can_frm.len > 3)
1113 | {
1114 | p_parse->frm_parse_st = 63;
1115 | }
1116 | else
1117 | {
1118 | p_parse->frm_parse_st = 103;
1119 | }
1120 | break;
1121 | case 63:
1122 | // DATA 3 bit 7
1123 | if(bit_val)
1124 | {
1125 | p_parse->can_frm.dat[3] |= 0x80;
1126 | }
1127 | else
1128 | {
1129 | p_parse->can_frm.dat[3] &= 0x7f;
1130 | }
1131 | p_parse->frm_parse_st = 64;
1132 | break;
1133 | case 64:
1134 | // DATA 3 bit 6
1135 | if(bit_val)
1136 | {
1137 | p_parse->can_frm.dat[3] |= 0x40;
1138 | }
1139 | else
1140 | {
1141 | p_parse->can_frm.dat[3] &= 0xbf;
1142 | }
1143 | p_parse->frm_parse_st = 65;
1144 | break;
1145 | case 65:
1146 | // DATA 3 bit 5
1147 | if(bit_val)
1148 | {
1149 | p_parse->can_frm.dat[3] |= 0x20;
1150 | }
1151 | else
1152 | {
1153 | p_parse->can_frm.dat[3] &= 0xdf;
1154 | }
1155 | p_parse->frm_parse_st = 66;
1156 | break;
1157 | case 66:
1158 | // DATA 3 bit 4
1159 | if(bit_val)
1160 | {
1161 | p_parse->can_frm.dat[3] |= 0x10;
1162 | }
1163 | else
1164 | {
1165 | p_parse->can_frm.dat[3] &= 0xef;
1166 | }
1167 | p_parse->frm_parse_st = 67;
1168 | break;
1169 | case 67:
1170 | // DATA 3 bit 3
1171 | if(bit_val)
1172 | {
1173 | p_parse->can_frm.dat[3] |= 0x08;
1174 | }
1175 | else
1176 | {
1177 | p_parse->can_frm.dat[3] &= 0xf7;
1178 | }
1179 | p_parse->frm_parse_st = 68;
1180 | break;
1181 | case 68:
1182 | // DATA 3 bit 2
1183 | if(bit_val)
1184 | {
1185 | p_parse->can_frm.dat[3] |= 0x04;
1186 | }
1187 | else
1188 | {
1189 | p_parse->can_frm.dat[3] &= 0xfb;
1190 | }
1191 | p_parse->frm_parse_st = 69;
1192 | break;
1193 | case 69:
1194 | // DATA 3 bit 1
1195 | if(bit_val)
1196 | {
1197 | p_parse->can_frm.dat[3] |= 0x02;
1198 | }
1199 | else
1200 | {
1201 | p_parse->can_frm.dat[3] &= 0xfd;
1202 | }
1203 | p_parse->frm_parse_st = 70;
1204 | break;
1205 | case 70:
1206 | // DATA 3 bit 0
1207 | if(bit_val)
1208 | {
1209 | p_parse->can_frm.dat[3] |= 0x01;
1210 | }
1211 | else
1212 | {
1213 | p_parse->can_frm.dat[3] &= 0xfe;
1214 | }
1215 | if(p_parse->can_frm.len > 4)
1216 | {
1217 | p_parse->frm_parse_st = 71;
1218 | }
1219 | else
1220 | {
1221 | p_parse->frm_parse_st = 103;
1222 | }
1223 | break;
1224 | case 71:
1225 | // DATA 4 bit 7
1226 | if(bit_val)
1227 | {
1228 | p_parse->can_frm.dat[4] |= 0x80;
1229 | }
1230 | else
1231 | {
1232 | p_parse->can_frm.dat[4] &= 0x7f;
1233 | }
1234 | p_parse->frm_parse_st = 72;
1235 | break;
1236 | case 72:
1237 | // DATA 4 bit 6
1238 | if(bit_val)
1239 | {
1240 | p_parse->can_frm.dat[4] |= 0x40;
1241 | }
1242 | else
1243 | {
1244 | p_parse->can_frm.dat[4] &= 0xbf;
1245 | }
1246 | p_parse->frm_parse_st = 73;
1247 | break;
1248 | case 73:
1249 | // DATA 4 bit 5
1250 | if(bit_val)
1251 | {
1252 | p_parse->can_frm.dat[4] |= 0x20;
1253 | }
1254 | else
1255 | {
1256 | p_parse->can_frm.dat[4] &= 0xdf;
1257 | }
1258 | p_parse->frm_parse_st = 74;
1259 | break;
1260 | case 74:
1261 | // DATA 4 bit 4
1262 | if(bit_val)
1263 | {
1264 | p_parse->can_frm.dat[4] |= 0x10;
1265 | }
1266 | else
1267 | {
1268 | p_parse->can_frm.dat[4] &= 0xef;
1269 | }
1270 | p_parse->frm_parse_st = 75;
1271 | break;
1272 | case 75:
1273 | // DATA 4 bit 3
1274 | if(bit_val)
1275 | {
1276 | p_parse->can_frm.dat[4] |= 0x08;
1277 | }
1278 | else
1279 | {
1280 | p_parse->can_frm.dat[4] &= 0xf7;
1281 | }
1282 | p_parse->frm_parse_st = 76;
1283 | break;
1284 | case 76:
1285 | // DATA 4 bit 2
1286 | if(bit_val)
1287 | {
1288 | p_parse->can_frm.dat[4] |= 0x04;
1289 | }
1290 | else
1291 | {
1292 | p_parse->can_frm.dat[4] &= 0xfb;
1293 | }
1294 | p_parse->frm_parse_st = 77;
1295 | break;
1296 | case 77:
1297 | // DATA 4 bit 1
1298 | if(bit_val)
1299 | {
1300 | p_parse->can_frm.dat[4] |= 0x02;
1301 | }
1302 | else
1303 | {
1304 | p_parse->can_frm.dat[4] &= 0xfd;
1305 | }
1306 | p_parse->frm_parse_st = 78;
1307 | break;
1308 | case 78:
1309 | // DATA 4 bit 0
1310 | if(bit_val)
1311 | {
1312 | p_parse->can_frm.dat[4] |= 0x01;
1313 | }
1314 | else
1315 | {
1316 | p_parse->can_frm.dat[4] &= 0xfe;
1317 | }
1318 | if(p_parse->can_frm.len > 5)
1319 | {
1320 | p_parse->frm_parse_st = 79;
1321 | }
1322 | else
1323 | {
1324 | p_parse->frm_parse_st = 103;
1325 | }
1326 | break;
1327 | case 79:
1328 | // DATA 5 bit 7
1329 | if(bit_val)
1330 | {
1331 | p_parse->can_frm.dat[5] |= 0x80;
1332 | }
1333 | else
1334 | {
1335 | p_parse->can_frm.dat[5] &= 0x7f;
1336 | }
1337 | p_parse->frm_parse_st = 80;
1338 | break;
1339 | case 80:
1340 | // DATA 5 bit 6
1341 | if(bit_val)
1342 | {
1343 | p_parse->can_frm.dat[5] |= 0x40;
1344 | }
1345 | else
1346 | {
1347 | p_parse->can_frm.dat[5] &= 0xbf;
1348 | }
1349 | p_parse->frm_parse_st = 81;
1350 | break;
1351 | case 81:
1352 | // DATA 5 bit 5
1353 | if(bit_val)
1354 | {
1355 | p_parse->can_frm.dat[5] |= 0x20;
1356 | }
1357 | else
1358 | {
1359 | p_parse->can_frm.dat[5] &= 0xdf;
1360 | }
1361 | p_parse->frm_parse_st = 82;
1362 | break;
1363 | case 82:
1364 | // DATA 5 bit 4
1365 | if(bit_val)
1366 | {
1367 | p_parse->can_frm.dat[5] |= 0x10;
1368 | }
1369 | else
1370 | {
1371 | p_parse->can_frm.dat[5] &= 0xef;
1372 | }
1373 | p_parse->frm_parse_st = 83;
1374 | break;
1375 | case 83:
1376 | // DATA 5 bit 3
1377 | if(bit_val)
1378 | {
1379 | p_parse->can_frm.dat[5] |= 0x08;
1380 | }
1381 | else
1382 | {
1383 | p_parse->can_frm.dat[5] &= 0xf7;
1384 | }
1385 | p_parse->frm_parse_st = 84;
1386 | break;
1387 | case 84:
1388 | // DATA 5 bit 2
1389 | if(bit_val)
1390 | {
1391 | p_parse->can_frm.dat[5] |= 0x04;
1392 | }
1393 | else
1394 | {
1395 | p_parse->can_frm.dat[5] &= 0xfb;
1396 | }
1397 | p_parse->frm_parse_st = 85;
1398 | break;
1399 | case 85:
1400 | // DATA 5 bit 1
1401 | if(bit_val)
1402 | {
1403 | p_parse->can_frm.dat[5] |= 0x02;
1404 | }
1405 | else
1406 | {
1407 | p_parse->can_frm.dat[5] &= 0xfd;
1408 | }
1409 | p_parse->frm_parse_st = 86;
1410 | break;
1411 | case 86:
1412 | // DATA 5 bit 0
1413 | if(bit_val)
1414 | {
1415 | p_parse->can_frm.dat[5] |= 0x01;
1416 | }
1417 | else
1418 | {
1419 | p_parse->can_frm.dat[5] &= 0xfe;
1420 | }
1421 | if(p_parse->can_frm.len > 6)
1422 | {
1423 | p_parse->frm_parse_st = 87;
1424 | }
1425 | else
1426 | {
1427 | p_parse->frm_parse_st = 103;
1428 | }
1429 | break;
1430 | case 87:
1431 | // DATA 6 bit 7
1432 | if(bit_val)
1433 | {
1434 | p_parse->can_frm.dat[6] |= 0x80;
1435 | }
1436 | else
1437 | {
1438 | p_parse->can_frm.dat[6] &= 0x7f;
1439 | }
1440 | p_parse->frm_parse_st = 88;
1441 | break;
1442 | case 88:
1443 | // DATA 6 bit 6
1444 | if(bit_val)
1445 | {
1446 | p_parse->can_frm.dat[6] |= 0x40;
1447 | }
1448 | else
1449 | {
1450 | p_parse->can_frm.dat[6] &= 0xbf;
1451 | }
1452 | p_parse->frm_parse_st = 89;
1453 | break;
1454 | case 89:
1455 | // DATA 6 bit 5
1456 | if(bit_val)
1457 | {
1458 | p_parse->can_frm.dat[6] |= 0x20;
1459 | }
1460 | else
1461 | {
1462 | p_parse->can_frm.dat[6] &= 0xdf;
1463 | }
1464 | p_parse->frm_parse_st = 90;
1465 | break;
1466 | case 90:
1467 | // DATA 6 bit 4
1468 | if(bit_val)
1469 | {
1470 | p_parse->can_frm.dat[6] |= 0x10;
1471 | }
1472 | else
1473 | {
1474 | p_parse->can_frm.dat[6] &= 0xef;
1475 | }
1476 | p_parse->frm_parse_st = 91;
1477 | break;
1478 | case 91:
1479 | // DATA 6 bit 3
1480 | if(bit_val)
1481 | {
1482 | p_parse->can_frm.dat[6] |= 0x08;
1483 | }
1484 | else
1485 | {
1486 | p_parse->can_frm.dat[6] &= 0xf7;
1487 | }
1488 | p_parse->frm_parse_st = 92;
1489 | break;
1490 | case 92:
1491 | // DATA 6 bit 2
1492 | if(bit_val)
1493 | {
1494 | p_parse->can_frm.dat[6] |= 0x04;
1495 | }
1496 | else
1497 | {
1498 | p_parse->can_frm.dat[6] &= 0xfb;
1499 | }
1500 | p_parse->frm_parse_st = 93;
1501 | break;
1502 | case 93:
1503 | // DATA 6 bit 1
1504 | if(bit_val)
1505 | {
1506 | p_parse->can_frm.dat[6] |= 0x02;
1507 | }
1508 | else
1509 | {
1510 | p_parse->can_frm.dat[6] &= 0xfd;
1511 | }
1512 | p_parse->frm_parse_st = 94;
1513 | break;
1514 | case 94:
1515 | // DATA 6 bit 0
1516 | if(bit_val)
1517 | {
1518 | p_parse->can_frm.dat[6] |= 0x01;
1519 | }
1520 | else
1521 | {
1522 | p_parse->can_frm.dat[6] &= 0xfe;
1523 | }
1524 | if(p_parse->can_frm.len > 7)
1525 | {
1526 | p_parse->frm_parse_st = 95;
1527 | }
1528 | else
1529 | {
1530 | p_parse->frm_parse_st = 103;
1531 | }
1532 | break;
1533 | case 95:
1534 | // DATA 7 bit 7
1535 | if(bit_val)
1536 | {
1537 | p_parse->can_frm.dat[7] |= 0x80;
1538 | }
1539 | else
1540 | {
1541 | p_parse->can_frm.dat[7] &= 0x7f;
1542 | }
1543 | p_parse->frm_parse_st = 96;
1544 | break;
1545 | case 96:
1546 | // DATA 7 bit 6
1547 | if(bit_val)
1548 | {
1549 | p_parse->can_frm.dat[7] |= 0x40;
1550 | }
1551 | else
1552 | {
1553 | p_parse->can_frm.dat[7] &= 0xbf;
1554 | }
1555 | p_parse->frm_parse_st = 97;
1556 | break;
1557 | case 97:
1558 | // DATA 7 bit 5
1559 | if(bit_val)
1560 | {
1561 | p_parse->can_frm.dat[7] |= 0x20;
1562 | }
1563 | else
1564 | {
1565 | p_parse->can_frm.dat[7] &= 0xdf;
1566 | }
1567 | p_parse->frm_parse_st = 98;
1568 | break;
1569 | case 98:
1570 | // DATA 7 bit 4
1571 | if(bit_val)
1572 | {
1573 | p_parse->can_frm.dat[7] |= 0x10;
1574 | }
1575 | else
1576 | {
1577 | p_parse->can_frm.dat[7] &= 0xef;
1578 | }
1579 | p_parse->frm_parse_st = 99;
1580 | break;
1581 | case 99:
1582 | // DATA 7 bit 3
1583 | if(bit_val)
1584 | {
1585 | p_parse->can_frm.dat[7] |= 0x08;
1586 | }
1587 | else
1588 | {
1589 | p_parse->can_frm.dat[7] &= 0xf7;
1590 | }
1591 | p_parse->frm_parse_st = 100;
1592 | break;
1593 | case 100:
1594 | // DATA 7 bit 2
1595 | if(bit_val)
1596 | {
1597 | p_parse->can_frm.dat[7] |= 0x04;
1598 | }
1599 | else
1600 | {
1601 | p_parse->can_frm.dat[7] &= 0xfb;
1602 | }
1603 | p_parse->frm_parse_st = 101;
1604 | break;
1605 | case 101:
1606 | // DATA 7 bit 1
1607 | if(bit_val)
1608 | {
1609 | p_parse->can_frm.dat[7] |= 0x02;
1610 | }
1611 | else
1612 | {
1613 | p_parse->can_frm.dat[7] &= 0xfd;
1614 | }
1615 | p_parse->frm_parse_st = 102;
1616 | break;
1617 | case 102:
1618 | // DATA 7 bit 0
1619 | if(bit_val)
1620 | {
1621 | p_parse->can_frm.dat[7] |= 0x01;
1622 | }
1623 | else
1624 | {
1625 | p_parse->can_frm.dat[7] &= 0xfe;
1626 | }
1627 | if(p_parse->can_frm.len > 8)
1628 | {
1629 | p_parse->frm_parse_st = 103;
1630 | }
1631 | else
1632 | {
1633 | p_parse->frm_parse_st = 103;
1634 | }
1635 | break;
1636 | case 103:
1637 | // CRC bit 14
1638 | p_parse->can_frm.crc = 0;
1639 | p_parse->valid_bit = 0;
1640 | if(bit_val)
1641 | {
1642 | p_parse->can_frm.crc |= 0x4000;
1643 | }
1644 | else
1645 | {
1646 | p_parse->can_frm.crc &= 0xbfff;
1647 | }
1648 | p_parse->frm_parse_st = 104;
1649 | break;
1650 | case 104:
1651 | // CRC bit 13
1652 | p_parse->valid_bit = 0;
1653 | if(bit_val)
1654 | {
1655 | p_parse->can_frm.crc |= 0x2000;
1656 | }
1657 | else
1658 | {
1659 | p_parse->can_frm.crc &= 0xdfff;
1660 | }
1661 | p_parse->frm_parse_st = 105;
1662 | break;
1663 | case 105:
1664 | // CRC bit 12
1665 | p_parse->valid_bit = 0;
1666 | if(bit_val)
1667 | {
1668 | p_parse->can_frm.crc |= 0x1000;
1669 | }
1670 | else
1671 | {
1672 | p_parse->can_frm.crc &= 0xefff;
1673 | }
1674 | p_parse->frm_parse_st = 106;
1675 | break;
1676 | case 106:
1677 | // CRC bit 11
1678 | p_parse->valid_bit = 0;
1679 | if(bit_val)
1680 | {
1681 | p_parse->can_frm.crc |= 0x800;
1682 | }
1683 | else
1684 | {
1685 | p_parse->can_frm.crc &= 0xf7ff;
1686 | }
1687 | p_parse->frm_parse_st = 107;
1688 | break;
1689 | case 107:
1690 | // CRC bit 10
1691 | p_parse->valid_bit = 0;
1692 | if(bit_val)
1693 | {
1694 | p_parse->can_frm.crc |= 0x400;
1695 | }
1696 | else
1697 | {
1698 | p_parse->can_frm.crc &= 0xfbff;
1699 | }
1700 | p_parse->frm_parse_st = 108;
1701 | break;
1702 | case 108:
1703 | // CRC bit 9
1704 | p_parse->valid_bit = 0;
1705 | if(bit_val)
1706 | {
1707 | p_parse->can_frm.crc |= 0x200;
1708 | }
1709 | else
1710 | {
1711 | p_parse->can_frm.crc &= 0xfdff;
1712 | }
1713 | p_parse->frm_parse_st = 109;
1714 | break;
1715 | case 109:
1716 | // CRC bit 8
1717 | p_parse->valid_bit = 0;
1718 | if(bit_val)
1719 | {
1720 | p_parse->can_frm.crc |= 0x100;
1721 | }
1722 | else
1723 | {
1724 | p_parse->can_frm.crc &= 0xfeff;
1725 | }
1726 | p_parse->frm_parse_st = 110;
1727 | break;
1728 | case 110:
1729 | // CRC bit 7
1730 | p_parse->valid_bit = 0;
1731 | if(bit_val)
1732 | {
1733 | p_parse->can_frm.crc |= 0x80;
1734 | }
1735 | else
1736 | {
1737 | p_parse->can_frm.crc &= 0xff7f;
1738 | }
1739 | p_parse->frm_parse_st = 111;
1740 | break;
1741 | case 111:
1742 | // CRC bit 6
1743 | p_parse->valid_bit = 0;
1744 | if(bit_val)
1745 | {
1746 | p_parse->can_frm.crc |= 0x40;
1747 | }
1748 | else
1749 | {
1750 | p_parse->can_frm.crc &= 0xffbf;
1751 | }
1752 | p_parse->frm_parse_st = 112;
1753 | break;
1754 | case 112:
1755 | // CRC bit 5
1756 | p_parse->valid_bit = 0;
1757 | if(bit_val)
1758 | {
1759 | p_parse->can_frm.crc |= 0x20;
1760 | }
1761 | else
1762 | {
1763 | p_parse->can_frm.crc &= 0xffdf;
1764 | }
1765 | p_parse->frm_parse_st = 113;
1766 | break;
1767 | case 113:
1768 | // CRC bit 4
1769 | p_parse->valid_bit = 0;
1770 | if(bit_val)
1771 | {
1772 | p_parse->can_frm.crc |= 0x10;
1773 | }
1774 | else
1775 | {
1776 | p_parse->can_frm.crc &= 0xffef;
1777 | }
1778 | p_parse->frm_parse_st = 114;
1779 | break;
1780 | case 114:
1781 | // CRC bit 3
1782 | p_parse->valid_bit = 0;
1783 | if(bit_val)
1784 | {
1785 | p_parse->can_frm.crc |= 0x08;
1786 | }
1787 | else
1788 | {
1789 | p_parse->can_frm.crc &= 0xfff7;
1790 | }
1791 | p_parse->frm_parse_st = 115;
1792 | break;
1793 | case 115:
1794 | // CRC bit 2
1795 | p_parse->valid_bit = 0;
1796 | if(bit_val)
1797 | {
1798 | p_parse->can_frm.crc |= 0x04;
1799 | }
1800 | else
1801 | {
1802 | p_parse->can_frm.crc &= 0xfffb;
1803 | }
1804 | p_parse->frm_parse_st = 116;
1805 | break;
1806 | case 116:
1807 | // CRC bit 1
1808 | p_parse->valid_bit = 0;
1809 | if(bit_val)
1810 | {
1811 | p_parse->can_frm.crc |= 0x02;
1812 | }
1813 | else
1814 | {
1815 | p_parse->can_frm.crc &= 0xfffd;
1816 | }
1817 | p_parse->frm_parse_st = 117;
1818 | break;
1819 | case 117:
1820 | // CRC bit 0
1821 | p_parse->valid_bit = 0;
1822 | if(bit_val)
1823 | {
1824 | p_parse->can_frm.crc |= 0x01;
1825 | }
1826 | else
1827 | {
1828 | p_parse->can_frm.crc &= 0xfffe;
1829 | }
1830 | p_parse->frm_parse_st = 118;
1831 | break;
1832 | case 118:
1833 | // CRC GAP bit
1834 | p_parse->valid_bit = 0;
1835 | if(bit_val)
1836 | {
1837 | p_parse->can_frm.flag |= F_CRC_GAP;
1838 | }
1839 | else
1840 | {
1841 | p_parse->can_frm.flag &= ~F_CRC_GAP;
1842 | }
1843 | res = true;
1844 | p_parse->valid_bit_st = 0;
1845 | p_parse->frm_parse_st = 0;
1846 | break;
1847 | default:
1848 | p_parse->error |= ERR_SM_FRM;
1849 | p_parse->valid_bit_st = 0;
1850 | p_parse->frm_parse_st = 0;
1851 | break;
1852 | }
1853 | #ifdef BIT_RX_PARSE_TM
1854 | tm_probe = tm_probe-getTimeTicks();
1855 | if(p_parse->tm_max < tm_probe)
1856 | {
1857 | p_parse->tm_max_stat = stat;
1858 | p_parse->tm_max = tm_probe;
1859 | }
1860 | #endif
1861 | return res;
1862 | }
1863 |
1864 |
1865 | void bit_tx_parse_init(TY_BIT_TX_PARSE *p_parse)
1866 | {
1867 | memset(p_parse, 0, sizeof(TY_BIT_RX_PARSE));
1868 | }
1869 |
1870 | void bit_tx_parse_rst(TY_BIT_TX_PARSE *p_parse)
1871 | {
1872 | p_parse->sm = 0;
1873 | }
1874 |
1875 | /// 解析出要发送的数据
1876 | /// @param p_tx_parse [io]发送控制结构体
1877 | /// @param p_tx_bit [o] 待发送数据
1878 | /// @retval bool true-发送中,false-发送完毕
1879 | bool bit_tx_parse(TY_BIT_TX_PARSE *p_tx_parse, uint8 *p_tx_bit)
1880 | {
1881 | bool b_res=true;
1882 |
1883 |
1884 | if(0 != p_tx_parse->sm)
1885 | {
1886 | if(p_tx_parse->bit0_cnt >= 5)
1887 | {
1888 | *p_tx_bit = 1;
1889 | p_tx_parse->bit0_cnt =0;
1890 | p_tx_parse->bit1_cnt =1;
1891 | return true;
1892 | }
1893 | else if(p_tx_parse->bit1_cnt >= 5)
1894 | {
1895 | *p_tx_bit = 0;
1896 | p_tx_parse->bit0_cnt =1;
1897 | p_tx_parse->bit1_cnt =0;
1898 | return true;
1899 | }
1900 | else
1901 | {
1902 | ;
1903 | }
1904 | }
1905 |
1906 | switch(p_tx_parse->sm)
1907 | {
1908 | case 0:
1909 | *p_tx_bit = 0;
1910 | p_tx_parse->bit0_cnt =1;
1911 | p_tx_parse->bit1_cnt =0;
1912 | p_tx_parse->bit_in_seg = 0;
1913 | p_tx_parse->sm = 1;
1914 | break;
1915 | case 1:
1916 | *p_tx_bit = (p_tx_parse->frame.id>>28)&0x01;
1917 | p_tx_parse->frame.id <<= 1;
1918 | p_tx_parse->bit_in_seg ++;
1919 | if(p_tx_parse->bit_in_seg >= 11)
1920 | {
1921 | p_tx_parse->bit_in_seg = 0;
1922 | p_tx_parse->sm = 2;
1923 | }
1924 | break;
1925 | case 2:
1926 | if(p_tx_parse->bit_in_seg) // ide
1927 | {
1928 | if(p_tx_parse->frame.flag&F_IDE)
1929 | *p_tx_bit = 1;
1930 | else
1931 | *p_tx_bit = 0;
1932 | }
1933 | else // srr
1934 | {
1935 | if(p_tx_parse->frame.flag&F_SRR)
1936 | *p_tx_bit = 1;
1937 | else
1938 | *p_tx_bit = 0;
1939 | }
1940 | p_tx_parse->bit_in_seg ++;
1941 | if(p_tx_parse->bit_in_seg >= 2)
1942 | {
1943 | p_tx_parse->bit_in_seg = 0;
1944 | p_tx_parse->sm = 3;
1945 | }
1946 | break;
1947 | case 3:
1948 | *p_tx_bit = (p_tx_parse->frame.id>>28)&0x01;
1949 | p_tx_parse->frame.id <<= 1;
1950 | p_tx_parse->bit_in_seg ++;
1951 | if(p_tx_parse->bit_in_seg >= 18)
1952 | {
1953 | p_tx_parse->bit_in_seg = 0;
1954 | p_tx_parse->sm = 4;
1955 | }
1956 | break;
1957 | case 4:
1958 | if(0 == p_tx_parse->bit_in_seg)
1959 | {
1960 | if(p_tx_parse->frame.flag&F_RTR)
1961 | *p_tx_bit = 1;
1962 | else
1963 | *p_tx_bit = 0;
1964 | }
1965 | else if(1 == p_tx_parse->bit_in_seg)
1966 | {
1967 | if(p_tx_parse->frame.flag&F_R0)
1968 | *p_tx_bit = 1;
1969 | else
1970 | *p_tx_bit = 0;
1971 | }
1972 | else
1973 | {
1974 | if(p_tx_parse->frame.flag&F_R1)
1975 | *p_tx_bit = 1;
1976 | else
1977 | *p_tx_bit = 0;
1978 | }
1979 | p_tx_parse->bit_in_seg ++;
1980 | if(p_tx_parse->bit_in_seg >= 3)
1981 | {
1982 | p_tx_parse->bit_in_seg = 0;
1983 | p_tx_parse->len = p_tx_parse->frame.len;
1984 | p_tx_parse->sm = 5;
1985 | }
1986 | break;
1987 | case 5: // len
1988 | *p_tx_bit = (p_tx_parse->frame.len>>3)&0x01;
1989 | p_tx_parse->frame.len <<= 1;
1990 | p_tx_parse->bit_in_seg ++;
1991 | if(p_tx_parse->bit_in_seg >= 4)
1992 | {
1993 | p_tx_parse->bit_in_seg = 0;
1994 | if(0==p_tx_parse->len)
1995 | {
1996 | p_tx_parse->sm = 7;
1997 | }
1998 | else
1999 | {
2000 | p_tx_parse->sm = 6;
2001 | }
2002 | }
2003 | break;
2004 | case 6:
2005 | *p_tx_bit = (p_tx_parse->frame.dat[p_tx_parse->bit_in_seg/8]>>7)&0x01;
2006 | p_tx_parse->frame.dat[p_tx_parse->bit_in_seg/8] <<= 1;
2007 | p_tx_parse->bit_in_seg ++;
2008 | if(p_tx_parse->bit_in_seg >= p_tx_parse->len*8)
2009 | {
2010 | p_tx_parse->bit_in_seg = 0;
2011 | p_tx_parse->sm = 7;
2012 | }
2013 | break;
2014 | case 7:
2015 | *p_tx_bit = (p_tx_parse->frame.crc>>14)&0x01;
2016 | p_tx_parse->frame.crc <<= 1;
2017 | p_tx_parse->bit_in_seg ++;
2018 | if(p_tx_parse->bit_in_seg >= 15)
2019 | {
2020 | p_tx_parse->bit_in_seg = 0;
2021 | p_tx_parse->sm = 8;
2022 | }
2023 | break;
2024 | case 8:
2025 | *p_tx_bit = 1;
2026 | p_tx_parse->sm = 9;
2027 | break;
2028 | case 9: // ack
2029 | *p_tx_bit = 1;
2030 | p_tx_parse->bit_in_seg = 0;
2031 | p_tx_parse->sm = 0;
2032 | break;
2033 | default:
2034 | *p_tx_bit = 1;
2035 | p_tx_parse->bit_in_seg = 0;
2036 | p_tx_parse->sm = 0;
2037 | b_res = false;
2038 | break;
2039 | }
2040 |
2041 | if(*p_tx_bit)
2042 | {
2043 | p_tx_parse->bit0_cnt =0;
2044 | p_tx_parse->bit1_cnt ++;
2045 | }
2046 | else
2047 | {
2048 | p_tx_parse->bit0_cnt ++;
2049 | p_tx_parse->bit1_cnt =0;
2050 | }
2051 | return b_res;
2052 | }
2053 | #pragma section code_in_ram end
2054 |
--------------------------------------------------------------------------------
/bit_parse.h:
--------------------------------------------------------------------------------
1 | #ifndef BIT_TYPE_H_
2 | #define BIT_TYPE_H_
3 |
4 | #define CAN_CTL_GET_TIME() getTimeTicks()
5 |
6 | #define F_SRR 0x01 // 扩展帧才有(为了兼容标准帧),固定1
7 | #define F_IDE 0x02 // 0-标准帧,1-扩展帧
8 | #define F_RTR 0x04 // 1-远程帧,0-数据帧
9 | #define F_R0 0x08
10 | #define F_R1 0x10
11 | #define F_SOF 0x20
12 | #define F_EOF 0x40
13 | #define F_CRC_GAP 0x80
14 |
15 | typedef enum
16 | {
17 | BIT_STF=0, // 填充位
18 | BIT_ERR_IDLE, // 隐形超限
19 | BIT_LOCK, // 显性超限
20 | BIT_OK, // 正常
21 | }ENUM_BIT_ST;
22 |
23 | typedef enum
24 | {
25 | BIT_IDLE=0,
26 | BIT_H_1,
27 | BIT_H_2,
28 | BIT_H_3,
29 | BIT_H_4,
30 | BIT_H_5,
31 | BIT_L_1, // 6
32 | BIT_L_2,
33 | BIT_L_3,
34 | BIT_L_4, // 9
35 | BIT_L_5,
36 | }ENUM_BIT_SM;
37 |
38 | typedef struct
39 | {
40 | uint32 ts;
41 | uint32 id;
42 | uint8 len;
43 | uint8 dat[8];
44 | uint16 crc;
45 | uint8 flag;
46 | uint8 len_bit;
47 | }TY_CAN_FRM;
48 |
49 | typedef enum
50 | {
51 | MODE_NU=0,
52 | MODE_STD,
53 | MODE_EXT
54 | }ENUM_MODE;
55 |
56 | typedef enum
57 | {
58 | ERR_BIT0 =0x01, // 收到超过5个bit0
59 | ERR_BIT1 =0x02, // 收到超过5个bit1
60 | ERR_LEN =0x04, // 长度超范围
61 | ERR_SM_BIT =0x08, // 删除填充位状态机出错
62 | ERR_SM_FRM =0x10, // BIT流解码状态机出错
63 | }ENUM_ERR;
64 |
65 | typedef struct
66 | {
67 | uint8 valid_bit_st; // 删除填充位状态机
68 | uint8 frm_parse_st; // bit流解码状态机
69 | uint8 bit_in_seg; // 帧内段解码bit计数
70 | uint8 stf_bit; // 填充bit
71 | uint8 valid_bit; // 这个bit是否参与CRC计算,0-不参与
72 | uint8 error; // 错误,见ENUM_ERR
73 | uint8 mode; // CAN网工作模式,标准还是扩展模式
74 | TY_CAN_FRM can_frm; // CAN报文存储区
75 | uint16 tm_max_stat; // 最大耗时状态机
76 | uint32 tm_max; // 最大耗时
77 | }TY_BIT_RX_PARSE;
78 |
79 | typedef struct
80 | {
81 | uint32 bit_cnt;
82 | uint8 sm; // bit流解码状态机
83 | uint8 bit_in_seg; // 帧内段解码bit计数
84 | uint8 bit0_cnt; // bit0连续计数
85 | uint8 bit1_cnt; // bit1连续计数
86 | uint8 error; // 错误
87 | uint8 mode; // CAN网工作模式,标准还是扩展模式
88 | uint8 len;
89 | TY_CAN_FRM frame;
90 | uint16 tm_max_stat;
91 | uint32 tm_max;
92 | }TY_BIT_TX_PARSE;
93 |
94 | uint16 can_frame_crc(TY_CAN_FRM *p_frame);
95 |
96 | void bit_rx_parse_rst(TY_BIT_RX_PARSE *p_parse);
97 |
98 | bool bit_rx_parse(TY_BIT_RX_PARSE *p_parse, uint8 bit_val);
99 |
100 | bool tx_bit_parse(TY_BIT_TX_PARSE *p_tx_parse, uint8 *p_tx_bit);
101 |
102 | #endif
103 |
--------------------------------------------------------------------------------
/can_ctl.c:
--------------------------------------------------------------------------------
1 | #ifndef CAN_CTL_C_
2 | #define CAN_CTL_C_
3 | #endif
4 |
5 | #include "sf_Driver.h"
6 | #include "App_Inc.h"
7 | #include "can_ctl.h"
8 | #include "timing_task.h"
9 |
10 | void can_ctl_init(TY_CAN_CTL *p_can, uint32 bit_rate)
11 | {
12 | memset(p_can, 0, sizeof(TY_CAN_CTL));
13 |
14 | p_can->sm = CAN_CTL_SM_STOP;
15 |
16 | p_can->timing_tm_max =0;
17 | p_can->timing_tm_min =(uint32)(-1);
18 |
19 | p_can->sync_tm_max =0;
20 | p_can->sync_tm_min =(uint32)(-1);
21 | }
22 |
23 | void can_ctl_enable(TY_CAN_CTL *p_can)
24 | {
25 | p_can->sm = CAN_CTL_SM_IDLE;
26 | }
27 |
28 | void can_ctl_disable(TY_CAN_CTL *p_can)
29 | {
30 | p_can->sm = CAN_CTL_SM_STOP;
31 | }
32 |
33 | bool can_ctl_wr(TY_CAN_CTL *p_can, uint32 id, uint8 len, uint8 *p_dat)
34 | {
35 | uint16 tmp;
36 | uint8 cnt;
37 |
38 | if(len > 8)
39 | len = 8;
40 | tmp = (p_can->tx_fifo_wr+1)&TX_FIFO_LEN_MSK;
41 | if(tmp != p_can->tx_fifo_rd)
42 | {
43 | p_can->tx_fifo[p_can->tx_fifo_wr].id = id;
44 | p_can->tx_fifo[p_can->tx_fifo_wr].len = len;
45 | for(cnt=0; cnttx_fifo[p_can->tx_fifo_wr].dat[cnt] = p_dat[cnt];
47 | p_can->tx_fifo[p_can->tx_fifo_wr].flag = 0x83;
48 | p_can->tx_fifo[p_can->tx_fifo_wr].crc = can_frame_crc(&p_can->tx_fifo[p_can->tx_fifo_wr]);
49 | p_can->tx_fifo_wr = tmp;
50 | return true;
51 | }
52 | return false;
53 | }
54 |
55 |
56 | bool can_ctl_rd(TY_CAN_CTL *p_can, uint32 *p_ts, uint32 *p_id, uint8 *p_len, uint8 *p_dat)
57 | {
58 | uint8 cnt;
59 |
60 | if(p_can->rx_fifo_wr != p_can->rx_fifo_rd)
61 | {
62 | *p_ts = p_can->rx_fifo[p_can->rx_fifo_rd].ts;
63 | *p_id = p_can->rx_fifo[p_can->rx_fifo_rd].id;
64 | *p_len = p_can->rx_fifo[p_can->rx_fifo_rd].len;
65 | for(cnt=0; cnt<*p_len; cnt++)
66 | p_dat[cnt] = p_can->rx_fifo[p_can->rx_fifo_rd].dat[cnt];
67 | p_can->rx_fifo_rd = (p_can->rx_fifo_rd+1)&RX_FIFO_LEN_MAK;
68 | return true;
69 | }
70 | return false;
71 | }
72 |
--------------------------------------------------------------------------------
/can_ctl.h:
--------------------------------------------------------------------------------
1 | #ifndef CAN_CTL_H_
2 | #define CAN_CTL_H_
3 |
4 | #include "drvDef.h"
5 | #include "bit_parse.h"
6 |
7 | #ifndef CAN_CTL_DEBUG
8 | //#define CAN_CTL_DEBUG
9 | #endif
10 |
11 | typedef enum
12 | {
13 | CAN_CTL_SM_STOP=0,
14 | CAN_CTL_SM_IDLE,
15 | CAN_CTL_SM_RX_WAIT,
16 |
17 | CAN_CTL_SM_RX_GO,
18 | CAN_CTL_SM_RX,
19 | CAN_CTL_SM_RX_ACK,
20 | CAN_CTL_SM_RX_RST,
21 |
22 | CAN_CTL_SM_TX_ARB,
23 | CAN_CTL_SM_TX,
24 | CAN_CTL_SM_TX_ACK,
25 | CAN_CTL_SM_TX_GAP,
26 | }ENUM_CAN_CTL_SM;
27 |
28 | #define TX_FIFO_LEN (128)
29 | #define TX_FIFO_LEN_MSK (TX_FIFO_LEN-1)
30 | #define RX_FIFO_LEN (128)
31 | #define RX_FIFO_LEN_MAK (RX_FIFO_LEN-1)
32 | #define BIT_BUF_LEN (128)
33 | #define BIT_BUF_LEN_MSK (BIT_BUF_LEN-1)
34 | typedef struct
35 | {
36 | uint8 sm; // 状态机
37 |
38 | uint32 timing_cnt; // 接收,接收处理统计
39 | uint32 timing_tm_max_st;
40 | uint32 timing_tm_max;
41 | uint32 timing_tm_min;
42 |
43 | uint8 sync_tx; // 接收,边沿信号信号量
44 | uint8 sync_rx;
45 | uint8 sync_err;
46 | uint32 sync_cnt; // 接收,同步处理
47 | uint32 sync_tm_max;
48 | uint32 sync_tm_min;
49 | uint32 head_rsync;
50 | uint32 tail_rsync;
51 | uint32 tq9_rsync;
52 |
53 | uint8 bit_stat; // 接收,当前值
54 | uint16 crc;
55 | TY_BIT_RX_PARSE bit_rx_parse; // 接收,bit流解码
56 |
57 | uint8 tq_cnt; // 当前bit中tq的计数
58 | uint8 tq_sync; // 当前bit中是否已经进行过再同步
59 | uint8 tq_sync_err; //
60 |
61 | #ifdef CAN_CTL_DEBUG
62 | uint8 rx_bit_lock; // 接收,调试时抓取bit用
63 | uint32 rx_bit_ts[BIT_BUF_LEN];
64 | uint8 rx_bit[BIT_BUF_LEN];
65 | uint16 rx_bit_wr;
66 | uint16 rx_bit_rd;
67 |
68 | uint8 log_wr;
69 | uint8 log_rd;
70 | uint32 log[8][8]; // 调试,抓取异常数据
71 | #endif
72 |
73 | // rx
74 | uint8 rx_flag;
75 | uint8 rx_crc_ok;
76 | uint8 rx_fifo_ok;
77 | uint32 sm_rx_2_rx_ack;
78 | uint32 rx_err_crc;
79 | uint32 rx_err_bit_parse;
80 | uint32 rx_err_sm;
81 | uint32 sm_rst;
82 | uint32 sm_ack;
83 |
84 |
85 | TY_CAN_FRM rx_fifo[RX_FIFO_LEN]; // 接收,fifo
86 | uint16 rx_fifo_wr;
87 | uint16 rx_fifo_rd;
88 | uint32 rx_ov_cnt;
89 | uint32 rx_cnt;
90 |
91 | // tx
92 | uint16 tx_fifo_wr; // 发送fifo
93 | uint16 tx_fifo_rd;
94 | TY_CAN_FRM tx_fifo[TX_FIFO_LEN];
95 |
96 | uint8 tx_bit;
97 | TY_BIT_TX_PARSE p_tx_bit_parse;
98 |
99 | uint32 tx_cnt;
100 | uint32 arb_fail;
101 | uint32 arb_fail_info;
102 | uint32 ack_err;
103 | uint32 tx_err_sm;
104 | uint32 tx_succ;
105 | }TY_CAN_CTL;
106 |
107 | void can_ctl_init(TY_CAN_CTL *p_can, uint32 bit_rate);
108 | void can_ctl_enable(TY_CAN_CTL *p_can);
109 | void can_ctl_disable(TY_CAN_CTL *p_can);
110 |
111 | bool can_ctl_wr(TY_CAN_CTL *p_can, uint32 id, uint8 len, uint8 *p_dat);
112 | bool can_ctl_rd(TY_CAN_CTL *p_can, uint32 *p_ts, uint32 *p_id, uint8 *p_len, uint8 *p_dat);
113 |
114 | // 读取采样电平
115 | #define RX_PIN_STAT() (0x01&(GPIO_PDD_GetPortDataInput(PTE_BASE_PTR)>>25))
116 | #define TX_PIN_SET(stat) do{if(stat){GPIO_PDD_SetPortDataOutputMask(PTE_BASE_PTR, PORT_PDD_PIN_24);}else{GPIO_PDD_ClearPortDataOutputMask(PTE_BASE_PTR, PORT_PDD_PIN_24);}}while(0)
117 |
118 | #include "MK60DZ10.h"
119 | #define PIT_GET_CNT() (*(uint32*)((uint32)PIT_BASE_PTR+4*(256/4+2*4+1)))
120 | // 设定定时器重装值
121 | #define PIT_SET_LDVAL(val) pit3_set_ldval(val)
122 | #endif
123 |
--------------------------------------------------------------------------------
/sync_task.c:
--------------------------------------------------------------------------------
1 | #ifndef SYNC_TASK_C_
2 | #define SYNC_TASK_C_
3 | #endif
4 | #include "sf_Driver.h"
5 | #include "App_Inc.h"
6 | #include "can_ctl.h"
7 | #include "timing_task.h"
8 |
9 | /*
10 | * 同步信号处理任务
11 | */
12 | #pragma define_section code_in_ram ".app_code_ram" abs32 RWX
13 | #pragma section code_in_ram begin
14 | void sync_task(TY_CAN_CTL *p_can)
15 | {
16 | p_can->sync_cnt ++;
17 | switch(p_can->sm)
18 | {
19 | case CAN_CTL_SM_IDLE:
20 | case CAN_CTL_SM_RX_WAIT:
21 | p_can->sm = CAN_CTL_SM_RX_GO;
22 | PIT_SET_LDVAL(1);
23 | break;
24 | case CAN_CTL_SM_TX_GAP:
25 | case CAN_CTL_SM_RX:
26 | case CAN_CTL_SM_RX_ACK:
27 | case CAN_CTL_SM_TX_ARB:
28 | case CAN_CTL_SM_TX:
29 | case CAN_CTL_SM_TX_ACK:
30 | // 发送同步信号
31 | p_can->sync_tx ++;
32 | break;
33 | default:
34 | // 发送同步信号
35 | p_can->sync_tx ++;
36 | break;
37 | }
38 | }
39 | #pragma section code_in_ram end
40 |
41 |
42 |
43 |
--------------------------------------------------------------------------------
/timing_task.c:
--------------------------------------------------------------------------------
1 | #ifndef TIMING_TASK_C_
2 | #define TIMING_TASK_C_
3 | #endif
4 |
5 | #include "sf_Driver.h"
6 | #include "App_Inc.h"
7 | #include "can_ctl.h"
8 | #include "timing_task.h"
9 |
10 |
11 |
12 |
13 | #pragma define_section code_in_ram ".app_code_ram" abs32 RWX
14 |
15 | #pragma section code_in_ram begin
16 | // M4的时钟为48mhz
17 | // 定时时间us(x)
18 | // 重载值=x*1000/(1000/48)=x*48
19 | #define PIT3_LD_VAL_TQ (5*48-1) // TQ
20 | #define PIT3_LD_VAL_BIT (50*48-1) // BIT
21 | #define PIT3_LD_VAL_IDLE (1000*48-1) // MS
22 | void timing_task(TY_CAN_CTL *p_can)
23 | {
24 | uint32 tm_s=PIT_GET_CNT();//getTimeTicks();
25 | uint32 tm_sm=(p_can->sm<<24)+(p_can->tq_cnt<<16)+(p_can->bit_rx_parse.valid_bit_st<<8)+(p_can->bit_rx_parse.frm_parse_st);
26 | uint16 tmp;
27 | bool b_res;
28 | uint8 sm = p_can->sm;
29 |
30 | p_can->timing_cnt ++;
31 | switch(p_can->sm)
32 | {
33 | case CAN_CTL_SM_STOP:
34 | {
35 | PIT_SET_LDVAL(PIT3_LD_VAL_IDLE);
36 | break;
37 | }
38 | case CAN_CTL_SM_IDLE:
39 | {
40 | // 有待发数据就发送数据,否则降低终端频率
41 | if(p_can->tx_fifo_rd != p_can->tx_fifo_wr)
42 | {
43 | p_can->p_tx_bit_parse.frame = p_can->tx_fifo[p_can->tx_fifo_rd];
44 | p_can->p_tx_bit_parse.sm = 0;
45 | p_can->tx_cnt ++;
46 |
47 | p_can->tq_cnt = 1;
48 | if(bit_tx_parse(&p_can->p_tx_bit_parse, &p_can->tx_bit))
49 | {
50 | TX_PIN_SET(p_can->tx_bit);
51 | }
52 |
53 | p_can->bit_rx_parse.can_frm.ts = tm_s;
54 | PIT_SET_LDVAL(PIT3_LD_VAL_TQ);
55 | p_can->sm = CAN_CTL_SM_TX_ARB;
56 | }
57 | else
58 | {
59 | TX_PIN_SET(1);
60 | PIT_SET_LDVAL(PIT3_LD_VAL_IDLE);
61 | }
62 | break;
63 | }
64 | case CAN_CTL_SM_RX_WAIT:
65 | {
66 | p_can->tq_cnt ++;
67 | if(p_can->tq_cnt >= 7)
68 | {
69 | p_can->tq_cnt = 0;
70 | p_can->sm = CAN_CTL_SM_IDLE;
71 | }
72 | break;
73 | }
74 | case CAN_CTL_SM_RX_GO:
75 | {
76 | // 2000/20-1=99
77 | PIT_SET_LDVAL(PIT3_LD_VAL_TQ);
78 | // 此时对应于SOF的下降沿
79 | // 准备接收数据
80 | p_can->bit_rx_parse.can_frm.ts = tm_s;
81 | p_can->tq_cnt = 0;
82 | p_can->rx_flag = 0;
83 | p_can->sm = CAN_CTL_SM_RX;
84 | }
85 | case CAN_CTL_SM_RX:
86 | {
87 | // |_|_|_|_|_|_|_|_|_|_|
88 | // 0 1 2 3 4 5 6 7 8 9 0
89 | // 1、边沿0、1,出现同步信号是正常信号,不需要处理
90 | // 2、边沿2、3,出现同步信号需要再同步来矫正,直接认为当前TQ=1
91 | // 3、边沿8、9,出现同步信号需要再同步来矫正,直接认为当前TQ=0
92 | // 4、其余边沿,出现同步信号属于不可挽回的错误
93 | // #、在每个TQ=0时要复位tq_sync
94 | switch(p_can->tq_cnt)
95 | {
96 | case 0:
97 | p_can->tq_sync = 0;
98 | case 1:
99 | if(p_can->sync_tx != p_can->sync_rx)
100 | {
101 | p_can->sync_rx = p_can->sync_tx;
102 | }
103 | p_can->tq_cnt ++;
104 | break;
105 | case 2:
106 | case 3:
107 | if(p_can->sync_tx != p_can->sync_rx)
108 | {
109 | p_can->sync_rx = p_can->sync_tx;
110 | if(p_can->tq_sync)
111 | {
112 | p_can->tq_cnt ++;
113 | }
114 | else
115 | {
116 | p_can->head_rsync ++;
117 | p_can->tq_cnt = 2;
118 | p_can->tq_sync = 1;
119 | }
120 | }
121 | else
122 | {
123 | p_can->tq_cnt ++;
124 | }
125 | break;
126 | case 4:
127 | case 5:
128 | case 6:
129 | if(p_can->sync_tx != p_can->sync_rx)
130 | {
131 | p_can->sync_rx = p_can->sync_tx;
132 | p_can->sync_err ++;
133 | }
134 | p_can->tq_cnt ++;
135 | break;
136 | case 7:
137 | // sample point
138 | p_can->bit_stat = RX_PIN_STAT();
139 | #ifdef CAN_CTL_DEBUG
140 | if(!p_can->rx_bit_lock)
141 | {
142 | p_can->rx_bit_ts[p_can->rx_bit_wr] = CAN_CTL_GET_TIME();
143 | p_can->rx_bit[p_can->rx_bit_wr] = p_can->bit_stat;
144 | p_can->rx_bit_wr = (p_can->rx_bit_wr+1)&BIT_BUF_LEN_MSK;
145 | }
146 | #endif
147 | b_res = bit_rx_parse(&p_can->bit_rx_parse, p_can->bit_stat);
148 |
149 | // 下一位是ACK,认为已经解码到数据
150 | if(b_res)
151 | {
152 | p_can->rx_flag = 1;
153 |
154 | if(p_can->sync_tx != p_can->sync_rx)
155 | {
156 | p_can->sync_rx = p_can->sync_tx;
157 | p_can->sync_err ++;
158 | }
159 | p_can->tq_cnt ++;
160 | }
161 | else
162 | {
163 | p_can->rx_flag = 0;
164 | // bit_parse函数异常情况下会把状态机复位
165 | if(0!=p_can->bit_rx_parse.frm_parse_st)
166 | {
167 | if(p_can->sync_tx != p_can->sync_rx)
168 | {
169 | p_can->sync_rx = p_can->sync_tx;
170 | p_can->sync_err ++;
171 | }
172 | p_can->tq_cnt ++;
173 | }
174 | else
175 | {
176 | p_can->rx_err_bit_parse ++;
177 | p_can->tq_cnt = 0;
178 | p_can->sm = CAN_CTL_SM_RX_RST;
179 | }
180 | }
181 | break;
182 | case 8:
183 | // 为了平衡负荷,计算校验和放到了这里
184 | if(p_can->bit_rx_parse.valid_bit)
185 | {
186 | p_can->crc = can_crc(p_can->crc, p_can->bit_stat);
187 | }
188 |
189 | // 检查数据有效性
190 | if(p_can->rx_flag)
191 | {
192 | // 检查CRC
193 | if(p_can->crc == p_can->bit_rx_parse.can_frm.crc)
194 | {
195 | p_can->rx_crc_ok = 1;
196 | }
197 | else
198 | {
199 | p_can->rx_err_crc ++;
200 | p_can->rx_crc_ok = 0;
201 | }
202 | }
203 |
204 | if(p_can->sync_tx != p_can->sync_rx)
205 | {
206 | p_can->sync_rx = p_can->sync_tx;
207 | if(p_can->tq_sync)
208 | {
209 | p_can->tq_cnt ++;
210 | }
211 | else
212 | {
213 | p_can->tail_rsync ++;
214 | p_can->tq_cnt = 0;
215 | // 下一位是ACK
216 | if(p_can->rx_flag)
217 | {
218 | p_can->sm_rx_2_rx_ack ++;
219 | p_can->sm = CAN_CTL_SM_RX_ACK;
220 | }
221 | }
222 | }
223 | else
224 | {
225 | p_can->tq_cnt ++;
226 | }
227 | break;
228 | case 9:
229 | // if next bit is ack, do not check resync
230 | // else check resync
231 | if(p_can->rx_flag)
232 | {
233 | if(p_can->sync_tx != p_can->sync_rx)
234 | {
235 | p_can->sync_rx = p_can->sync_tx;
236 | }
237 | p_can->tq_cnt = 0;
238 | p_can->sm_rx_2_rx_ack ++;
239 | p_can->sm = CAN_CTL_SM_RX_ACK;
240 | }
241 | else
242 | {
243 | if(p_can->sync_tx != p_can->sync_rx)
244 | {
245 | p_can->sync_rx = p_can->sync_tx;
246 | if(p_can->tq_sync)
247 | {
248 | p_can->tq_cnt =0;
249 | }
250 | else
251 | {
252 | p_can->tq9_rsync ++;
253 | p_can->tq_cnt =1;
254 | }
255 | }
256 | else
257 | {
258 | p_can->tq_cnt = 0;
259 | }
260 | }
261 | break;
262 | default:
263 | p_can->rx_err_sm ++;
264 | p_can->tq_cnt = 0;
265 | p_can->sm = CAN_CTL_SM_RX_RST;
266 | break;
267 | }
268 | break;
269 | }
270 | case CAN_CTL_SM_RX_ACK: // 3
271 | {
272 | switch(p_can->tq_cnt)
273 | {
274 | case 0:
275 | // 发送应答信号
276 | if(p_can->rx_crc_ok)
277 | {
278 | TX_PIN_SET(0);
279 | tmp = (p_can->rx_fifo_wr+1)&0x07;
280 | if(p_can->rx_fifo_rd != tmp)
281 | {
282 | p_can->rx_fifo_ok = 1;
283 | }
284 | else
285 | {
286 | p_can->rx_ov_cnt ++;
287 | p_can->rx_fifo_ok = 0;
288 | }
289 | p_can->rx_cnt ++;
290 | }
291 | else
292 | {
293 | TX_PIN_SET(1);
294 | p_can->rx_fifo_ok = 0;
295 | }
296 | p_can->sm_ack ++;
297 | p_can->tq_cnt ++;
298 | break;
299 | case 1:
300 | if(p_can->rx_fifo_ok)
301 | {
302 | p_can->rx_fifo[p_can->rx_fifo_wr].ts = p_can->bit_rx_parse.can_frm.ts;
303 | p_can->rx_fifo[p_can->rx_fifo_wr].id = p_can->bit_rx_parse.can_frm.id;
304 | }
305 | p_can->tq_cnt ++;
306 | break;
307 | case 2:
308 | if(p_can->rx_fifo_ok)
309 | {
310 | p_can->rx_fifo[p_can->rx_fifo_wr].len = p_can->bit_rx_parse.can_frm.len;
311 | p_can->rx_fifo[p_can->rx_fifo_wr].flag = p_can->bit_rx_parse.can_frm.flag;
312 | }
313 | p_can->tq_cnt ++;
314 | break;
315 | case 3:
316 | if(p_can->rx_fifo_ok)
317 | {
318 | p_can->rx_fifo[p_can->rx_fifo_wr].dat[0] = p_can->bit_rx_parse.can_frm.dat[0];
319 | p_can->rx_fifo[p_can->rx_fifo_wr].dat[1] = p_can->bit_rx_parse.can_frm.dat[1];
320 | }
321 | p_can->tq_cnt ++;
322 | break;
323 | case 4:
324 | if(p_can->rx_fifo_ok)
325 | {
326 | p_can->rx_fifo[p_can->rx_fifo_wr].dat[2] = p_can->bit_rx_parse.can_frm.dat[2];
327 | p_can->rx_fifo[p_can->rx_fifo_wr].dat[3] = p_can->bit_rx_parse.can_frm.dat[3];
328 | }
329 | p_can->tq_cnt ++;
330 | break;
331 | case 5:
332 | if(p_can->rx_fifo_ok)
333 | {
334 | p_can->rx_fifo[p_can->rx_fifo_wr].dat[4] = p_can->bit_rx_parse.can_frm.dat[4];
335 | p_can->rx_fifo[p_can->rx_fifo_wr].dat[5] = p_can->bit_rx_parse.can_frm.dat[5];
336 | }
337 | p_can->tq_cnt ++;
338 | break;
339 | case 6:
340 | if(p_can->rx_fifo_ok)
341 | {
342 | p_can->rx_fifo[p_can->rx_fifo_wr].dat[6] = p_can->bit_rx_parse.can_frm.dat[6];
343 | p_can->rx_fifo[p_can->rx_fifo_wr].dat[7] = p_can->bit_rx_parse.can_frm.dat[7];
344 | }
345 | p_can->tq_cnt ++;
346 | break;
347 | case 7:
348 | if(p_can->rx_fifo_ok)
349 | {
350 | p_can->rx_fifo[p_can->rx_fifo_wr].crc = p_can->bit_rx_parse.can_frm.crc;
351 | }
352 | p_can->tq_cnt ++;
353 | break;
354 | case 8:
355 | if(p_can->rx_fifo_ok)
356 | {
357 | p_can->rx_fifo_wr = (p_can->rx_fifo_wr+1)&RX_FIFO_LEN_MAK;
358 | }
359 | p_can->tq_cnt ++;
360 | break;
361 | case 9:
362 | if(p_can->sync_tx != p_can->sync_rx)
363 | {
364 | p_can->sync_rx = p_can->sync_tx;
365 | }
366 | p_can->tq_cnt =0;
367 | p_can->sm = CAN_CTL_SM_RX_RST;
368 | break;
369 | default:
370 | p_can->rx_err_sm ++;
371 | p_can->tq_cnt = 0;
372 | p_can->sm = CAN_CTL_SM_RX_RST;
373 | break;
374 | }
375 | break;
376 | }
377 | case CAN_CTL_SM_RX_RST:
378 | // 接收异常或者接收完毕后的中间态,用来复位接收相关的变量
379 | // 持续4个BIT
380 | switch(p_can->tq_cnt)
381 | {
382 | case 0:
383 | TX_PIN_SET(1);
384 | PIT_SET_LDVAL(PIT3_LD_VAL_BIT);
385 | p_can->tq_cnt ++;
386 | break;
387 | case 1:
388 | p_can->rx_flag = 0;
389 | p_can->rx_crc_ok = 0;
390 | p_can->tq_sync = 0;
391 | p_can->crc = 0;
392 | p_can->sync_rx = p_can->sync_tx;
393 | p_can->sm_rst ++;
394 | p_can->tq_cnt ++;
395 | break;
396 | case 2:
397 | bit_rx_parse_rst(&p_can->bit_rx_parse);
398 | p_can->tq_cnt ++;
399 | break;
400 | case 3:
401 | p_can->tq_cnt ++;
402 | break;
403 | case 4:
404 | p_can->tq_cnt = 0;
405 | p_can->sm = CAN_CTL_SM_RX_WAIT;
406 | break;
407 | default:
408 | p_can->tq_cnt = 0;
409 | p_can->sm = CAN_CTL_SM_RX_WAIT;
410 | break;
411 | }
412 | break;
413 | case CAN_CTL_SM_TX_ARB: //
414 | {
415 | switch(p_can->tq_cnt)
416 | {
417 | case 0:
418 | if(bit_tx_parse(&p_can->p_tx_bit_parse, &p_can->tx_bit))
419 | {
420 | TX_PIN_SET(p_can->tx_bit);
421 | }
422 | p_can->tq_cnt ++;
423 | break;
424 | case 7:
425 | p_can->bit_stat = RX_PIN_STAT();
426 | b_res = bit_rx_parse(&p_can->bit_rx_parse, p_can->bit_stat);
427 | // 仲裁判断
428 | if(p_can->tx_bit == p_can->bit_stat)
429 | {
430 | ;
431 | }
432 | else
433 | {
434 | // 仲裁失败
435 | p_can->arb_fail ++;
436 | p_can->arb_fail_info = (p_can->p_tx_bit_parse.sm<<8)+(p_can->p_tx_bit_parse.bit_in_seg);
437 | p_can->sync_rx = p_can->sync_tx;
438 | p_can->sm = CAN_CTL_SM_RX;
439 | }
440 | p_can->tq_cnt ++;
441 | break;
442 | case 1:
443 | case 2:
444 | case 3:
445 | case 4:
446 | case 5:
447 | case 6:
448 | case 8:
449 | p_can->tq_cnt ++;
450 | break;
451 | case 9:
452 | if(p_can->sync_tx != p_can->sync_rx)
453 | {
454 | p_can->sync_rx = p_can->sync_tx;
455 | }
456 | p_can->tq_cnt =0;
457 | // 检查仲裁场是否结束
458 | if(p_can->p_tx_bit_parse.sm >= 5)
459 | {
460 | p_can->sm = CAN_CTL_SM_TX;
461 | }
462 | break;
463 | default:
464 | p_can->tx_err_sm ++;
465 | p_can->sm = CAN_CTL_SM_TX_GAP;
466 | break;
467 | }
468 | break;
469 | }
470 | case CAN_CTL_SM_TX: //
471 | switch(p_can->tq_cnt)
472 | {
473 | case 0:
474 | if(bit_tx_parse(&p_can->p_tx_bit_parse, &p_can->tx_bit))
475 | {
476 | TX_PIN_SET(p_can->tx_bit);
477 | }
478 | case 1:
479 | case 2:
480 | case 3:
481 | case 4:
482 | case 5:
483 | case 6:
484 | case 7:
485 | case 8:
486 | p_can->tq_cnt ++;
487 | break;
488 | case 9:
489 | if(p_can->sync_tx != p_can->sync_rx)
490 | {
491 | p_can->sync_rx = p_can->sync_tx;
492 | }
493 | p_can->tq_cnt =0;
494 | if(9 == p_can->p_tx_bit_parse.sm)
495 | {
496 | p_can->sm = CAN_CTL_SM_TX_ACK;
497 | }
498 | break;
499 | default:
500 | p_can->tx_err_sm ++;
501 | p_can->sm = CAN_CTL_SM_TX_GAP;
502 | break;
503 | }
504 | break;
505 | case CAN_CTL_SM_TX_ACK: //
506 | switch(p_can->tq_cnt)
507 | {
508 | case 0:
509 | TX_PIN_SET(1);
510 | if(bit_tx_parse(&p_can->p_tx_bit_parse, &p_can->tx_bit))
511 | {
512 | ;
513 | }
514 | p_can->tq_cnt ++;
515 | break;
516 | case 1:
517 | case 2:
518 | case 3:
519 | case 4:
520 | case 5:
521 | case 6:
522 | case 8:
523 | p_can->tq_cnt ++;
524 | break;
525 | case 7:
526 | p_can->bit_stat = RX_PIN_STAT();
527 | // 检查应答
528 | if(0==p_can->bit_stat)
529 | {
530 | p_can->tx_fifo_rd = (p_can->tx_fifo_rd+1)&TX_FIFO_LEN_MSK;
531 | p_can->tx_succ ++;
532 | }
533 | else
534 | {
535 | p_can->ack_err ++;
536 | }
537 | p_can->tq_cnt ++;
538 | break;
539 | case 9:
540 | if(p_can->sync_tx != p_can->sync_rx)
541 | {
542 | p_can->sync_rx = p_can->sync_tx;
543 | }
544 | p_can->tq_cnt =0;
545 |
546 | p_can->sm = CAN_CTL_SM_TX_GAP;
547 | break;
548 | default:
549 | p_can->tx_err_sm ++;
550 | p_can->sm = CAN_CTL_SM_TX_GAP;
551 | break;
552 | }
553 | break;
554 | case CAN_CTL_SM_TX_GAP: // 8
555 | switch(p_can->tq_cnt)
556 | {
557 | case 0:
558 | TX_PIN_SET(1);
559 | PIT_SET_LDVAL(PIT3_LD_VAL_BIT);
560 | p_can->tq_cnt ++;
561 | break;
562 | case 1:
563 | bit_rx_parse_rst(&p_can->bit_rx_parse);
564 | bit_tx_parse_rst(&p_can->p_tx_bit_parse);
565 | p_can->tq_cnt ++;
566 | break;
567 | case 2:
568 | case 3:
569 | p_can->tq_cnt ++;
570 | break;
571 | case 4:
572 | if(p_can->sync_tx != p_can->sync_rx)
573 | {
574 | p_can->sync_rx = p_can->sync_tx;
575 | }
576 | p_can->tq_cnt =0;
577 | p_can->sm = CAN_CTL_SM_RX_WAIT;
578 | break;
579 | default:
580 | p_can->tq_cnt = 0;
581 | p_can->sm = CAN_CTL_SM_RX_WAIT;
582 | break;
583 | }
584 | break;
585 | default:
586 | p_can->sm = 0;
587 | break;
588 | }
589 | if(CAN_CTL_SM_IDLE != sm)
590 | {
591 | tm_s=tm_s-PIT_GET_CNT();//getTimeTicks();
592 | if(tm_s>p_can->timing_tm_max)
593 | {
594 | p_can->timing_tm_max_st = tm_sm;
595 | p_can->timing_tm_max = tm_s;
596 | }
597 | if(tm_stiming_tm_min)
598 | p_can->timing_tm_min = tm_s;
599 | }
600 | }
601 | #pragma section code_in_ram end
602 |
603 |
--------------------------------------------------------------------------------
/timing_task.h:
--------------------------------------------------------------------------------
1 | #ifndef TIMING_TASK_H_
2 | #define TIMING_TASK_H_
3 |
4 | void timing_task(TY_CAN_CTL *p_can);
5 |
6 | #endif
7 |
--------------------------------------------------------------------------------