📄 can_test.lst
字号:
00E4 075E CPC R21,R30
00E5 F3D0 BCS 0x00E0
(0107) write_sja(BTR0,0x04); //设置时钟分频器,500k
00E6 E024 LDI R18,4
00E7 E006 LDI R16,6
00E8 DFC8 RCALL _write_sja
(0108) write_sja(BTR1,0x1c);
00E9 E12C LDI R18,0x1C
00EA E007 LDI R16,7
00EB DFC5 RCALL _write_sja
(0109) write_sja(OCR,0x1a); //输出控制
00EC E12A LDI R18,0x1A
00ED E008 LDI R16,0x8
00EE DFC2 RCALL _write_sja
(0110) write_sja(RXERR,0x00);
00EF 2722 CLR R18
00F0 E00E LDI R16,0xE
00F1 DFBF RCALL _write_sja
(0111) write_sja(TXERR,0x00);
00F2 2722 CLR R18
00F3 E00F LDI R16,0xF
00F4 DFBC RCALL _write_sja
(0112) write_sja(ECC,0x00);
00F5 2722 CLR R18
00F6 E00C LDI R16,0xC
00F7 DFB9 RCALL _write_sja
(0113) write_sja(RBSA,0x00); //缓存器起始地址寄存器设置为0
00F8 2722 CLR R18
00F9 E10E LDI R16,0x1E
00FA DFB6 RCALL _write_sja
(0114)
(0115) write_sja(ACR0,0x00); //acceptcode default ffffffff
00FB 2722 CLR R18
00FC E100 LDI R16,0x10
00FD DFB3 RCALL _write_sja
(0116) write_sja(ACR1,0x00);
00FE 2722 CLR R18
00FF E101 LDI R16,0x11
0100 DFB0 RCALL _write_sja
(0117) write_sja(ACR2,0x00);
0101 2722 CLR R18
0102 E102 LDI R16,0x12
0103 DFAD RCALL _write_sja
(0118) write_sja(ACR3,0x00);
0104 2722 CLR R18
0105 E103 LDI R16,0x13
0106 DFAA RCALL _write_sja
(0119)
(0120) write_sja(AMR0,0xff); //acceptmask default ffffffff
0107 EF2F LDI R18,0xFF
0108 E104 LDI R16,0x14
0109 DFA7 RCALL _write_sja
(0121) write_sja(AMR0,0xff);
010A EF2F LDI R18,0xFF
010B E104 LDI R16,0x14
010C DFA4 RCALL _write_sja
(0122) write_sja(AMR0,0xff);
010D EF2F LDI R18,0xFF
010E E104 LDI R16,0x14
010F DFA1 RCALL _write_sja
(0123) write_sja(AMR0,0xff);
0110 EF2F LDI R18,0xFF
0111 E104 LDI R16,0x14
0112 DF9E RCALL _write_sja
(0124)
(0125) write_sja(IER,0x01); //开放接收中断
0113 E021 LDI R18,1
0114 E004 LDI R16,4
0115 DF9B RCALL _write_sja
(0126) write_sja(CMR,0x0c); //清除数据溢出和释放接收缓冲器;
0116 E02C LDI R18,0xC
0117 E001 LDI R16,1
0118 DF98 RCALL _write_sja
(0127) do
(0128) {
(0129) write_sja(MODE,0x08); //设置SJA1000 工作模式,单滤波接收工作模式
0119 E028 LDI R18,0x8
011A 2700 CLR R16
011B DF95 RCALL _write_sja
(0130) }
(0131) while((read_sja(MODE)&0x01)); //确认复位标志是否被删除
011C 2700 CLR R16
011D DF82 RCALL _read_sja
011E FD00 SBRC R16,0
011F CFF9 RJMP 0x0119
(0132) SEI();
0120 9478 BSET 7
0121 D14B RCALL pop_gset1
0122 9508 RET
(0133) }
(0134)
(0135) /*************************************************
(0136) SJA1000发送子函数
(0137) *************************************************/
(0138) void CanTransmit(void)
(0139) {
(0140) uchar status;
(0141) CLI(); //关中断
_CanTransmit:
status --> Y+1
0123 94F8 BCLR 7
(0142) TransBuffer[0]=0x88;
0124 E888 LDI R24,0x88
0125 93800078 STS TransBuffer,R24
(0143) TransBuffer[1]=0x00;
0127 2422 CLR R2
0128 92200079 STS TransBuffer+1,R2
(0144) TransBuffer[2]=0x00;
012A 9220007A STS TransBuffer+2,R2
(0145) TransBuffer[3]=0x00;
012C 9220007B STS TransBuffer+3,R2
(0146) TransBuffer[4]=0x00;
012E 9220007C STS 0x7C,R2
(0147) TransBuffer[5]=0x01;
0130 E081 LDI R24,1
0131 9380007D STS 0x7D,R24
(0148) TransBuffer[6]=0x02;
0133 E082 LDI R24,2
0134 9380007E STS 0x7E,R24
(0149) TransBuffer[7]=0x03;
0136 E083 LDI R24,3
0137 9380007F STS 0x7F,R24
(0150) TransBuffer[8]=0x04;
0139 E084 LDI R24,4
013A 93800080 STS 0x80,R24
(0151) TransBuffer[9]=0x05;
013C E085 LDI R24,5
013D 93800081 STS 0x81,R24
(0152) TransBuffer[10]=0x06;
013F E086 LDI R24,6
0140 93800082 STS 0x82,R24
(0153) TransBuffer[11]=0x07;
0142 E087 LDI R24,7
0143 93800083 STS 0x83,R24
(0154) TransBuffer[12]=0xaa;
0145 EA8A LDI R24,0xAA
0146 93800084 STS 0x84,R24
(0155) while(!(read_sja(SR)&0x04)); //wait until reg2^2==1 ,即判断发送缓冲器的状态
0148 E002 LDI R16,2
0149 DF56 RCALL _read_sja
014A FF02 SBRS R16,2
014B CFFC RJMP 0x0148
(0156) write_sja(TXEFF,TransBuffer[0]); //扩展帧,数据长度为8个字节
014C 91200078 LDS R18,TransBuffer
014E E100 LDI R16,0x10
014F DF61 RCALL _write_sja
(0157) write_sja(TXID0,TransBuffer[1]);
0150 91200079 LDS R18,TransBuffer+1
0152 E101 LDI R16,0x11
0153 DF5D RCALL _write_sja
(0158) write_sja(TXID1,TransBuffer[2]);
0154 9120007A LDS R18,TransBuffer+2
0156 E102 LDI R16,0x12
0157 DF59 RCALL _write_sja
(0159) write_sja(TXID2,TransBuffer[3]);
0158 9120007B LDS R18,TransBuffer+3
015A E103 LDI R16,0x13
015B DF55 RCALL _write_sja
(0160) write_sja(TXID3,TransBuffer[4]);
015C 9120007C LDS R18,0x7C
015E E104 LDI R16,0x14
015F DF51 RCALL _write_sja
(0161) write_sja(TXDATA0,TransBuffer[5]);
0160 9120007D LDS R18,0x7D
0162 E105 LDI R16,0x15
0163 DF4D RCALL _write_sja
(0162) write_sja(TXDATA1,TransBuffer[6]);
0164 9120007E LDS R18,0x7E
0166 E106 LDI R16,0x16
0167 DF49 RCALL _write_sja
(0163) write_sja(TXDATA2,TransBuffer[7]);
0168 9120007F LDS R18,0x7F
016A E107 LDI R16,0x17
016B DF45 RCALL _write_sja
(0164) write_sja(TXDATA3,TransBuffer[8]);
016C 91200080 LDS R18,0x80
016E E108 LDI R16,0x18
016F DF41 RCALL _write_sja
(0165) write_sja(TXDATA4,TransBuffer[9]);
0170 91200081 LDS R18,0x81
0172 E109 LDI R16,0x19
0173 DF3D RCALL _write_sja
(0166) write_sja(TXDATA5,TransBuffer[10]);
0174 91200082 LDS R18,0x82
0176 E10A LDI R16,0x1A
0177 DF39 RCALL _write_sja
(0167) write_sja(TXDATA6,TransBuffer[11]);
0178 91200083 LDS R18,0x83
017A E10B LDI R16,0x1B
017B DF35 RCALL _write_sja
(0168) write_sja(TXDATA7,TransBuffer[12]);
017C 91200084 LDS R18,0x84
017E E10C LDI R16,0x1C
017F DF31 RCALL _write_sja
(0169) write_sja(CMR,0x01); //发送请求命令
0180 E021 LDI R18,1
0181 E001 LDI R16,1
0182 DF2E RCALL _write_sja
(0170) while(!(read_sja(SR) & 0x08));//检测SR.3位,判断发送是否完成
0183 E002 LDI R16,2
0184 DF1B RCALL _read_sja
0185 FF03 SBRS R16,3
0186 CFFC RJMP 0x0183
(0171) SEI(); //开中断
0187 9478 BSET 7
0188 9508 RET
_Receive:
RxData --> Y+0
sff --> R12
number --> R20
result --> R22
status --> R20
prbuf --> R10
i --> R12
0189 D0DA RCALL push_gset4
018A 972D SBIW R28,0xD
(0172) }
(0173) /*
(0174) void Search(void) //查询方式接收
(0175) {
(0176) uchar SearchStatus=read_sja(SR); //读取状态寄存器
(0177) if(!(SearchStatus & 0xc3)) //是否存在总线关闭、错误状态、数据溢出、有数据位等状态
(0178) {
(0179) if((SearchStatus & 0x80) != 0)//如果总线关闭
(0180) {
(0181) read_sja(IR); //读取中断寄存器,清除中断位
(0182) write_sja(MODE,0x08);
(0183) }
(0184) else
(0185) {
(0186) read_sja(IR);
(0187) if((read_sja(IR) & 0x08) != 0)//如果有数据溢出
(0188) write_sja(CMR,0x0c); //在命令寄存器中清除数据溢出和释放接收缓冲区
(0189) else
(0190) {
(0191) if((read_sja(IR) & 0x01) != 0)//IR.0=1,接收缓冲区有数据
(0192) {
(0193) Status_lighting(1);
(0194) RevFlag=1;
(0195) }
(0196) }
(0197) }
(0198) }
(0199) }*/
(0200)
(0201)
(0202) uchar Receive(void)
(0203) {
(0204) uchar result=FALSE;
018B 2766 CLR R22
(0205) uchar status,number,i,sff;
(0206) uchar prbuf;
(0207) uchar RxData[13];
(0208) status=read_sja(SR);
018C E002 LDI R16,2
018D DF12 RCALL _read_sja
018E 2F40 MOV R20,R16
(0209) prbuf=RXEFF;
018F E180 LDI R24,0x10
0190 2EA8 MOV R10,R24
(0210) if((status&0xc3)!=0) //读取总线脱离、错误状态、接收溢出、有数据等位
0191 2F84 MOV R24,R20
0192 7C83 ANDI R24,0xC3
0193 F409 BNE 0x0195
0194 C043 RJMP 0x01D8
(0211) {
(0212) if((status&0x80)==0x80)
0195 2F84 MOV R24,R20
0196 7880 ANDI R24,0x80
0197 3880 CPI R24,0x80
0198 F429 BNE 0x019E
(0213) {
(0214) write_sja(MODE,0x00);
0199 2722 CLR R18
019A 2700 CLR R16
019B DF15 RCALL _write_sja
(0215) return FALSE;
019C 2700 CLR R16
019D C03B RJMP 0x01D9
(0216) }
(0217) if((status&0x02)==0x02)
019E 2F84 MOV R24,R20
019F 7082 ANDI R24,2
01A0 3082 CPI R24,2
01A1 F429 BNE 0x01A7
(0218) {
(0219) write_sja(CMR,0x0c);
01A2 E02C LDI R18,0xC
01A3 E001 LDI R16,1
01A4 DF0C RCALL _write_sja
(0220) return FALSE;
01A5 2700 CLR R16
01A6 C032 RJMP 0x01D9
(0221) }
(0222)
(0223) if((status&0x01)==0x01)
01A7 2F84 MOV R24,R20
01A8 7081 ANDI R24,1
01A9 3081 CPI R24,1
01AA F569 BNE 0x01D8
(0224) {
(0225) if((read_sja(RXEFF)&0x40)==0x40) //如果RTR=1,为远程帧
01AB E100 LDI R16,0x10
01AC DEF3 RCALL _read_sja
01AD 2F80 MOV R24,R16
01AE 7480 ANDI R24,0x40
01AF 3480 CPI R24,0x40
01B0 F421 BNE 0x01B5
(0226) {
(0227) write_sja(CMR,0x04); //则释放FXFIFO
01B1 E024 LDI R18,4
01B2 E001 LDI R16,1
01B3 DEFD RCALL _write_sja
(0228) }
01B4 C023 RJMP 0x01D8
(0229) else //为0,则是数据帧
(0230) {
(0231) sff=read_sja(prbuf)&0x80; //取第一个字节的最高位
01B5 2D0A MOV R16,R10
01B6 DEE9 RCALL _read_sja
01B7 2F80 MOV R24,R16
01B8 7880 ANDI R24,0x80
01B9 2EC8 MOV R12,R24
(0232) number=(read_sja(prbuf)&0x0f);//取第一个字节的低四位,即数据长度
01BA 2D0A MOV R16,R10
01BB DEE4 RCALL _read_sja
01BC 2F40 MOV R20,R16
01BD 704F ANDI R20,0xF
(0233) if ((sff&0x80)==0x80) //判断是标准帧还是扩展帧
01BE 2D8C MOV R24,R12
01BF 7880 ANDI R24,0x80
01C0 3880 CPI R24,0x80
01C1 F411 BNE 0x01C4
(0234) number=number+5; //扩展帧,则帧的总长度加5(13字节)
01C2 5F4B SUBI R20,0xFB
01C3 C001 RJMP 0x01C5
(0235) else
(0236) number=number+3; //标准帧,则帧的总长度加3(11字节)
01C4 5F4D SUBI R20,0xFD
(0237) for(i=0;i<number;i++) //读取数据
01C5 24CC CLR R12
01C6 C00B RJMP 0x01D2
(0238) {
(0239) RxBuffer[i]=read_sja(prbuf);
01C7 2D0A MOV R16,R10
01C8 DED7 RCALL _read_sja
01C9 E885 LDI R24,0x85
01CA E090 LDI R25,0
01CB 2DEC MOV R30,R12
01CC 27FF CLR R31
01CD 0FE8 ADD R30,R24
01CE 1FF9 ADC R31,R25
01CF 8300 STD Z+0,R16
(0240) prbuf++;
01D0 94A3 INC R10
01D1 94C3 INC R12
01D2 16C4 CP R12,R20
01D3 F398 BCS 0x01C7
(0241) }
(0242) result=TRUE; //读取到正确的数据则返回TRUE
01D4 E061 LDI R22,1
(0243) write_sja(CMR,0x04); //最后释放FXFIFO
01D5 E024 LDI R18,4
01D6 E001 LDI R16,1
01D7 DED9 RCALL _write_sja
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -