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

📄 eeprom.lst

📁 IAR5.2下 AT91SAM9260 ARM 对 MCP2515 控制源化码
💻 LST
📖 第 1 页 / 共 4 页
字号:
###############################################################################
#                                                                             #
#                                                       08/Mar/2009  18:31:32 #
# IAR ANSI C/C++ Compiler V5.20.2.21007/W32 EVALUATION for ARM                #
# Copyright 1999-2008 IAR Systems AB.                                         #
#                                                                             #
#    Cpu mode     =  arm                                                      #
#    Endian       =  little                                                   #
#    Source file  =  E:\IAR\at91sam9260-ek\basic-twi-eeprom-project\eeprom.c  #
#    Command line =  E:\IAR\at91sam9260-ek\basic-twi-eeprom-project\eeprom.c  #
#                    -D at91sam9260 -D sdram -lC                              #
#                    E:\IAR\at91sam9260-ek\basic-twi-eeprom-project\ewp\at91s #
#                    am9260_sdram\List\ --remarks --diag_suppress             #
#                    Pe826,Pe1375 -o E:\IAR\at91sam9260-ek\basic-twi-eeprom-p #
#                    roject\ewp\at91sam9260_sdram\Obj\ --no_cse --no_unroll   #
#                    --no_inline --no_code_motion --no_tbaa --no_clustering   #
#                    --no_scheduling --debug --endian=little                  #
#                    --cpu=ARM926EJ-S -e --fpu=None --dlib_config             #
#                    "D:\Program Files\IAR Systems\Embedded Workbench 5.0     #
#                    Evaluation\ARM\INC\DLib_Config_Full.h" -I                #
#                    E:\IAR\at91sam9260-ek\basic-twi-eeprom-project\ewp\..\.. #
#                    \..\at91lib\ -I E:\IAR\at91sam9260-ek\basic-twi-eeprom-p #
#                    roject\ewp\..\..\..\at91lib\boards\at91sam9260-ek\ -I    #
#                    E:\IAR\at91sam9260-ek\basic-twi-eeprom-project\ewp\..\.. #
#                    \..\at91lib\peripherals\ -I                              #
#                    E:\IAR\at91sam9260-ek\basic-twi-eeprom-project\ewp\..\.. #
#                    \..\at91lib\components\ -I E:\IAR\at91sam9260-ek\basic-t #
#                    wi-eeprom-project\ewp\..\..\..\at91lib\usb\ -I           #
#                    "D:\Program Files\IAR Systems\Embedded Workbench 5.0     #
#                    Evaluation\ARM\INC\" --interwork --cpu_mode arm -On      #
#    List file    =  E:\IAR\at91sam9260-ek\basic-twi-eeprom-project\ewp\at91s #
#                    am9260_sdram\List\eeprom.lst                             #
#    Object file  =  E:\IAR\at91sam9260-ek\basic-twi-eeprom-project\ewp\at91s #
#                    am9260_sdram\Obj\eeprom.o                                #
#                                                                             #
#                                                                             #
###############################################################################

E:\IAR\at91sam9260-ek\basic-twi-eeprom-project\eeprom.c
      1          
      2          #include "eeprom.h"
      3          #include <twi/twi.h>
      4          #include <dbgu/dbgu.h>
      5          #include <stdio.h>
      6          
      7          
      8          //*============================================================================
      9          //*	函数名称:delay_ms
     10          //* 函数功能:延时 ms
     11          //* 入口参数:ms: 延时时间(ms)
     12          //* 返回值  :无
     13          //*============================================================================

   \                                 In section .text, align 4, keep-with-next
     14          void delay_ms(unsigned int ms)
     15          {
     16          	unsigned int loop;
     17          	for (loop = 0; loop < 1000*ms; loop++);
   \                     delay_ms:
   \   00000000   0020A0E3           MOV      R2,#+0
   \   00000004   0210B0E1           MOVS     R1,R2
   \                     ??delay_ms_0:
   \   00000008   FA2FA0E3           MOV      R2,#+1000
   \   0000000C   920013E0           MULS     R3,R2,R0
   \   00000010   030051E1           CMP      R1,R3
   \   00000014   0100002A           BCS      ??delay_ms_1
   \   00000018   011091E2           ADDS     R1,R1,#+1
   \   0000001C   F9FFFFEA           B        ??delay_ms_0
     18          }
   \                     ??delay_ms_1:
   \   00000020   1EFF2FE1           BX       LR               ;; return
     19          
     20          
     21          //*============================================================================
     22          //* 函数名称:AT24C08_Write_Page
     23          //* 函数功能:写数据到 AT24C08 指定的页面(一次只能写一个页面)
     24          //* 入口参数:page	: 页面值( AT24C08共4页(0,1,2,3) )
     25          //*	      address	: 写入地址(0~255)
     26          //*	      *data	: 要写入数据的起始地址
     27          //*	      size	: 写入数据的长度
     28          //* 返回值  : 0: 写入数据正常
     29          //*	      1: 写入数据时发生错误	
     30          //*	      2: 页面值范围出错	
     31          //*	      3: 写入地址范围出错
     32          //*	      4: 数据长度范围出错
     33          //* 注:AT24C08 按内部地址递增方式写数据时一次只能写一行(16字节),写入下一行时必须重新指定下一
     34          //*     行地址,否则会以覆盖形式写同一行,但按内部地址递增方式读数据时一次可读多行,原因不明
     35          //*============================================================================

   \                                 In section .text, align 4, keep-with-next
     36          char AT24C08_Write_Page(int page,int address, char *data, int size)
     37          {
   \                     AT24C08_Write_Page:
   \   00000000   F0472DE9           PUSH     {R4-R10,LR}
   \   00000004   00A0B0E1           MOVS     R10,R0
   \   00000008   0140B0E1           MOVS     R4,R1
   \   0000000C   0280B0E1           MOVS     R8,R2
   \   00000010   0350B0E1           MOVS     R5,R3
     38              unsigned char wordLeng;
     39              char slvAddr,cnt;
     40          	
     41              if( (page >= AT24C08_PAGE_SIZE)||(page<0) )			// AT24C08 共4页,分别为0,1,2,3, 大于3出错
   \   00000014   04005AE3           CMP      R10,#+4
   \   00000018   010000AA           BGE      ??AT24C08_Write_Page_0
   \   0000001C   00005AE3           CMP      R10,#+0
   \   00000020   0100005A           BPL      ??AT24C08_Write_Page_1
     42              {
     43                  // DBGU_Printk("Write AT24C08 page error !\r\n");
     44                  return 2;
   \                     ??AT24C08_Write_Page_0:
   \   00000024   0200A0E3           MOV      R0,#+2
   \   00000028   590000EA           B        ??AT24C08_Write_Page_2
     45              }
     46          	
     47              if( (address >= PAGE_SIZE)||(address<0) )					// AT24C08 每页只能写256字节,页内地址范围为(0~255)
   \                     ??AT24C08_Write_Page_1:
   \   0000002C   400F54E3           CMP      R4,#+256
   \   00000030   010000AA           BGE      ??AT24C08_Write_Page_3
   \   00000034   000054E3           CMP      R4,#+0
   \   00000038   0100005A           BPL      ??AT24C08_Write_Page_4
     48              {
     49                  // DBGU_Printk("Write AT24C08 address error !\r\n");
     50                  return 3;
   \                     ??AT24C08_Write_Page_3:
   \   0000003C   0300A0E3           MOV      R0,#+3
   \   00000040   530000EA           B        ??AT24C08_Write_Page_2
     51              }
     52          	
     53              if( (size > (PAGE_SIZE-address))||(size<0) )				// AT24C08 每页只能写 256 字节
   \                     ??AT24C08_Write_Page_4:
   \   00000044   400F74E2           RSBS     R0,R4,#+256
   \   00000048   050050E1           CMP      R0,R5
   \   0000004C   010000BA           BLT      ??AT24C08_Write_Page_5
   \   00000050   000055E3           CMP      R5,#+0
   \   00000054   0100005A           BPL      ??AT24C08_Write_Page_6
     54              {
     55                  // DBGU_Printk("Write AT24C08 word leng error !\r\n");
     56                  return 4;
   \                     ??AT24C08_Write_Page_5:
   \   00000058   0400A0E3           MOV      R0,#+4
   \   0000005C   4C0000EA           B        ??AT24C08_Write_Page_2
     57              }
     58          	
     59              slvAddr = AT24C08_BASE_ADDR + page;
   \                     ??AT24C08_Write_Page_6:
   \   00000060   0A00B0E1           MOVS     R0,R10
   \   00000064   500090E2           ADDS     R0,R0,#+80
   \   00000068   0060B0E1           MOVS     R6,R0
     60              wordLeng = address%16;
   \   0000006C   0400B0E1           MOVS     R0,R4
   \   00000070   1010A0E3           MOV      R1,#+16
   \   00000074   ........           BL       __aeabi_idivmod
   \   00000078   0190B0E1           MOVS     R9,R1
     61          	
     62              if((wordLeng + size) < 16)		        // 要写的字节长度不足一行(16字节)
   \   0000007C   0900B0E1           MOVS     R0,R9
   \   00000080   FF0010E2           ANDS     R0,R0,#0xFF      ;; Zero extend
   \   00000084   000095E0           ADDS     R0,R5,R0
   \   00000088   100050E3           CMP      R0,#+16
   \   0000008C   090000AA           BGE      ??AT24C08_Write_Page_7
     63              {
     64                  TWI_Write(AT91C_BASE_TWI, slvAddr, address, data, size);
   \   00000090   08502DE5           STR      R5,[SP, #-8]!
   \   00000094   0830B0E1           MOVS     R3,R8
   \   00000098   0420B0E1           MOVS     R2,R4
   \   0000009C   0610B0E1           MOVS     R1,R6
   \   000000A0   FF1011E2           ANDS     R1,R1,#0xFF      ;; Zero extend
   \   000000A4   ........           LDR      R0,??DataTable4  ;; 0xfffac000
   \   000000A8   ........           BL       TWI_Write
   \   000000AC   08D08DE2           ADD      SP,SP,#+8        ;; stack cleaning
     65                      return 0;
   \   000000B0   0000A0E3           MOV      R0,#+0
   \   000000B4   360000EA           B        ??AT24C08_Write_Page_2
     66              }
     67              else
     68              {
     69                  TWI_Write(AT91C_BASE_TWI, slvAddr, address, data, (16-wordLeng));
   \                     ??AT24C08_Write_Page_7:
   \   000000B8   0900B0E1           MOVS     R0,R9
   \   000000BC   FF0010E2           ANDS     R0,R0,#0xFF      ;; Zero extend
   \   000000C0   100070E2           RSBS     R0,R0,#+16
   \   000000C4   08002DE5           STR      R0,[SP, #-8]!
   \   000000C8   0830B0E1           MOVS     R3,R8
   \   000000CC   0420B0E1           MOVS     R2,R4
   \   000000D0   0610B0E1           MOVS     R1,R6
   \   000000D4   FF1011E2           ANDS     R1,R1,#0xFF      ;; Zero extend
   \   000000D8   ........           LDR      R0,??DataTable4  ;; 0xfffac000
   \   000000DC   ........           BL       TWI_Write
   \   000000E0   08D08DE2           ADD      SP,SP,#+8        ;; stack cleaning
     70                  size    -= (16-wordLeng);
   \   000000E4   0900B0E1           MOVS     R0,R9
   \   000000E8   FF0010E2           ANDS     R0,R0,#0xFF      ;; Zero extend
   \   000000EC   100050E2           SUBS     R0,R0,#+16
   \   000000F0   055090E0           ADDS     R5,R0,R5
     71                  address += (16-wordLeng);	        // 要完第一行,换行再写
   \   000000F4   100094E2           ADDS     R0,R4,#+16
   \   000000F8   0910B0E1           MOVS     R1,R9
   \   000000FC   FF1011E2           ANDS     R1,R1,#0xFF      ;; Zero extend
   \   00000100   014050E0           SUBS     R4,R0,R1
     72                  cnt      = (16-wordLeng);
   \   00000104   100079E2           RSBS     R0,R9,#+16
   \   00000108   0070B0E1           MOVS     R7,R0
     73                  delay_ms(10);				// 不延时写数据会出错,原因不明
   \   0000010C   0A00A0E3           MOV      R0,#+10
   \   00000110   ........           BL       delay_ms
     74              }
     75              while(size > 16)
   \                     ??AT24C08_Write_Page_8:
   \   00000114   110055E3           CMP      R5,#+17
   \   00000118   100000BA           BLT      ??AT24C08_Write_Page_9
     76              {
     77                  TWI_Write(AT91C_BASE_TWI, slvAddr, address, (data+cnt), 16);
   \   0000011C   1000A0E3           MOV      R0,#+16
   \   00000120   08002DE5           STR      R0,[SP, #-8]!
   \   00000124   0700B0E1           MOVS     R0,R7
   \   00000128   FF0010E2           ANDS     R0,R0,#0xFF      ;; Zero extend
   \   0000012C   083090E0           ADDS     R3,R0,R8
   \   00000130   0420B0E1           MOVS     R2,R4
   \   00000134   0610B0E1           MOVS     R1,R6
   \   00000138   FF1011E2           ANDS     R1,R1,#0xFF      ;; Zero extend
   \   0000013C   ........           LDR      R0,??DataTable4  ;; 0xfffac000
   \   00000140   ........           BL       TWI_Write
   \   00000144   08D08DE2           ADD      SP,SP,#+8        ;; stack cleaning
     78                  size    -= 16;
   \   00000148   105055E2           SUBS     R5,R5,#+16
     79                  address += 16;				// 要完一行,换行再写
   \   0000014C   104094E2           ADDS     R4,R4,#+16
     80                  cnt     += 16;
   \   00000150   107097E2           ADDS     R7,R7,#+16
     81                  delay_ms(10);				// 不延时写数据会出错,原因不明
   \   00000154   0A00A0E3           MOV      R0,#+10
   \   00000158   ........           BL       delay_ms
   \   0000015C   ECFFFFEA           B        ??AT24C08_Write_Page_8
     82              }
     83              TWI_Write(AT91C_BASE_TWI, slvAddr, address, (data+cnt), size);	// 要最后一行
   \                     ??AT24C08_Write_Page_9:
   \   00000160   08502DE5           STR      R5,[SP, #-8]!
   \   00000164   0700B0E1           MOVS     R0,R7
   \   00000168   FF0010E2           ANDS     R0,R0,#0xFF      ;; Zero extend
   \   0000016C   083090E0           ADDS     R3,R0,R8
   \   00000170   0420B0E1           MOVS     R2,R4
   \   00000174   0610B0E1           MOVS     R1,R6
   \   00000178   FF1011E2           ANDS     R1,R1,#0xFF      ;; Zero extend
   \   0000017C   ........           LDR      R0,??DataTable4  ;; 0xfffac000
   \   00000180   ........           BL       TWI_Write

⌨️ 快捷键说明

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