📄 can162.lst
字号:
0363 DEC2 RCALL _SJASetAccMask
0364 2F60 MOV R22,R16
(0450) }while(temp);
0365 2366 TST R22
0366 F7B9 BNE 0x035E
(0451) WDR();
0367 95A8 WDR
(0452) for(k=0;k<6;k++); //延时约5us
0368 2744 CLR R20
0369 2755 CLR R21
036A C002 RJMP 0x036D
036B 5F4F SUBI R20,0xFF
036C 4F5F SBCI R21,0xFF
036D 3046 CPI R20,6
036E E0E0 LDI R30,0
036F 075E CPC R21,R30
0370 F3D0 BCS 0x036B
(0453) do
(0454) {
(0455) temp = SJASetOtherReg();
0371 DF36 RCALL _SJASetOtherReg
0372 2F60 MOV R22,R16
(0456) }while(temp);
0373 2366 TST R22
0374 F7E1 BNE 0x0371
(0457) WDR();
0375 95A8 WDR
(0458) for(k=0;k<6;k++); //延时约5us
0376 2744 CLR R20
0377 2755 CLR R21
0378 C002 RJMP 0x037B
0379 5F4F SUBI R20,0xFF
037A 4F5F SBCI R21,0xFF
037B 3046 CPI R20,6
037C E0E0 LDI R30,0
037D 075E CPC R21,R30
037E F3D0 BCS 0x0379
(0459) do
(0460) {
(0461) temp = SJAQuitResetMode();
037F DE0D RCALL _SJAQuitResetMode
0380 2F60 MOV R22,R16
(0462) }while(temp);
0381 2366 TST R22
0382 F7E1 BNE 0x037F
(0463)
(0464) WDR();
0383 95A8 WDR
(0465) for(k=0;k<6;k++); //延时约5us
0384 2744 CLR R20
0385 2755 CLR R21
0386 C002 RJMP 0x0389
0387 5F4F SUBI R20,0xFF
0388 4F5F SBCI R21,0xFF
0389 3046 CPI R20,6
038A E0E0 LDI R30,0
038B 075E CPC R21,R30
038C F3D0 BCS 0x0387
(0466) do
(0467) {
(0468) temp = SJASetIER(0x01);
038D E001 LDI R16,1
038E DF4F RCALL _SJASetIER
038F 2F60 MOV R22,R16
(0469) }while(temp);
0390 2366 TST R22
0391 F7D9 BNE 0x038D
(0470)
(0471)
(0472) }
(0473)
(0474) write_sja(CMR,0x0c); //清除数据溢出和释放接收缓冲器;
0392 E02C LDI R18,0xC
0393 E001 LDI R16,1
0394 DDBA RCALL _write_sja
(0475) for(k=0;k<6;k++); //延时约5us
0395 2744 CLR R20
0396 2755 CLR R21
0397 C002 RJMP 0x039A
0398 5F4F SUBI R20,0xFF
0399 4F5F SBCI R21,0xFF
039A 3046 CPI R20,6
039B E0E0 LDI R30,0
039C 075E CPC R21,R30
039D F3D0 BCS 0x0398
(0476) WDR();
039E 95A8 WDR
(0477) do
(0478) {
(0479) write_sja(MODE, 0x0C);
039F E02C LDI R18,0xC
03A0 2700 CLR R16
03A1 DDAD RCALL _write_sja
(0480) }while((read_sja(MODE) & 0x01));
03A2 2700 CLR R16
03A3 DD9E RCALL _read_sja
03A4 FD00 SBRC R16,0
03A5 CFF9 RJMP 0x039F
(0481) /*WDR();
(0482) for(k=0;k<6;k++); //延时约5us
(0483) if(SJATestRstMode())
(0484) {
(0485) do
(0486) {
(0487) temp = SJASetIER(0x01);
(0488) }while(temp);
(0489) }*/
(0490) SEI();
03A6 9478 BSET 7
(0491)
(0492) }
03A7 9623 ADIW R28,3
03A8 940E04BE CALL pop_gset2
03AA 9508 RET
(0493) /*************************************************
(0494) SJA1000发送子函数
(0495) *************************************************/
(0496) void CanTransmit(void)
(0497) {
(0498) unsigned char status;
(0499) CLI(); //关中断
_CanTransmit:
status --> Y+1
03AB 94F8 BCLR 7
(0500) //实际用时对SJAWriteDataToTxBuf();的调用在个检测模块中
(0501) /*SJAWriteDataToTxBuf(0, 0x88);
(0502) SJAWriteDataToTxBuf(1, 0x00);
(0503) SJAWriteDataToTxBuf(2, 0x00);
(0504) SJAWriteDataToTxBuf(3, 0x00);
(0505) SJAWriteDataToTxBuf(4, 0x00);
(0506) SJAWriteDataToTxBuf(5, 0x01);
(0507) SJAWriteDataToTxBuf(6, 0x02);
(0508) SJAWriteDataToTxBuf(7, 0x03);
(0509) SJAWriteDataToTxBuf(8, 0x04);
(0510) SJAWriteDataToTxBuf(9, 0x05);
(0511) SJAWriteDataToTxBuf(10, 0x06);
(0512) SJAWriteDataToTxBuf(11, 0x07);
(0513) SJAWriteDataToTxBuf(12, 0xaa);*/
(0514) TX_Buffer[0]=0x88;
03AC E888 LDI R24,0x88
03AD 9380008C STS R24,_TX_Buffer
(0515) TX_Buffer[1]=0x00;
03AF 2422 CLR R2
03B0 9220008D STS R2,_TX_Buffer+1
(0516) TX_Buffer[2]=0x00;
03B2 9220008E STS R2,_TX_Buffer+2
(0517) TX_Buffer[3]=0x00;
03B4 9220008F STS R2,_TX_Buffer+3
(0518) TX_Buffer[4]=0x00;
03B6 92200090 STS R2,0x90
(0519) TX_Buffer[5]=0x01;
03B8 E081 LDI R24,1
03B9 93800091 STS R24,0x91
(0520) TX_Buffer[6]=0x02;
03BB E082 LDI R24,2
03BC 93800092 STS R24,0x92
(0521) TX_Buffer[7]=0x03;
03BE E083 LDI R24,3
03BF 93800093 STS R24,0x93
(0522) TX_Buffer[8]=0x04;
03C1 E084 LDI R24,4
03C2 93800094 STS R24,0x94
(0523) TX_Buffer[9]=0x05;
03C4 E085 LDI R24,5
03C5 93800095 STS R24,0x95
(0524) TX_Buffer[10]=0x06;
03C7 E086 LDI R24,6
03C8 93800096 STS R24,0x96
(0525) TX_Buffer[11]=0x07;
03CA E087 LDI R24,7
03CB 93800097 STS R24,0x97
(0526) TX_Buffer[12]=0xaa;
03CD EA8A LDI R24,0xAA
03CE 93800098 STS R24,0x98
(0527)
(0528) while(!(read_sja(SR)&0x04)); //wait until reg2^2==1 ,即判断发送缓冲器的状态
03D0 E002 LDI R16,2
03D1 DD70 RCALL _read_sja
03D2 FF02 SBRS R16,2
03D3 CFFC RJMP 0x03D0
(0529)
(0530) write_sja(TXEFF, TX_Buffer[0]); //扩展帧,数据长度为8个字节
03D4 9120008C LDS R18,_TX_Buffer
03D6 E100 LDI R16,0x10
03D7 DD77 RCALL _write_sja
(0531) write_sja(TXID0, TX_Buffer[1]);
03D8 9120008D LDS R18,_TX_Buffer+1
03DA E101 LDI R16,0x11
03DB DD73 RCALL _write_sja
(0532) write_sja(TXID1, TX_Buffer[2]);
03DC 9120008E LDS R18,_TX_Buffer+2
03DE E102 LDI R16,0x12
03DF DD6F RCALL _write_sja
(0533) write_sja(TXID2, TX_Buffer[3]);
03E0 9120008F LDS R18,_TX_Buffer+3
03E2 E103 LDI R16,0x13
03E3 DD6B RCALL _write_sja
(0534) write_sja(TXID3, TX_Buffer[4]);
03E4 91200090 LDS R18,0x90
03E6 E104 LDI R16,0x14
03E7 DD67 RCALL _write_sja
(0535) write_sja(TXDATA0, TX_Buffer[5]);
03E8 91200091 LDS R18,0x91
03EA E105 LDI R16,0x15
03EB DD63 RCALL _write_sja
(0536) write_sja(TXDATA1, TX_Buffer[6]);
03EC 91200092 LDS R18,0x92
03EE E106 LDI R16,0x16
03EF DD5F RCALL _write_sja
(0537) write_sja(TXDATA2, TX_Buffer[7]);
03F0 91200093 LDS R18,0x93
03F2 E107 LDI R16,0x17
03F3 DD5B RCALL _write_sja
(0538) write_sja(TXDATA3, TX_Buffer[8]);
03F4 91200094 LDS R18,0x94
03F6 E108 LDI R16,0x18
03F7 DD57 RCALL _write_sja
(0539) write_sja(TXDATA4, TX_Buffer[9]);
03F8 91200095 LDS R18,0x95
03FA E109 LDI R16,0x19
03FB DD53 RCALL _write_sja
(0540) write_sja(TXDATA5, TX_Buffer[10]);
03FC 91200096 LDS R18,0x96
03FE E10A LDI R16,0x1A
03FF DD4F RCALL _write_sja
(0541) write_sja(TXDATA6, TX_Buffer[11]);
0400 91200097 LDS R18,0x97
0402 E10B LDI R16,0x1B
0403 DD4B RCALL _write_sja
(0542) write_sja(TXDATA7, TX_Buffer[12]);
0404 91200098 LDS R18,0x98
0406 E10C LDI R16,0x1C
0407 DD47 RCALL _write_sja
(0543) write_sja(CMR,0x10); //发送请求命令
0408 E120 LDI R18,0x10
0409 E001 LDI R16,1
040A DD44 RCALL _write_sja
(0544) while(!(read_sja(SR) & 0x08));//检测SR.3位,判断发送是否完成
040B E002 LDI R16,2
040C DD35 RCALL _read_sja
040D FF03 SBRS R16,3
040E CFFC RJMP 0x040B
(0545) SEI(); //开中断
040F 9478 BSET 7
(0546) }
0410 9508 RET
_CanReceive:
sff --> R12
number --> R20
result --> R22
status --> R20
prbuf --> R10
i --> R12
0411 940E04B6 CALL push_gset4
(0547)
(0548) unsigned char CanReceive(void)
(0549) {
(0550) unsigned char result = FALSE;
0413 2766 CLR R22
(0551) unsigned char status,number,i,sff;
(0552) unsigned char prbuf;
(0553) status = read_sja(SR);
0414 E002 LDI R16,2
0415 DD2C RCALL _read_sja
0416 2F40 MOV R20,R16
(0554) prbuf = RXEFF;
0417 E180 LDI R24,0x10
0418 2EA8 MOV R10,R24
(0555) if((status&0xc3) != 0) //读取总线脱离、错误状态、接收溢出、有数据等位
0419 2F84 MOV R24,R20
041A 7C83 ANDI R24,0xC3
041B F409 BNE 0x041D
041C C043 RJMP 0x0460
(0556) {
(0557) if((status&0x80) == 0x80)
041D 2F84 MOV R24,R20
041E 7880 ANDI R24,0x80
041F 3880 CPI R24,0x80
0420 F429 BNE 0x0426
(0558) {
(0559) write_sja(MODE, 0x00);
0421 2722 CLR R18
0422 2700 CLR R16
0423 DD2B RCALL _write_sja
(0560) return FALSE;
0424 2700 CLR R16
0425 C03B RJMP 0x0461
(0561) }
(0562) if((status&0x02) == 0x02)
0426 2F84 MOV R24,R20
0427 7082 ANDI R24,2
0428 3082 CPI R24,2
0429 F429 BNE 0x042F
(0563) {
(0564) write_sja(CMR, 0x0c);
042A E02C LDI R18,0xC
042B E001 LDI R16,1
042C DD22 RCALL _write_sja
(0565) return FALSE;
042D 2700 CLR R16
042E C032 RJMP 0x0461
(0566) }
(0567)
(0568) if((status&0x01) == 0x01)
042F 2F84 MOV R24,R20
0430 7081 ANDI R24,1
0431 3081 CPI R24,1
0432 F569 BNE 0x0460
(0569) {
(0570) if((read_sja(RXEFF) & 0x40) == 0x40) //如果RTR=1,为远程帧
0433 E100 LDI R16,0x10
0434 DD0D RCALL _read_sja
0435 2F80 MOV R24,R16
0436 7480 ANDI R24,0x40
0437 3480 CPI R24,0x40
0438 F421 BNE 0x043D
(0571) {
(0572) write_sja(CMR, 0x04); //则释放FXFIFO
0439 E024 LDI R18,4
043A E001 LDI R16,1
043B DD13 RCALL _write_sja
(0573) }
043C C023 RJMP 0x0460
(0574) else //为0,则是数据帧
(0575) {
(0576) sff = read_sja(prbuf) & 0x80; //取第一个字节的最高位
043D 2D0A MOV R16,R10
043E DD03 RCALL _read_sja
043F 2F80 MOV R24,R16
0440 7880 ANDI R24,0x80
0441 2EC8 MOV R12,R24
(0577) number = (read_sja(prbuf) & 0x0f);//取第一个字节的低四位,即数据长度
0442 2D0A MOV R16,R10
0443 DCFE RCALL _read_sja
0444 2F40 MOV R20,R16
0445 704F ANDI R20,0xF
(0578) if((sff & 0x80) == 0x80) //判断是标准帧还是扩展帧
0446 2D8C MOV R24,R12
0447 7880 ANDI R24,0x80
0448 3880 CPI R24,0x80
0449 F411 BNE 0x044C
(0579) number = number + 5; //扩展帧,则帧的总长度加5(13字节)
044A 5F4B SUBI R20,0xFB
044B C001 RJMP 0x044D
(0580) else
(0581) number = number + 3; //标准帧,则帧的总长度加3(11字节)
044C 5F4D SUBI R20,0xFD
(0582) for(i = 0; i < number; i++) //读取数据
044D 24CC CLR R12
044E C00B RJMP 0x045A
(0583) {
(0584) RX_Buffer[i]=read_sja(prbuf);
044F 2D0A MOV R16,R10
0450 DCF1 RCALL _read_sja
0451 E78F LDI R24,0x7F
0452 E090 LDI R25,0
0453 2DEC MOV R30,R12
0454 27FF CLR R31
0455 0FE8 ADD R30,R24
0456 1FF9 ADC R31,R25
0457 8300 STD R16,0+Z
(0585) prbuf++;
0458 94A3 INC R10
0459 94C3 INC R12
045A 16C4 CP R12,R20
045B F398 BCS 0x044F
(0586) }
(0587) result = TRUE; //读取到正确的数据则返回TRUE
045C E061 LDI R22,1
(0588) write_sja(CMR, 0x04); //最后释放FXFIFO
045D E024 LDI R18,4
045E E001 LDI R16,1
045F DCEF RCALL _write_sja
(0589) }
(0590) }
(0591) }
(0592) return result;
FILE: <library>
0460 2F06 MOV R16,R22
0461 940E04C4 CALL pop_gset4
0463 9508 RET
push_arg4:
0464 933A ST R19,-Y
0465 932A ST R18,-Y
push_arg2:
0466 931A ST R17,-Y
0467 930A ST R16,-Y
0468 9508 RET
push_lset:
0469 93FA ST R31,-Y
046A 93EA ST R30,-Y
046B 93BA ST R27,-Y
046C 93AA ST R26,-Y
046D 939A ST R25,-Y
046E 938A ST R24,-Y
046F 933A ST R19,-Y
0470 932A ST R18,-Y
0471 931A ST R17,-Y
0472 930A ST R16,-Y
0473 929A ST R9,-Y
0474 928A ST R8,-Y
0475 927A ST R7,-Y
0476 926A ST R6,-Y
0477 925A ST R5,-Y
0478 924A ST R4,-Y
0479 923A ST R3,-Y
047A 922A ST R2,-Y
047B 921A ST R1,-Y
047C 920A ST R0,-Y
047D B60F IN R0,P3F
047E 920A ST R0,-Y
047F 9508 RET
pop_lset:
0480 9009 LD R0,Y+
0481 BE0F OUT P3F,R0
0482 9009 LD R0,Y+
0483 9019 LD R1,Y+
0484 9029 LD R2,Y+
0485 9039 LD R3,Y+
0486 9049 LD R4,Y+
0487 9059 LD R5,Y+
0488 9069 LD R6,Y+
0489 9079 LD R7,Y+
048A 9089 LD R8,Y+
048B 9099 LD R9,Y+
048C 9109 LD R16,Y+
048D 9119 LD R17,Y+
048E 9129 LD R18,Y+
048F 9139 LD R19,Y+
0490 9189 LD R24,Y+
0491 9199 LD R25,Y+
0492 91A9 LD R26,Y+
0493 91B9 LD R27,Y+
0494 91E9 LD R30,Y+
0495 91F9 LD R31,Y+
0496 9508 RET
push_gset1:
0497 935A ST R21,-Y
0498 934A ST R20,-Y
0499 9508 RET
pop_gset1:
049A E0E1 LDI R30,1
pop:
049B 9149 LD R20,Y+
049C 9159 LD R21,Y+
049D FDE0 SBRC R30,0
049E 9508 RET
049F 9169 LD R22,Y+
04A0 9179 LD R23,Y+
04A1 FDE1 SBRC R30,1
04A2 9508 RET
04A3 90A9 LD R10,Y+
04A4 90B9 LD R11,Y+
04A5 FDE2 SBRC R30,2
04A6 9508 RET
04A7 90C9 LD R12,Y+
04A8 90D9 LD R13,Y+
04A9 FDE3 SBRC R30,3
04AA 9508 RET
04AB 90E9 LD R14,Y+
04AC 90F9 LD R15,Y+
04AD 9508 RET
push_gset2:
04AE 937A ST R23,-Y
04AF 936A ST R22,-Y
04B0 940C0497 JMP push_gset1
push_gset3:
04B2 92BA ST R11,-Y
04B3 92AA ST R10,-Y
04B4 940C04AE JMP push_gset2
push_gset4:
04B6 92DA ST R13,-Y
04B7 92CA ST R12,-Y
04B8 940C04B2 JMP push_gset3
push_gset5:
04BA 92FA ST R15,-Y
04BB 92EA ST R14,-Y
04BC 940C04B6 JMP push_gset4
pop_gset2:
04BE E0E2 LDI R30,2
04BF 940C049B JMP pop
pop_gset3:
04C1 E0E4 LDI R30,4
04C2 940C049B JMP pop
pop_gset4:
04C4 E0E8 LDI R30,0x8
04C5 940C049B JMP pop
pop_gset5:
04C7 27EE CLR R30
04C8 940C049B JMP pop
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -