📄 mcp2515.lst
字号:
406 }
407 WriteData(mcp_addr,tbufdata,4);
\ ??mcp_write_can_id_1:
\ 00000098 0420A0E3 MOV R2,#+4
\ 0000009C 0D10B0E1 MOVS R1,SP
\ 000000A0 0400B0E1 MOVS R0,R4
\ 000000A4 FF0010E2 ANDS R0,R0,#0xFF ;; Zero extend
\ 000000A8 ........ BL WriteData
408 }
\ 000000AC F180BDE8 POP {R0,R4-R7,PC} ;; return
409
410
411 //*****************************************************************************
412 //* 函数名称:write_CAN_ID
413 //* 函数功能:写 CAN ID
414 //*****************************************************************************
\ In section .text, align 4, keep-with-next
415 void write_CAN_ID(unsigned char TxBuffer, unsigned int can_id)
416 {
\ write_CAN_ID:
\ 00000000 F8402DE9 PUSH {R3-R7,LR}
\ 00000004 0060B0E1 MOVS R6,R0
\ 00000008 0140B0E1 MOVS R4,R1
417 unsigned char mcp_addr, ext = 1;
\ 0000000C 0100A0E3 MOV R0,#+1
\ 00000010 0050B0E1 MOVS R5,R0
418
419 if(TxBuffer == 1)
\ 00000014 FF6016E2 ANDS R6,R6,#0xFF ;; Zero extend
\ 00000018 010056E3 CMP R6,#+1
\ 0000001C 0200001A BNE ??write_CAN_ID_0
420 mcp_addr = 0x31;
\ 00000020 3100A0E3 MOV R0,#+49
\ 00000024 0070B0E1 MOVS R7,R0
\ 00000028 0A0000EA B ??write_CAN_ID_1
421 else if(TxBuffer == 2)
\ ??write_CAN_ID_0:
\ 0000002C FF6016E2 ANDS R6,R6,#0xFF ;; Zero extend
\ 00000030 020056E3 CMP R6,#+2
\ 00000034 0200001A BNE ??write_CAN_ID_2
422 mcp_addr = 0x41;
\ 00000038 4100A0E3 MOV R0,#+65
\ 0000003C 0070B0E1 MOVS R7,R0
\ 00000040 040000EA B ??write_CAN_ID_1
423 else if(TxBuffer == 3)
\ ??write_CAN_ID_2:
\ 00000044 FF6016E2 ANDS R6,R6,#0xFF ;; Zero extend
\ 00000048 030056E3 CMP R6,#+3
\ 0000004C 0700001A BNE ??write_CAN_ID_3
424 mcp_addr = 0x51;
\ 00000050 5100A0E3 MOV R0,#+81
\ 00000054 0070B0E1 MOVS R7,R0
425 else
426 {
427 //AT91F_DBGU_Printk("TxBuffer error.\r\n");
428 return;
429 }
430 mcp_write_can_id(mcp_addr, ext, can_id);
\ ??write_CAN_ID_1:
\ 00000058 0420B0E1 MOVS R2,R4
\ 0000005C 0510B0E1 MOVS R1,R5
\ 00000060 FF1011E2 ANDS R1,R1,#0xFF ;; Zero extend
\ 00000064 0700B0E1 MOVS R0,R7
\ 00000068 FF0010E2 ANDS R0,R0,#0xFF ;; Zero extend
\ 0000006C ........ BL mcp_write_can_id
431 }
\ ??write_CAN_ID_3:
\ 00000070 F180BDE8 POP {R0,R4-R7,PC} ;; return
432
433
434 //*****************************************************************************
435 //* 函数名称:mcp_read_can_id
436 //* 函数功能:读 CAN ID
437 //* 入口参数:mcp_addr : MCP2515 寄存器地址
438 //* ext : 帧类型(0:标准帧 1:扩展帧)
439 //* *can_id : CAN_ID 地址
440 //* 返回值 :无
441 //*****************************************************************************
\ In section .text, align 4, keep-with-next
442 void mcp_read_can_id( unsigned char mcp_addr, unsigned char *ext, unsigned int* can_id)
443 {
\ mcp_read_can_id:
\ 00000000 70402DE9 PUSH {R4-R6,LR}
\ 00000004 08D04DE2 SUB SP,SP,#+8
\ 00000008 0040B0E1 MOVS R4,R0
\ 0000000C 0150B0E1 MOVS R5,R1
\ 00000010 0260B0E1 MOVS R6,R2
444 unsigned char tbufdata[4];
445 *ext = 0;
\ 00000014 0000A0E3 MOV R0,#+0
\ 00000018 0000C5E5 STRB R0,[R5, #+0]
446 *can_id = 0;
\ 0000001C 0000A0E3 MOV R0,#+0
\ 00000020 000086E5 STR R0,[R6, #+0]
447 ReadData(mcp_addr,tbufdata,4);
\ 00000024 0420A0E3 MOV R2,#+4
\ 00000028 0D10B0E1 MOVS R1,SP
\ 0000002C 0400B0E1 MOVS R0,R4
\ 00000030 FF0010E2 ANDS R0,R0,#0xFF ;; Zero extend
\ 00000034 ........ BL ReadData
448 *can_id = (tbufdata[SIDH]<<3) + (tbufdata[SIDL]>>5);
\ 00000038 0000DDE5 LDRB R0,[SP, #+0]
\ 0000003C 0110DDE5 LDRB R1,[SP, #+1]
\ 00000040 FF1011E2 ANDS R1,R1,#0xFF ;; Zero extend
\ 00000044 A112B0E1 LSRS R1,R1,#+5
\ 00000048 FF1011E2 ANDS R1,R1,#0xFF ;; Zero extend
\ 0000004C 800191E0 ADDS R0,R1,R0, LSL #+3
\ 00000050 000086E5 STR R0,[R6, #+0]
449
450 if ( (tbufdata[SIDL] & TXB_EXIDE_M) == TXB_EXIDE_M )
\ 00000054 0100DDE5 LDRB R0,[SP, #+1]
\ 00000058 080010E3 TST R0,#0x8
\ 0000005C 0F00000A BEQ ??mcp_read_can_id_0
451 {
452 *can_id = (*can_id<<2) + (tbufdata[SIDL] & 0x03);
\ 00000060 000096E5 LDR R0,[R6, #+0]
\ 00000064 0110DDE5 LDRB R1,[SP, #+1]
\ 00000068 031011E2 ANDS R1,R1,#0x3
\ 0000006C 000191E0 ADDS R0,R1,R0, LSL #+2
\ 00000070 000086E5 STR R0,[R6, #+0]
453 *can_id <<= 16;
\ 00000074 000096E5 LDR R0,[R6, #+0]
\ 00000078 0008B0E1 LSLS R0,R0,#+16
\ 0000007C 000086E5 STR R0,[R6, #+0]
454 *can_id = *can_id +(tbufdata[EID8]<<8) + tbufdata[EID0];
\ 00000080 000096E5 LDR R0,[R6, #+0]
\ 00000084 0210DDE5 LDRB R1,[SP, #+2]
\ 00000088 0320DDE5 LDRB R2,[SP, #+3]
\ 0000008C 011492E0 ADDS R1,R2,R1, LSL #+8
\ 00000090 000091E0 ADDS R0,R1,R0
\ 00000094 000086E5 STR R0,[R6, #+0]
455 *ext = 1;
\ 00000098 0100A0E3 MOV R0,#+1
\ 0000009C 0000C5E5 STRB R0,[R5, #+0]
456 }
457 }
\ ??mcp_read_can_id_0:
\ 000000A0 7380BDE8 POP {R0,R1,R4-R6,PC} ;; return
458
459
460 //*****************************************************************************
461 //* 函数名称:read_CAN_ID
462 //* 函数功能:读 CAN ID
463 //*****************************************************************************
\ In section .text, align 4, keep-with-next
464 unsigned int read_CAN_ID(unsigned char RxBuffer)
465 {
\ read_CAN_ID:
\ 00000000 30402DE9 PUSH {R4,R5,LR}
\ 00000004 0CD04DE2 SUB SP,SP,#+12
\ 00000008 0040B0E1 MOVS R4,R0
466 unsigned char mcp_addr, ext;
467 unsigned int can_id = 0;
\ 0000000C 0010A0E3 MOV R1,#+0
\ 00000010 00108DE5 STR R1,[SP, #+0]
468
469 if(RxBuffer == 4)
\ 00000014 FF4014E2 ANDS R4,R4,#0xFF ;; Zero extend
\ 00000018 040054E3 CMP R4,#+4
\ 0000001C 0200001A BNE ??read_CAN_ID_0
470 mcp_addr = 0x61;
\ 00000020 6100A0E3 MOV R0,#+97
\ 00000024 0050B0E1 MOVS R5,R0
\ 00000028 070000EA B ??read_CAN_ID_1
471 else if(RxBuffer == 5)
\ ??read_CAN_ID_0:
\ 0000002C FF4014E2 ANDS R4,R4,#0xFF ;; Zero extend
\ 00000030 050054E3 CMP R4,#+5
\ 00000034 0200001A BNE ??read_CAN_ID_2
472 mcp_addr = 0x71;
\ 00000038 7100A0E3 MOV R0,#+113
\ 0000003C 0050B0E1 MOVS R5,R0
\ 00000040 010000EA B ??read_CAN_ID_1
473 else
474 {
475 //AT91F_DBGU_Printk("RxBuffer error.\r\n");
476 return 0;
\ ??read_CAN_ID_2:
\ 00000044 0000A0E3 MOV R0,#+0
\ 00000048 050000EA B ??read_CAN_ID_3
477 }
478
479 mcp_read_can_id(mcp_addr, &ext, &can_id);
\ ??read_CAN_ID_1:
\ 0000004C 0D20B0E1 MOVS R2,SP
\ 00000050 04108DE2 ADD R1,SP,#+4
\ 00000054 0500B0E1 MOVS R0,R5
\ 00000058 FF0010E2 ANDS R0,R0,#0xFF ;; Zero extend
\ 0000005C ........ BL mcp_read_can_id
480
481 return can_id;
\ 00000060 00009DE5 LDR R0,[SP, #+0]
\ ??read_CAN_ID_3:
\ 00000064 3E80BDE8 POP {R1-R5,PC} ;; return
482 }
483
484
485 //*****************************************************************************
486 //* 函数名称:MCP2515_Init
487 //* 函数功能:MCP2515 初始化
488 //* 入口参数:bandrate : 波特率
489 //* mode : 1: 标准模式 0: 回环模式
490 //* 返回值 :无
491 //*****************************************************************************
\ In section .text, align 4, keep-with-next
492 unsigned char MCP2515_Init(CanBandRate bandrate, unsigned char mode)
493 {
\ MCP2515_Init:
\ 00000000 F0412DE9 PUSH {R4-R8,LR}
\ 00000004 08D04DE2 SUB SP,SP,#+8
\ 00000008 0040B0E1 MOVS R4,R0
\ 0000000C 0150B0E1 MOVS R5,R1
494 unsigned char data;
495 unsigned char i, j, a;
496
497 //0、初始化 SPI0
498 // DBGU_Printk("Configure SPI0 NCS0...\r\n");
499 init_SPI0();
\ 00000010 ........ BL init_SPI0
500
501 //1、复位MCP2515
502 // DBGU_Printk("MCP2515 Reset ...\r\n");
503 McpReset();
\ 00000014 ........ BL McpReset
504 DBGU_Printk("MCP2515 Reset OK(^_^).\r\n");
\ 00000018 28029FE5 LDR R0,??MCP2515_Init_0 ;; `?<Constant "MCP2515 Reset OK(^_^).\\r\\n">`
\ 0000001C ........ BL DBGU_Prin
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -