📄 canmonitor.lst
字号:
(0178) Length = 0x80;
2F2 E880 LDI R24,0x80
2F3 2EC8 MOV R12,R24
(0179) }
(0180)
(0181) sja_write_data(TXEFF,TransmitMessage[0]); //写TX贞报文
2F4 9120 00B9 LDS R18,TransmitMessage
2F6 E100 LDI R16,0x10
2F7 DF61 RCALL _sja_write_data
(0182) sja_write_data(TXID0,TransmitMessage[1]); //写TX标识码1
2F8 9120 00BA LDS R18,TransmitMessage+1
2FA E101 LDI R16,0x11
2FB DF5D RCALL _sja_write_data
(0183) sja_write_data(TXID1,TransmitMessage[2]);
2FC 9120 00BB LDS R18,TransmitMessage+2
2FE E102 LDI R16,0x12
2FF DF59 RCALL _sja_write_data
(0184) if(FF) //FF=0:标准CAN格式
300 20EE TST R14
301 F041 BEQ 0x030A
(0185) { //FF=1:扩展CAN格式
(0186) sja_write_data(TXID2,TransmitMessage[3]);
302 9120 00BC LDS R18,TransmitMessage+3
304 E103 LDI R16,0x13
305 DF53 RCALL _sja_write_data
(0187) sja_write_data(TXID3,TransmitMessage[4]);
306 9120 00BD LDS R18,0x00BD
308 E104 LDI R16,0x14
309 DF4F RCALL _sja_write_data
(0188) }
(0189) for (i=0;i<Length;i++)
30A 24AA CLR R10
30B C018 RJMP 0x0324
(0190) {
(0191) if(FF)
30C 20EE TST R14
30D F059 BEQ 0x0319
(0192) sja_write_data(TXDATA0+i,TransmitMessage[5+i]);
30E EB8E LDI R24,0xBE
30F E090 LDI R25,0
310 2DEA MOV R30,R10
311 27FF CLR R31
312 0FE8 ADD R30,R24
313 1FF9 ADC R31,R25
314 8120 LDD R18,Z+0
315 2D0A MOV R16,R10
316 5E0B SUBI R16,0xEB
317 DF41 RCALL _sja_write_data
318 C00A RJMP 0x0323
(0193) else
(0194) sja_write_data(TXDATA0+i,TransmitMessage[3+i]);
319 EB8C LDI R24,0xBC
31A E090 LDI R25,0
31B 2DEA MOV R30,R10
31C 27FF CLR R31
31D 0FE8 ADD R30,R24
31E 1FF9 ADC R31,R25
31F 8120 LDD R18,Z+0
320 2D0A MOV R16,R10
321 5E0B SUBI R16,0xEB
322 DF36 RCALL _sja_write_data
323 94A3 INC R10
324 14AC CP R10,R12
325 F330 BCS 0x030C
(0195) }
(0196) led_off;
326 9A97 SBI 0x12,7
(0197) //置位发送请求
(0198) //sja_write_data(CMR,0x10); //发送请求命令:zijieshou
(0199) sja_write_data(CMR,0x01); //发送请求命令当错误时可重发
327 E021 LDI R18,1
328 E001 LDI R16,1
329 DF2F RCALL _sja_write_data
(0200) }
32A 940C 0664 JMP pop_xgset00FC
_sja_tx:
sreg --> Y,+0
FF --> R10
Length --> R12
state --> R10
i --> R14
TransmitMessage --> Y,+7
32C 931A ST R17,-Y
32D 930A ST R16,-Y
32E 940E 066F CALL push_xgset00FC
330 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; //保存全局中断标志
331 B62F IN R2,0x3F
332 8228 STD Y+0,R2
(0215) CLI();
333 94F8 BCLR 7
(0216)
(0217) state=sja_read_data(SR); //读状态寄存器
334 E002 LDI R16,2
335 DF33 RCALL _sja_read_data
336 2EA0 MOV R10,R16
(0218) while(state&(1<<4)); //正在接受则等待
337 FCA4 SBRC R10,4
338 CFFE RJMP 0x0337
(0219) // while(state&(1<<3)); //上次发送未完成则等待
(0220) if(state&(1<<2)) //判断发送缓冲是否释放
339 FEA2 SBRS R10,2
33A C049 RJMP 0x0384
(0221) {
(0222) led_on;
33B 9897 CBI 0x12,7
(0223) FF=TransmitMessage[0]&0x80; //取贞格式
33C 81EF LDD R30,Y+7
33D 85F8 LDD R31,Y+8
33E 8180 LDD R24,Z+0
33F 7880 ANDI R24,0x80
340 2EA8 MOV R10,R24
(0224) Length=TransmitMessage[0]&0x0f; //取数据长度代码
341 8180 LDD R24,Z+0
342 708F ANDI R24,0xF
343 2EC8 MOV R12,R24
(0225) #ifdef DEBUG
(0226) rprintfCRLF();
(0227) rprintfStr("begin transmit...");
(0228) rprintfCRLF();
(0229) #endif
(0230) if(Length>8)
344 E088 LDI R24,0x8
345 158C CP R24,R12
346 F408 BCC 0x0348
(0231) {
(0232) Length = 8;
347 2EC8 MOV R12,R24
(0233) }
(0234) sja_write_data(TXEFF,TransmitMessage[0]); //写TX贞报文
348 81EF LDD R30,Y+7
349 85F8 LDD R31,Y+8
34A 8120 LDD R18,Z+0
34B E100 LDI R16,0x10
34C DF0C RCALL _sja_write_data
(0235) sja_write_data(TXID0,TransmitMessage[1]); //写TX标识码1
34D 81EF LDD R30,Y+7
34E 85F8 LDD R31,Y+8
34F 8121 LDD R18,Z+1
350 E101 LDI R16,0x11
351 DF07 RCALL _sja_write_data
(0236) sja_write_data(TXID1,TransmitMessage[2]);
352 81EF LDD R30,Y+7
353 85F8 LDD R31,Y+8
354 8122 LDD R18,Z+2
355 E102 LDI R16,0x12
356 DF02 RCALL _sja_write_data
(0237) if(FF) //FF=0:标准CAN格式
357 20AA TST R10
358 F051 BEQ 0x0363
(0238) { //FF=1:扩展CAN格式
(0239) sja_write_data(TXID2,TransmitMessage[3]);
359 81EF LDD R30,Y+7
35A 85F8 LDD R31,Y+8
35B 8123 LDD R18,Z+3
35C E103 LDI R16,0x13
35D DEFB RCALL _sja_write_data
(0240) sja_write_data(TXID3,TransmitMessage[4]);
35E 81EF LDD R30,Y+7
35F 85F8 LDD R31,Y+8
360 8124 LDD R18,Z+4
361 E104 LDI R16,0x14
362 DEF6 RCALL _sja_write_data
(0241) }
(0242) for (i=0;i<Length;i++)
363 24EE CLR R14
364 C018 RJMP 0x037D
(0243) {
(0244) if(FF)
365 20AA TST R10
366 F059 BEQ 0x0372
(0245) sja_write_data(21+i,TransmitMessage[5+i]);
367 2DEE MOV R30,R14
368 27FF CLR R31
369 800F LDD R0,Y+7
36A 8418 LDD R1,Y+8
36B 0DE0 ADD R30,R0
36C 1DF1 ADC R31,R1
36D 8125 LDD R18,Z+5
36E 2D0E MOV R16,R14
36F 5E0B SUBI R16,0xEB
370 DEE8 RCALL _sja_write_data
371 C00A RJMP 0x037C
(0246) else
(0247) sja_write_data(19+i,TransmitMessage[3+i]);
372 2DEE MOV R30,R14
373 27FF CLR R31
374 800F LDD R0,Y+7
375 8418 LDD R1,Y+8
376 0DE0 ADD R30,R0
377 1DF1 ADC R31,R1
378 8123 LDD R18,Z+3
379 2D0E MOV R16,R14
37A 5E0D SUBI R16,0xED
37B DEDD RCALL _sja_write_data
37C 94E3 INC R14
37D 14EC CP R14,R12
37E F330 BCS 0x0365
(0248) }
(0249) //置位发送请求
(0250) //sja_write_data(CMR,0x10); //发送请求命令
(0251) sja_write_data(CMR,0x01); //发送请求命令当错误时可重发
37F E021 LDI R18,1
380 E001 LDI R16,1
381 DED7 RCALL _sja_write_data
(0252) led_off;
382 9A97 SBI 0x12,7
(0253) #ifdef DEBUG
(0254) rprintfStr("transmit over");
(0255) rprintfCRLF();
(0256) rprintfCRLF();
(0257) #endif
(0258) }
383 C005 RJMP 0x0389
(0259) else //发送缓冲被锁,将数据存入RAM缓存
(0260) {
(0261) flag.mess_wait=TRUE;
384 9180 0071 LDS R24,flag
386 6081 ORI R24,1
387 9380 0071 STS flag,R24
(0262) }
(0263)
(0264) SREG=sreg;
389 8008 LDD R0,Y+0
38A BE0F OUT 0x3F,R0
(0265) SEI();
38B 9478 BSET 7
38C 9621 ADIW R28,1
38D 940E 0664 CALL pop_xgset00FC
38F 9622 ADIW R28,2
390 9508 RET
_sja_rx_service:
ptr --> Y,+0
number --> R10
i --> R12
391 940E 066F CALL push_xgset00FC
393 9721 SBIW R28,1
(0266) }
(0267)
(0268)
(0269) /********************************************************************
(0270) * 函数说明:SJA1000接受中断服务函数, *
(0271) * 输入:无 *
(0272) * 输出:正确读取返回TURE否则返回FALSE 。 *
(0273) * 影响变量:接受缓冲在正确读取时被刷新 *
(0274) ********************************************************************/
(0275) void sja_rx_service(void)
(0276) {
(0277) unsigned char number,i,ptr;
(0278) ptr=RXEFF;
394 E180 LDI R24,0x10
395 8388 STD Y+0,R24
(0279) if((sja_read_data(RXEFF)&0x40)==0x40) //如果RTR=1,为远程帧
396 E100 LDI R16,0x10
397 DED1 RCALL _sja_read_data
398 2F80 MOV R24,R16
399 7480 ANDI R24,0x40
39A 3480 CPI R24,0x40
39B F421 BNE 0x03A0
(0280) {
(0281) sja_write_data(CMR,0x04); //则释放接收缓冲
39C E024 LDI R18,4
39D E001 LDI R16,1
39E DEBA RCALL _sja_write_data
(0282) }
39F C02B RJMP 0x03CB
(0283) else //为0,则是数据帧
(0284) {
(0285) number=(sja_read_data(RXEFF)&0x0f);//取第一个字节的低四位,即数据长度
3A0 E100 LDI R16,0x10
3A1 DEC7 RCALL _sja_read_data
3A2 2F80 MOV R24,R16
3A3 708F ANDI R24,0xF
3A4 2EA8 MOV R10,R24
(0286) if (number>0x08)
3A5 E088 LDI R24,0x8
3A6 158A CP R24,R10
3A7 F408 BCC 0x03A9
(0287) number=0x08;
3A8 2EA8 MOV R10,R24
(0288) if ((sja_read_data(RXEFF))&0x80) //判断是标准帧还是扩展帧
3A9 E100 LDI R16,0x10
3AA DEBE RCALL _sja_read_data
3AB 2EC0 MOV R12,R16
3AC FF07 SBRS R16,7
3AD C004 RJMP 0x03B2
(0289) {
(0290) number=number+5; //扩展帧,则帧的总长度加5(13字节)
3AE 2D8A MOV R24,R10
3AF 5F8B SUBI R24,0xFB
3B0 2EA8 MOV R10,R24
(0291) }
3B1 C003 RJMP 0x03B5
(0292) else
(0293) {
(0294) number=number+3; //标准帧,则帧的总长度加3(11字节)
3B2 2D8A MOV R24,R10
3B3 5F8D SUBI R24,0xFD
3B4 2EA8 MOV R10,R24
(0295) }
(0296) for(i=0;i<number;i++) //读取数据
3B5 24CC CLR R12
3B6 C00F RJMP 0x03C6
(0297) {
(0298) RxBuffer[i]=sja_read_data(RXEFF+i);
3B7 2D0C MOV R16,R12
3B8 5F00 SUBI R16,0xF0
3B9 DEAF RCALL _sja_read_data
3BA 2EE0 MOV R14,R16
3BB EA8C LDI R24,0xAC
3BC E090 LDI R25,0
3BD 2DEC MOV R30,R12
3BE 27FF CLR R31
3BF 0FE8 ADD R30,R24
3C0 1FF9 ADC R31,R25
3C1 82E0 STD Z+0,R14
(0299) ptr++;
3C2 8008 LDD R0,Y+0
3C3 9403 INC R0
3C4 8208 STD Y+0,R0
3C5 94C3 INC R12
3C6 14CA CP R12,R10
3C7 F378 BCS 0x03B7
(0300) }
(0301) sja_write_data(CMR,0x04); //最后释放FXFIFO
3C8 E024 LDI R18,4
3C9 E001 LDI R16,1
3CA DE8E RCALL _sja_write_data
(0302) }
3CB 9621 ADIW R28,1
3CC 940C 0664 JMP pop_xgset00FC
_Search:
SearchStatus --> R10
3CE 92AA ST R10,-Y
(0303) }
(0304)
(0305) /********************************************************************
(0306) * 函数说明:SJA1000查询方式接收函数, *
(0307) * 输入:无 *
(0308) * 输出:无 *
(0309) ********************************************************************/
(0310) void Search(void)
(0311) {
(0312) unsigned char SearchStatus;
(0313) SearchStatus=sja_read_data(SR); //读取状态寄存器
3CF E002 LDI R16,2
3D0 DE98 RCALL _sja_read_data
3D1 2EA0 MOV R10,R16
(0314) #ifdef DEBUG
(0315) rprintfStr("SR: ");
(0316) rprintfu08(SearchStatus);
(0317) rprintfCRLF();
(0318) #endif
(0319) // if((SearchStatus & 0x83)) //是否存在总线关闭、错误状态、数据溢出、有数据位等状态
(0320) // {
(0321) if(SearchStatus&(1<<7))//如果总线关闭
3D2 FF07 SBRS R16,7
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -