📄 can.lst
字号:
\ 000000A0 ........ DC32 `?<Constant "-I- CAN0 Initialisati...">`
484 }
485
486 //------------------------------------------------------------------------------
487 /// Write a CAN transfer
488 /// \param pTransfer can transfer structure
489 /// \return return CAN_STATUS_SUCCESS if command passed, otherwise
490 /// return CAN_STATUS_LOCKED
491 //------------------------------------------------------------------------------
\ In section .text, align 4, keep-with-next
492 unsigned char CAN_Write( CanTransfer *pTransfer )
493 {
494 AT91PS_CAN base_can;
495
496 if (pTransfer->state == CAN_RECEIVING) {
\ CAN_Write:
\ 00000000 0020D0E5 LDRB R2,[R0, #+0]
\ 00000004 040052E3 CMP R2,#+4
497 pTransfer->state = CAN_IDLE;
\ 00000008 0220A003 MOVEQ R2,#+2
\ 0000000C 0020C005 STRBEQ R2,[R0, #+0]
498 }
499
500 if (pTransfer->state != CAN_IDLE) {
\ 00000010 0020D0E5 LDRB R2,[R0, #+0]
\ 00000014 020052E3 CMP R2,#+2
501 return CAN_STATUS_LOCKED;
\ 00000018 0100A013 MOVNE R0,#+1
\ 0000001C 0A00001A BNE ??CAN_Write_0
502 }
503
504 TRACE_DEBUG("CAN_Write\n\r");
505 pTransfer->state = CAN_SENDING;
\ 00000020 0320A0E3 MOV R2,#+3
\ 00000024 0020C0E5 STRB R2,[R0, #+0]
506 if( pTransfer->can_number == 0 ) {
\ 00000028 0120D0E5 LDRB R2,[R0, #+1]
\ 0000002C 000052E3 CMP R2,#+0
507 base_can = AT91C_BASE_CAN0;
\ 00000030 FF14A003 MOVEQ R1,#-16777216
\ 00000034 FD188103 ORREQ R1,R1,#0xFD0000
508 }
509 #ifdef AT91C_BASE_CAN1
510 else {
511 base_can = AT91C_BASE_CAN1;
512 }
513 #endif
514 base_can->CAN_TCR = pTransfer->mailbox_in_use;
\ 00000038 1C2090E5 LDR R2,[R0, #+28]
\ 0000003C 242081E5 STR R2,[R1, #+36]
515 base_can->CAN_IER = pTransfer->mailbox_in_use;
\ 00000040 1C0090E5 LDR R0,[R0, #+28]
\ 00000044 040081E5 STR R0,[R1, #+4]
516
517 return CAN_STATUS_SUCCESS;
\ 00000048 0000A0E3 MOV R0,#+0
\ ??CAN_Write_0:
\ 0000004C 1EFF2FE1 BX LR ;; return
518
519 }
520
521
522 //------------------------------------------------------------------------------
523 /// Read a CAN transfer
524 /// \param pTransfer can transfer structure
525 /// \return return CAN_STATUS_SUCCESS if command passed, otherwise
526 /// return CAN_STATUS_LOCKED
527 //------------------------------------------------------------------------------
\ In section .text, align 4, keep-with-next
528 unsigned char CAN_Read( CanTransfer *pTransfer )
529 {
530 AT91PS_CAN base_can;
531
532 if (pTransfer->state != CAN_IDLE) {
\ CAN_Read:
\ 00000000 0020D0E5 LDRB R2,[R0, #+0]
\ 00000004 020052E3 CMP R2,#+2
533 return CAN_STATUS_LOCKED;
\ 00000008 0100A013 MOVNE R0,#+1
\ 0000000C 0800001A BNE ??CAN_Read_0
534 }
535
536 TRACE_DEBUG("CAN_Read\n\r");
537 pTransfer->state = CAN_RECEIVING;
\ 00000010 0420A0E3 MOV R2,#+4
\ 00000014 0020C0E5 STRB R2,[R0, #+0]
538
539
540 if( pTransfer->can_number == 0 ) {
\ 00000018 0120D0E5 LDRB R2,[R0, #+1]
\ 0000001C 000052E3 CMP R2,#+0
541 base_can = AT91C_BASE_CAN0;
\ 00000020 FF14A003 MOVEQ R1,#-16777216
\ 00000024 FD188103 ORREQ R1,R1,#0xFD0000
542 }
543 #ifdef AT91C_BASE_CAN1
544 else {
545 base_can = AT91C_BASE_CAN1;
546 }
547 #endif
548 // enable interrupt
549 base_can->CAN_IER = pTransfer->mailbox_in_use;
\ 00000028 1C0090E5 LDR R0,[R0, #+28]
\ 0000002C 040081E5 STR R0,[R1, #+4]
550
551 return CAN_STATUS_SUCCESS;
\ 00000030 0000A0E3 MOV R0,#+0
\ ??CAN_Read_0:
\ 00000034 1EFF2FE1 BX LR ;; return
552 }
553
554 //------------------------------------------------------------------------------
555 /// Test if CAN is in IDLE state
556 /// \param pTransfer can transfer structure
557 /// \return return 0 if CAN is in IDLE, otherwise return 1
558 //------------------------------------------------------------------------------
\ In section .text, align 4, keep-with-next
559 unsigned char CAN_IsInIdle( CanTransfer *pTransfer )
560 {
561 return( pTransfer->state != CAN_IDLE );
\ CAN_IsInIdle:
\ 00000000 0000D0E5 LDRB R0,[R0, #+0]
\ 00000004 020050E3 CMP R0,#+2
\ 00000008 0100A013 MOVNE R0,#+1
\ 0000000C 0000A003 MOVEQ R0,#+0
\ 00000010 1EFF2FE1 BX LR ;; return
562 }
563
564 //------------------------------------------------------------------------------
565 /// Basic CAN test without Interrupt
566 //------------------------------------------------------------------------------
\ In section .text, align 4, keep-with-next
567 void CAN_BasicTestSuiteWithoutInterrupt(void)
568 {
569 #if defined AT91C_BASE_CAN1
570 unsigned int status;
571 unsigned int tick=0;
572
573 TRACE_INFO("Without Interrupt ");
574 TRACE_INFO("CAN0 Mailbox 0 transmitting to CAN1 Mailbox 0\n\r");
575 // Init CAN0 Mailbox 0, transmit
576 CAN_ResetTransfer( pCAN0Transfer );
577 pCAN0Transfer->can_number = 0;
578 pCAN0Transfer->mailbox_number = 0;
579 pCAN0Transfer->mode_reg = AT91C_CAN_MOT_TX | AT91C_CAN_PRIOR;
580 pCAN0Transfer->acceptance_mask_reg = 0x00000000;
581 pCAN0Transfer->identifier = AT91C_CAN_MIDvA & (0x07<<18);
582 pCAN0Transfer->data_low_reg = 0x11223344;
583 pCAN0Transfer->data_high_reg = 0x01234567;
584 pCAN0Transfer->control_reg = (AT91C_CAN_MDLC & (0x8<<16));
585 CAN_InitMailboxRegisters( pCAN0Transfer );
586
587 // Init CAN1 Mailbox 0, receive,
588 CAN_ResetTransfer( pCAN1Transfer );
589 pCAN1Transfer->can_number = 1;
590 pCAN1Transfer->mailbox_number = 0;
591 pCAN1Transfer->mode_reg = AT91C_CAN_MOT_RX;
592 pCAN1Transfer->acceptance_mask_reg = AT91C_CAN_MIDvA | AT91C_CAN_MIDvB;
593 pCAN1Transfer->identifier = AT91C_CAN_MIDvA & (0x07<<18);
594 pCAN1Transfer->data_low_reg = 0x00000000;
595 pCAN1Transfer->data_high_reg = 0x00000000;
596 pCAN1Transfer->control_reg = 0x00000000;
597 CAN_InitMailboxRegisters( pCAN1Transfer );
598
599 // Transfer Request for Mailbox 0
600 AT91C_BASE_CAN0->CAN_TCR = AT91C_CAN_MB0;
601
602 tick = 0;
603 do {
604 // CAN Message Status Register
605 status = AT91C_BASE_CAN0_MB0->CAN_MB_MSR;
606 }
607 while( !(status & AT91C_CAN_MRDY) && (++tick < AT91C_CAN_TIMEOUT) );
608
609 if (tick == AT91C_CAN_TIMEOUT) {
610 TRACE_ERROR("Test FAILED\n\r");
611 }
612 else {
613 TRACE_DEBUG("Transfer completed: CAN1 Mailbox 0 MRDY flag has raised\n\r");
614 if( AT91C_BASE_CAN0_MB0->CAN_MB_MDL != AT91C_BASE_CAN1_MB0->CAN_MB_MDL ) {
615 TRACE_ERROR("Data Corrupted\n\r");
616 }
617 else if( AT91C_BASE_CAN0_MB0->CAN_MB_MDH != AT91C_BASE_CAN1_MB0->CAN_MB_MDH ) {
618 TRACE_ERROR("Data Corrupted\n\r");
619 }
620 else {
621 TRACE_INFO("Test passed\n\r");
622 }
623 }
624
625 CAN_ResetAllMailbox();
626
627 TRACE_INFO("Without Interrupt ");
628 TRACE_INFO("CAN0 Mailboxes 1 & 2 transmitting to CAN1 Mailbox 15\n\r");
629 // Init CAN0 Mailbox 1, transmit
630 CAN_ResetTransfer( pCAN0Transfer );
631 pCAN0Transfer->can_number = 0;
632 pCAN0Transfer->mailbox_number = 1;
633 pCAN0Transfer->mode_reg = AT91C_CAN_MOT_TX | AT91C_CAN_PRIOR;
634 pCAN0Transfer->acceptance_mask_reg = 0x00000000;
635 pCAN0Transfer->identifier = AT91C_CAN_MIDvA & (0x09<<18); // ID 9
636 pCAN0Transfer->data_low_reg = 0xAABBCCDD;
637 pCAN0Transfer->data_high_reg = 0xCAFEDECA;
638 pCAN0Transfer->control_reg = (AT91C_CAN_MDLC & (0x8<<16)); // Mailbox Data Length Code
639 CAN_InitMailboxRegisters( pCAN0Transfer );
640
641 // Init CAN0 Mailbox 2, transmit
642 pCAN0Transfer->can_number = 0;
643 pCAN0Transfer->mailbox_number = 2;
644 pCAN0Transfer->mode_reg = AT91C_CAN_MOT_TX | (AT91C_CAN_PRIOR-(1<<16));
645 pCAN0Transfer->acceptance_mask_reg = 0x00000000;
646 pCAN0Transfer->identifier = AT91C_CAN_MIDvA & (0x0A<<18); // ID 10
647 pCAN0Transfer->data_low_reg = 0x55667788;
648 pCAN0Transfer->data_high_reg = 0x99AABBCC;
649 pCAN0Transfer->control_reg = (AT91C_CAN_MDLC & (0x8<<16)); // Mailbox Data Length Code
650 CAN_InitMailboxRegisters( pCAN0Transfer );
651
652 // Init CAN1 Mailbox 15, reception with overwrite
653 CAN_ResetTransfer( pCAN1Transfer );
654
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -