📄 main.lst
字号:
(0129) sja_write_data(TXERR,0x00);
033C 2722 CLR R18
033D E00F LDI R16,0xF
033E DFB1 RCALL _sja_write_data
(0130) sja_write_data(ECC,0x00); //错误代码捕捉寄存器清零
033F 2722 CLR R18
0340 E00C LDI R16,0xC
0341 DFAE RCALL _sja_write_data
(0131)
(0132) sja_write_data(RBSA,0x00); //缓存器起始地址寄存器设置为0
0342 2722 CLR R18
0343 E10E LDI R16,0x1E
0344 DFAB RCALL _sja_write_data
(0133)
(0134) sja_write_data(ACR0,ACR0_ID); //验收屏蔽
0345 2722 CLR R18
0346 E100 LDI R16,0x10
0347 DFA8 RCALL _sja_write_data
(0135) sja_write_data(ACR1,ACR1_ID);
0348 2722 CLR R18
0349 E101 LDI R16,0x11
034A DFA5 RCALL _sja_write_data
(0136) sja_write_data(ACR2,ACR2_ID);
034B 2722 CLR R18
034C E102 LDI R16,0x12
034D DFA2 RCALL _sja_write_data
(0137) sja_write_data(ACR3,ACR3_ID);
034E 2722 CLR R18
034F E103 LDI R16,0x13
0350 DF9F RCALL _sja_write_data
(0138)
(0139) sja_write_data(AMR0,AMR0_ID);
0351 EF2F LDI R18,0xFF
0352 E104 LDI R16,0x14
0353 DF9C RCALL _sja_write_data
(0140) sja_write_data(AMR1,AMR1_ID);
0354 EF2F LDI R18,0xFF
0355 E105 LDI R16,0x15
0356 DF99 RCALL _sja_write_data
(0141) sja_write_data(AMR2,AMR2_ID);
0357 EF2F LDI R18,0xFF
0358 E106 LDI R16,0x16
0359 DF96 RCALL _sja_write_data
(0142) sja_write_data(AMR3,AMR3_ID);
035A EF2F LDI R18,0xFF
035B E107 LDI R16,0x17
035C DF93 RCALL _sja_write_data
(0143)
(0144) sja_write_data(IER,REG_IER_DATA); //开放接收中断
035D E821 LDI R18,0x81
035E E004 LDI R16,4
035F DF90 RCALL _sja_write_data
(0145)
(0146) sja_write_data(CMR,COS_CMD); //清除数据溢出
0360 E028 LDI R18,0x8
0361 E001 LDI R16,1
0362 DF8D RCALL _sja_write_data
(0147) delay_nus(10);
0363 E00A LDI R16,0xA
0364 E010 LDI R17,0
0365 DD21 RCALL _delay_nus
(0148) sja_write_data(CMR,RRB_CMD); //释放接收缓冲器
0366 E024 LDI R18,4
0367 E001 LDI R16,1
0368 DF87 RCALL _sja_write_data
(0149)
(0150) do
(0151) {
(0152) //sja_write_data(MODE,0x04); //设置SJA1000 工作模式;zijiance
(0153) sja_write_data(MODE,0x08); //设置SJA1000 工作模式
0369 E028 LDI R18,0x8
036A 2700 CLR R16
036B DF84 RCALL _sja_write_data
(0154) }
(0155) while((sja_read_data(MODE)&0x01)); //确认复位标志是否被删除
036C 2700 CLR R16
036D DF92 RCALL _sja_read_data
036E FD00 SBRC R16,0
036F CFF9 RJMP 0x0369
(0156)
(0157) SEI();
0370 9478 BSET 7
0371 9508 RET
_sja_tx_service:
FF --> R10
Length --> R12
i --> R14
0372 940E06CA CALL push_gset5x
(0158) }
(0159)
(0160) /********************************************************************
(0161) * 函数说明:SJA1000中断发送服务程序,若有待发送报文则及时发送 *
(0162) * 输入:无 *
(0163) * 输出:无 *
(0164) ********************************************************************/
(0165) void sja_tx_service(void)
(0166) {
(0167) unsigned char Length;
(0168) unsigned char FF,i;
(0169) if(flag.mess_wait==TRUE)
0374 91800071 LDS R24,flag
0376 7081 ANDI R24,1
0377 3081 CPI R24,1
0378 F009 BEQ 0x037A
0379 C049 RJMP 0x03C3
(0170) {
(0171) led_on;
037A 9897 CBI 0x12,7
(0172) flag.mess_wait=FALSE; //清报文待发送标志
037B 91800071 LDS R24,flag
037D 7F8E ANDI R24,0xFE
037E 93800071 STS flag,R24
(0173) FF=TransmitMessage[0]&0x80; //取贞格式
0380 918000B9 LDS R24,TransmitMessage
0382 7880 ANDI R24,0x80
0383 2EA8 MOV R10,R24
(0174) Length=TransmitMessage[0]&0x0f; //取数据长度代码
0384 918000B9 LDS R24,TransmitMessage
0386 708F ANDI R24,0xF
(0175)
(0176) if(Length=0x08)
0387 E088 LDI R24,0x8
0388 2EC8 MOV R12,R24
0389 20CC TST R12
038A F011 BEQ 0x038D
(0177) {
(0178) Length = 0x80;
038B E880 LDI R24,0x80
038C 2EC8 MOV R12,R24
(0179) }
(0180)
(0181) sja_write_data(TXEFF,TransmitMessage[0]); //写TX贞报文
038D 912000B9 LDS R18,TransmitMessage
038F E100 LDI R16,0x10
0390 DF5F RCALL _sja_write_data
(0182) sja_write_data(TXID0,TransmitMessage[1]); //写TX标识码1
0391 912000BA LDS R18,TransmitMessage+1
0393 E101 LDI R16,0x11
0394 DF5B RCALL _sja_write_data
(0183) sja_write_data(TXID1,TransmitMessage[2]);
0395 912000BB LDS R18,TransmitMessage+2
0397 E102 LDI R16,0x12
0398 DF57 RCALL _sja_write_data
(0184) if(FF) //FF=0:标准CAN格式
0399 20AA TST R10
039A F041 BEQ 0x03A3
(0185) { //FF=1:扩展CAN格式
(0186) sja_write_data(TXID2,TransmitMessage[3]);
039B 912000BC LDS R18,TransmitMessage+3
039D E103 LDI R16,0x13
039E DF51 RCALL _sja_write_data
(0187) sja_write_data(TXID3,TransmitMessage[4]);
039F 912000BD LDS R18,0xBD
03A1 E104 LDI R16,0x14
03A2 DF4D RCALL _sja_write_data
(0188) }
(0189) for (i=0;i<Length;i++)
03A3 24EE CLR R14
03A4 C018 RJMP 0x03BD
(0190) {
(0191) if(FF)
03A5 20AA TST R10
03A6 F059 BEQ 0x03B2
(0192) sja_write_data(TXDATA0+i,TransmitMessage[5+i]);
03A7 EB8E LDI R24,0xBE
03A8 E090 LDI R25,0
03A9 2DEE MOV R30,R14
03AA 27FF CLR R31
03AB 0FE8 ADD R30,R24
03AC 1FF9 ADC R31,R25
03AD 8120 LDD R18,Z+0
03AE 2D0E MOV R16,R14
03AF 5E0B SUBI R16,0xEB
03B0 DF3F RCALL _sja_write_data
03B1 C00A RJMP 0x03BC
(0193) else
(0194) sja_write_data(TXDATA0+i,TransmitMessage[3+i]);
03B2 EB8C LDI R24,0xBC
03B3 E090 LDI R25,0
03B4 2DEE MOV R30,R14
03B5 27FF CLR R31
03B6 0FE8 ADD R30,R24
03B7 1FF9 ADC R31,R25
03B8 8120 LDD R18,Z+0
03B9 2D0E MOV R16,R14
03BA 5E0B SUBI R16,0xEB
03BB DF34 RCALL _sja_write_data
03BC 94E3 INC R14
03BD 14EC CP R14,R12
03BE F330 BCS 0x03A5
(0195) }
(0196) led_off;
03BF 9A97 SBI 0x12,7
(0197) //置位发送请求
(0198) //sja_write_data(CMR,0x10); //发送请求命令:zijieshou
(0199) sja_write_data(CMR,0x01); //发送请求命令当错误时可重发
03C0 E021 LDI R18,1
03C1 E001 LDI R16,1
03C2 DF2D RCALL _sja_write_data
(0200) }
03C3 940E06C0 CALL pop_gset5x
03C5 9508 RET
_sja_tx:
sreg --> Y+0
FF --> R12
Length --> R10
state --> R14
i --> R14
TransmitMessage --> Y+7
03C6 931A ST R17,-Y
03C7 930A ST R16,-Y
03C8 940E06CA CALL push_gset5x
03CA 9721 SBIW R28,1
(0201) }
(0202)
(0203) /********************************************************************
(0204) * 函数说明:SJA1000发送服务程序 *
(0205) * 输入:RAM中以TransmitMessage开始的CAN的发送报文 *
(0206) * 输出:无 *
(0207) ********************************************************************/
(0208) void sja_tx(unsigned char *TransmitMessage)
(0209) {
(0210) unsigned char Length;
(0211) unsigned char FF,i,state;
(0212)
(0213) unsigned char sreg;
(0214) sreg=SREG; //保存全局中断标志
03CB B62F IN R2,0x3F
03CC 8228 STD Y+0,R2
(0215) CLI();
03CD 94F8 BCLR 7
(0216)
(0217) state=sja_read_data(SR); //读状态寄存器
03CE E002 LDI R16,2
03CF DF30 RCALL _sja_read_data
03D0 2EE0 MOV R14,R16
(0218) while(state&(1<<4)); //正在接受则等待
03D1 FCE4 SBRC R14,4
03D2 CFFE RJMP 0x03D1
(0219) // while(state&(1<<3)); //上次发送未完成则等待
(0220) if(state&(1<<2)) //判断发送缓冲是否释放
03D3 FEE2 SBRS R14,2
03D4 C049 RJMP 0x041E
(0221) {
(0222) led_on;
03D5 9897 CBI 0x12,7
(0223) FF=TransmitMessage[0]&0x80; //取贞格式
03D6 81EF LDD R30,Y+7
03D7 85F8 LDD R31,Y+8
03D8 8180 LDD R24,Z+0
03D9 7880 ANDI R24,0x80
03DA 2EC8 MOV R12,R24
(0224) Length=TransmitMessage[0]&0x0f; //取数据长度代码
03DB 8180 LDD R24,Z+0
03DC 708F ANDI R24,0xF
03DD 2EA8 MOV R10,R24
(0225) #ifdef DEBUG
(0226) rprintfCRLF();
(0227) rprintfStr("begin transmit...");
(0228) rprintfCRLF();
(0229) #endif
(0230) if(Length>8)
03DE E088 LDI R24,0x8
03DF 158A CP R24,R10
03E0 F408 BCC 0x03E2
(0231) {
(0232) Length = 8;
03E1 2EA8 MOV R10,R24
(0233) }
(0234) sja_write_data(TXEFF,TransmitMessage[0]); //写TX贞报文
03E2 81EF LDD R30,Y+7
03E3 85F8 LDD R31,Y+8
03E4 8120 LDD R18,Z+0
03E5 E100 LDI R16,0x10
03E6 DF09 RCALL _sja_write_data
(0235) sja_write_data(TXID0,TransmitMessage[1]); //写TX标识码1
03E7 81EF LDD R30,Y+7
03E8 85F8 LDD R31,Y+8
03E9 8121 LDD R18,Z+1
03EA E101 LDI R16,0x11
03EB DF04 RCALL _sja_write_data
(0236) sja_write_data(TXID1,TransmitMessage[2]);
03EC 81EF LDD R30,Y+7
03ED 85F8 LDD R31,Y+8
03EE 8122 LDD R18,Z+2
03EF E102 LDI R16,0x12
03F0 DEFF RCALL _sja_write_data
(0237) if(FF) //FF=0:标准CAN格式
03F1 20CC TST R12
03F2 F051 BEQ 0x03FD
(0238) { //FF=1:扩展CAN格式
(0239) sja_write_data(TXID2,TransmitMessage[3]);
03F3 81EF LDD R30,Y+7
03F4 85F8 LDD R31,Y+8
03F5 8123 LDD R18,Z+3
03F6 E103 LDI R16,0x13
03F7 DEF8 RCALL _sja_write_data
(0240) sja_write_data(TXID3,TransmitMessage[4]);
03F8 81EF LDD R30,Y+7
03F9 85F8 LDD R31,Y+8
03FA 8124 LDD R18,Z+4
03FB E104 LDI R16,0x14
03FC DEF3 RCALL _sja_write_data
(0241) }
(0242) for (i=0;i<Length;i++)
03FD 24EE CLR R14
03FE C018 RJMP 0x0417
(0243) {
(0244) if(FF)
03FF 20CC TST R12
0400 F059 BEQ 0x040C
(0245) sja_write_data(21+i,TransmitMessage[5+i]);
0401 2DEE MOV R30,R14
0402 27FF CLR R31
0403 800F LDD R0,Y+7
0404 8418 LDD R1,Y+8
0405 0DE0 ADD R30,R0
0406 1DF1 ADC R31,R1
0407 8125 LDD R18,Z+5
0408 2D0E MOV R16,R14
0409 5E0B SUBI R16,0xEB
040A DEE5 RCALL _sja_write_data
040B C00A RJMP 0x0416
(0246) else
(0247) sja_write_data(19+i,TransmitMessage[3+i]);
040C 2DEE MOV R30,R14
040D 27FF CLR R31
040E 800F LDD R0,Y+7
040F 8418 LDD R1,Y+8
0410 0DE0 ADD R30,R0
0411 1DF1 ADC R31,R1
0412 8123 LDD R18,Z+3
0413 2D0E MOV R16,R14
0414 5E0D SUBI R16,0xED
0415 DEDA RCALL _sja_write_data
0416 94E3 INC R14
0417 14EA CP R14,R10
0418 F330 BCS 0x03FF
(0248) }
(0249) //置位发送请求
(0250) //sja_write_data(CMR,0x10); //发送请求命令
(0251) sja_write_data(CMR,0x01); //发送请求命令当错误时可重发
0419 E021 LDI R18,1
041A E001 LDI R16,1
041B DED4 RCALL _sja_write_data
(0252) led_off;
041C 9A97 SBI 0x12,7
(0253) #ifdef DEBUG
(0254) rprintfStr("transmit over");
(0255) rprintfCRLF();
(0256) rprintfCRLF();
(0257) #endif
(0258) }
041D C005 RJMP 0x0423
(0259) else //发送缓冲被锁,将数据存入RAM缓存
(0260) {
(0261) flag.mess_wait=TRUE;
041E 91800071 LDS R24,flag
0420 6081 ORI R24,1
0421 93800071 STS flag,R24
(0262) }
(0263)
(0264) SREG=sreg;
0423 8008 LDD R0,Y+0
0424 BE0F OUT 0x3F,R0
(0265) SEI();
0425 9478 BSET 7
0426 9621 ADIW R28,1
0427 940E06C0 CALL pop_gset5x
0429 9622 ADIW R28,2
042A 9508 RET
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -