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

📄 mcp2515.lst

📁 IAR5.2下 AT91SAM9260 ARM 对 MCP2515 控制源化码
💻 LST
📖 第 1 页 / 共 5 页
字号:
    211          {
   \                     WriteBits:
   \   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
    212              unsigned char command[4];
    213          	
    214              command[0] = BIT_MOD;
   \   00000014   0510A0E3           MOV      R1,#+5
   \   00000018   0010CDE5           STRB     R1,[SP, #+0]
    215              command[1] = Addr;
   \   0000001C   0140CDE5           STRB     R4,[SP, #+1]
    216              command[2] = mask;
   \   00000020   0260CDE5           STRB     R6,[SP, #+2]
    217              command[3] = data;
   \   00000024   0350CDE5           STRB     R5,[SP, #+3]
    218          	
    219              SPI_CfgPCS(AT91C_BASE_SPI0,MCP2515_Cs);	// 片选 MCP2515
   \   00000028   0E10A0E3           MOV      R1,#+14
   \   0000002C   ........           LDR      R0,??DataTable14  ;; 0xfffc8000
   \   00000030   ........           BL       SPI_CfgPCS
    220          	
    221              MCP_Spi0Write ( command,4,0,0 );
   \   00000034   0030A0E3           MOV      R3,#+0
   \   00000038   0020A0E3           MOV      R2,#+0
   \   0000003C   0410A0E3           MOV      R1,#+4
   \   00000040   0D00B0E1           MOVS     R0,SP
   \   00000044   ........           BL       MCP_Spi0Write
    222              DelayF(DelayTime);
   \   00000048   0800A0E3           MOV      R0,#+8
   \   0000004C   ........           BL       DelayF
    223          }
   \   00000050   7380BDE8           POP      {R0,R1,R4-R6,PC}  ;; return
    224          
    225          
    226          //*****************************************************************************
    227          //* 函数名称:ReadStatus
    228          //* 函数功能:读 MCP2515 状态
    229          //* 入口参数:无
    230          //* 返回值 :读取有关发送和接收功能的一些状态位(中文手冊67頁)
    231          //*****************************************************************************

   \                                 In section .text, align 4, keep-with-next
    232          unsigned char ReadStatus(void)
    233          {
   \                     ReadStatus:
   \   00000000   00402DE9           PUSH     {LR}
   \   00000004   0CD04DE2           SUB      SP,SP,#+12
    234              unsigned char command[4];
    235          	
    236              unsigned char status;
    237              command[0] = RD_STAT;
   \   00000008   A010A0E3           MOV      R1,#+160
   \   0000000C   0410CDE5           STRB     R1,[SP, #+4]
    238          	
    239              while(r_flag);
   \                     ??ReadStatus_0:
   \   00000010   ........           LDR      R0,??DataTable12  ;; r_flag
   \   00000014   0000D0E5           LDRB     R0,[R0, #+0]
   \   00000018   000050E3           CMP      R0,#+0
   \   0000001C   FBFFFF1A           BNE      ??ReadStatus_0
    240              r_flag = 1;
   \   00000020   ........           LDR      R0,??DataTable12  ;; r_flag
   \   00000024   0110A0E3           MOV      R1,#+1
   \   00000028   0010C0E5           STRB     R1,[R0, #+0]
    241          	
    242              SPI_CfgPCS(AT91C_BASE_SPI0,MCP2515_Cs);	
   \   0000002C   0E10A0E3           MOV      R1,#+14
   \   00000030   ........           LDR      R0,??DataTable14  ;; 0xfffc8000
   \   00000034   ........           BL       SPI_CfgPCS
    243          	
    244              MCP_Spi0Write(command,1,&status,1 );
   \   00000038   0130A0E3           MOV      R3,#+1
   \   0000003C   0D20B0E1           MOVS     R2,SP
   \   00000040   0110A0E3           MOV      R1,#+1
   \   00000044   04008DE2           ADD      R0,SP,#+4
   \   00000048   ........           BL       MCP_Spi0Write
    245          	
    246              DelayF(DelayTime);	
   \   0000004C   0800A0E3           MOV      R0,#+8
   \   00000050   ........           BL       DelayF
    247              
    248              return status; 	
   \   00000054   0000DDE5           LDRB     R0,[SP, #+0]
   \   00000058   0E80BDE8           POP      {R1-R3,PC}       ;; return
    249          }
    250          
    251          
    252          //*********************************************************************************
    253          //* 函数名称:MCP2515_CanPoll                                                  
    254          //* 函数功能: 查询是否收到CAN数据:                                             
    255          //* 入口参数: 无                                                             
    256          //* 返回值  : 3:没有收到                                                        
    257          //*           4:缓冲区0收到数据                                                 
    258          //*           5:缓冲区1收到数据                                                 
    259          //*           6:两个缓冲区都收到数据                                           
    260          //**********************************************************************************

   \                                 In section .text, align 4, keep-with-next
    261          unsigned char MCP2515_CanPoll(void)
    262          {
   \                     MCP2515_CanPoll:
   \   00000000   10402DE9           PUSH     {R4,LR}
    263              unsigned char polldata;
    264          	
    265              polldata = ReadStatus() & 0x03;    //CANINTF & 0x03
   \   00000004   ........           BL       ReadStatus
   \   00000008   030010E2           ANDS     R0,R0,#0x3
   \   0000000C   0040B0E1           MOVS     R4,R0
    266          	
    267              return polldata+3;	
   \   00000010   030094E2           ADDS     R0,R4,#+3
   \   00000014   FF0010E2           ANDS     R0,R0,#0xFF      ;; Zero extend
   \   00000018   1080BDE8           POP      {R4,PC}          ;; return
    268          }
    269          
    270          
    271          //===================================================================
    272          //*函数名称:MCP2515_SetBandRate                                  
    273          //*函数功能: 波特率设置                                              
    274          //*入口参数: 1.bandrate     : 波特率                               
    275          //*          2.IsBackNormal : 1: 使用外部时钟  0: 不使用外部时钟      
    276          //*返回值  : 无                                                    
    277          //===================================================================

   \                                 In section .text, align 4, keep-with-next
    278          void MCP2515_SetBandRate(CanBandRate bandrate, unsigned char IsBackNormal)
    279          {	
   \                     MCP2515_SetBandRate:
   \   00000000   70402DE9           PUSH     {R4-R6,LR}
   \   00000004   0040B0E1           MOVS     R4,R0
   \   00000008   0150B0E1           MOVS     R5,R1
    280              unsigned char tmp = 0;
   \   0000000C   0000A0E3           MOV      R0,#+0
   \   00000010   0060B0E1           MOVS     R6,R0
    281          	
    282              MCP2515_Write(CANCTRL, MODE_CONFIG);         		//进入到配置模式
   \   00000014   8010A0E3           MOV      R1,#+128
   \   00000018   0F00A0E3           MOV      R0,#+15
   \   0000001C   ........           BL       MCP2515_Write
    283          
    284              MCP2515_Read(0x0E,tmp);                                     //读取 CAN 状态(0xXE)
   \   00000020   0610B0E1           MOVS     R1,R6
   \   00000024   FF1011E2           ANDS     R1,R1,#0xFF      ;; Zero extend
   \   00000028   0E00A0E3           MOV      R0,#+14
   \   0000002C   ........           BL       MCP2515_Read
    285              
    286              switch(bandrate)
   \   00000030   0400B0E1           MOVS     R0,R4
   \   00000034   FF0010E2           ANDS     R0,R0,#0xFF      ;; Zero extend
   \   00000038   0B0050E3           CMP      R0,#+11
   \   0000003C   7C00008A           BHI      ??MCP2515_SetBandRate_1
   \   00000040   04108FE2           ADR      R1,??MCP2515_SetBandRate_0
   \   00000044   0010D1E7           LDRB     R1,[R1, R0]
   \   00000048   01F18FE0           ADD      PC,PC,R1, LSL #+2
   \                     ??MCP2515_SetBandRate_0:
   \   0000004C   020C1620           DC8      +2,+12,+22,+32
   \   00000050   2A343E48           DC8      +42,+52,+62,+72
   \   00000054   525C6670           DC8      +82,+92,+102,+112
    287              {
    288                  case BandRate_10kbps:                               	//波特率NBR = 1/(同步段+传播段+相位缓冲段1(PS1)+相位缓冲段2(PS2))
    289                      MCP2515_Write(CNF1, SJW1|0x31);	                //Synchronization Jump Width Length(同步跳转宽度 SJW ) =1 TQ
   \                     ??MCP2515_SetBandRate_2:
   \   00000058   3110A0E3           MOV      R1,#+49
   \   0000005C   2A00A0E3           MOV      R0,#+42
   \   00000060   ........           BL       MCP2515_Write
    290          		                                                //BRP = 0x31  
    291          		                                                //TQ = 2*(BRP+1)/Fosc = 625ns   (Fosc = 16MHz)
    292          		                                                //Sync Seg(同步段) = 1TQ
    293                      MCP2515_Write(CNF2, BTLMODE_CNF3|(SEG4<<3)|SEG7);   // Phase Seg 1(相位缓冲段1) = 4TQ, Prop Seg(传播) = 7TQ
   \   00000064   9E10A0E3           MOV      R1,#+158
   \   00000068   2900A0E3           MOV      R0,#+41
   \   0000006C   ........           BL       MCP2515_Write
    294                      MCP2515_Write(CNF3, SEG4);                          // Phase Seg 2(相位缓冲段2) = 4TQ
   \   00000070   0310A0E3           MOV      R1,#+3
   \   00000074   2800A0E3           MOV      R0,#+40
   \   00000078   ........           BL       MCP2515_Write
   \   0000007C   6C0000EA           B        ??MCP2515_SetBandRate_1
    295                      break;                                              //NBR = 1/((1+7+4+4)*6.25ns)
    296          	
    297                  case BandRate_20kbps:
    298                      MCP2515_Write(CNF1, SJW1|0x18);	                //Synchronization Jump Width Length =1 TQ
   \                     ??MCP2515_SetBandRate_3:
   \   00000080   1810A0E3           MOV      R1,#+24
   \   00000084   2A00A0E3           MOV      R0,#+42
   \   00000088   ........           BL       MCP2515_Write
    299                      MCP2515_Write(CNF2, BTLMODE_CNF3|(SEG4<<3)|SEG7);   // Phase Seg 1 = 4, Prop Seg = 7
   \   0000008C   9E10A0E3           MOV      R1,#+158
   \   00000090   2900A0E3           MOV      R0,#+41
   \   00000094   ........           BL       MCP2515_Write
    300                      MCP2515_Write(CNF3, SEG4);                          // Phase Seg 2 = 4
   \   00000098   0310A0E3           MOV      R1,#+3
   \   0000009C   2800A0E3           MOV      R0,#+40
   \   000000A0   ........           BL       MCP2515_Write
   \   000000A4   620000EA           B        ??MCP2515_SetBandRate_1
    301                      break;
    302          	
    303                  case BandRate_50kbps:
    304                      MCP2515_Write(CNF1, SJW1|0x9);	                //Synchronization Jump Width Length =1 TQ
   \                     ??MCP2515_SetBandRate_4:
   \   000000A8   0910A0E3           MOV      R1,#+9
   \   000000AC   2A00A0E3           MOV      R0,#+42
   \   000000B0   ........           BL       MCP2515_Write
    305                      MCP2515_Write(CNF2, BTLMODE_CNF3|(SEG4<<3)|SEG7);   // Phase Seg 1 = 4, Prop Seg = 7
   \   000000B4   9E10A0E3           MOV      R1,#+158
   \   000000B8   2900A0E3           MOV      R0,#+41
   \   000000BC   ........           BL       MCP2515_Write
    306                      MCP2515_Write(CNF3, SEG4);                          // Phase Seg 2 = 4
   \   000000C0   0310A0E3           MOV      R1,#+3
   \   000000C4   2800A0E3           MOV      R0,#+40
   \   000000C8   ........           BL       MCP2515_Write
   \   000000CC   580000EA           B        ??MCP2515_SetBandRate_1
    307                      break;
    308          
    309                  case BandRate_62kbps:
    310                      MCP2515_Write(CNF1, SJW1|0x7);	                //Synchronization Jump Width Length =1 TQ
   \                     ??MCP2515_SetBandRate_5:
   \   000000D0   0710A0E3           MOV      R1,#+7
   \   000000D4   2A00A0E3           MOV      R0,#+42
   \   000000D8   ........           BL       MCP2515_Write
    311                      MCP2515_Write(CNF2, BTLMODE_CNF3|(SEG4<<3)|SEG7);   // Phase Seg 1 = 4, Prop Seg = 7
   \   000000DC   9E10A0E3           MOV      R1,#+158
   \   000000E0   2900A0E3           MOV      R0,#+41
   \   000000E4   ........           BL       MCP2515_Write
    312                      MCP2515_Write(CNF3, SEG4);// Phase Seg 2 = 4
   \   000000E8   0310A0E3           MOV      R1,#+3
   \   000000EC   2800A0E3           MOV      R0,#+40
   \   000000F0   ........           BL       MCP2515_Write
   \   000000F4   4E0000EA           B        ??MCP2515_SetBandRate_1
    313                      break;	
    314          		

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -