⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 can.lst

📁 Tried to make CAN logger on AT91sam7X-ek, but have no idea how to implement FATFs... -( I m just a
💻 LST
📖 第 1 页 / 共 5 页
字号:
   \   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 + -