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

📄 eeprom.lst

📁 IAR5.2下 AT91SAM9260 ARM 对 MCP2515 控制源化码
💻 LST
📖 第 1 页 / 共 4 页
字号:
   \   00000184   08D08DE2           ADD      SP,SP,#+8        ;; stack cleaning
     84              
     85              delay_ms(10);				// 不延时写数据会出错,原因不明	
   \   00000188   0A00A0E3           MOV      R0,#+10
   \   0000018C   ........           BL       delay_ms
     86              
     87              return 0;
   \   00000190   0000A0E3           MOV      R0,#+0
   \                     ??AT24C08_Write_Page_2:
   \   00000194   F087BDE8           POP      {R4-R10,PC}      ;; return
     88          }
     89          
     90          
     91          //*============================================================================
     92          //* 函数名称:AT24C08_Write
     93          //* 函数功能:写数据到 AT24C08
     94          //* 入口参数:address	: 写入地址(0~1023)
     95          //*	      *data	: 要写入数据的起始地址
     96          //*	      size	: 写入数据的长度
     97          //* 返回值  : 0: 写入数据正常
     98          //*	      1: 写入数据时发生错误	
     99          //*	      2: 无
    100          //*	      3: 写入地址范围出错
    101          //*	      4: 数据长度范围出错
    102          //*============================================================================

   \                                 In section .text, align 4, keep-with-next
    103          char AT24C08_Write(int address, char *data, int size)
    104          {
   \                     AT24C08_Write:
   \   00000000   F8432DE9           PUSH     {R3-R9,LR}
   \   00000004   0090B0E1           MOVS     R9,R0
   \   00000008   0180B0E1           MOVS     R8,R1
   \   0000000C   0240B0E1           MOVS     R4,R2
    105              char page;
    106              int pageAddr,cnt;
    107          	
    108              TWI_Open();
   \   00000010   ........           BL       TWI_Open
    109          	
    110              if((address >= AT24C08_MAX_ADDR)||(address < 0) )			// AT24C08 寻址范围为(0~1023)共1204字节
   \   00000014   400E59E3           CMP      R9,#+1024
   \   00000018   010000AA           BGE      ??AT24C08_Write_0
   \   0000001C   000059E3           CMP      R9,#+0
   \   00000020   0200005A           BPL      ??AT24C08_Write_1
    111              {
    112                  // DBGU_Printk("Write AT24C08 address error !\r\n");
    113                  TWI_Close();
   \                     ??AT24C08_Write_0:
   \   00000024   ........           BL       TWI_Close
    114                  return 3;
   \   00000028   0300A0E3           MOV      R0,#+3
   \   0000002C   460000EA           B        ??AT24C08_Write_2
    115              }
    116          	
    117              if( (size > (AT24C08_MAX_BYTE-address))||(size<0) )			// AT24C08 最大可写 1024 字节
   \                     ??AT24C08_Write_1:
   \   00000030   400E79E2           RSBS     R0,R9,#+1024
   \   00000034   040050E1           CMP      R0,R4
   \   00000038   010000BA           BLT      ??AT24C08_Write_3
   \   0000003C   000054E3           CMP      R4,#+0
   \   00000040   0200005A           BPL      ??AT24C08_Write_4
    118              {
    119                  // DBGU_Printk("Write AT24C08 word leng error !\r\n");
    120                  TWI_Close();
   \                     ??AT24C08_Write_3:
   \   00000044   ........           BL       TWI_Close
    121                  return 4;
   \   00000048   0400A0E3           MOV      R0,#+4
   \   0000004C   3E0000EA           B        ??AT24C08_Write_2
    122              }
    123          	
    124              page = (char)(address / PAGE_SIZE);			// 获取起始页
   \                     ??AT24C08_Write_4:
   \   00000050   0900B0E1           MOVS     R0,R9
   \   00000054   401FA0E3           MOV      R1,#+256
   \   00000058   ........           BL       __aeabi_idivmod
   \   0000005C   0050B0E1           MOVS     R5,R0
    125              pageAddr = address % PAGE_SIZE;			// 获取页面起始地址
   \   00000060   0900B0E1           MOVS     R0,R9
   \   00000064   401FA0E3           MOV      R1,#+256
   \   00000068   ........           BL       __aeabi_idivmod
   \   0000006C   0160B0E1           MOVS     R6,R1
    126          	
    127              if(size < (PAGE_SIZE-pageAddr) )			// 要写的字节数不足一页
   \   00000070   400F76E2           RSBS     R0,R6,#+256
   \   00000074   000054E1           CMP      R4,R0
   \   00000078   080000AA           BGE      ??AT24C08_Write_5
    128              {
    129                  AT24C08_Write_Page(page, pageAddr, data, size);
   \   0000007C   0430B0E1           MOVS     R3,R4
   \   00000080   0820B0E1           MOVS     R2,R8
   \   00000084   0610B0E1           MOVS     R1,R6
   \   00000088   0500B0E1           MOVS     R0,R5
   \   0000008C   FF0010E2           ANDS     R0,R0,#0xFF      ;; Zero extend
   \   00000090   ........           BL       AT24C08_Write_Page
    130                  size = 0;
   \   00000094   0000A0E3           MOV      R0,#+0
   \   00000098   0040B0E1           MOVS     R4,R0
   \   0000009C   0D0000EA           B        ??AT24C08_Write_6
    131              }
    132              else
    133              {
    134                  AT24C08_Write_Page(page, pageAddr, data, (PAGE_SIZE-pageAddr));    
   \                     ??AT24C08_Write_5:
   \   000000A0   403F76E2           RSBS     R3,R6,#+256
   \   000000A4   0820B0E1           MOVS     R2,R8
   \   000000A8   0610B0E1           MOVS     R1,R6
   \   000000AC   0500B0E1           MOVS     R0,R5
   \   000000B0   FF0010E2           ANDS     R0,R0,#0xFF      ;; Zero extend
   \   000000B4   ........           BL       AT24C08_Write_Page
    135                  size -= (PAGE_SIZE- pageAddr);
   \   000000B8   FF00E0E3           MVN      R0,#+255
   \   000000BC   000096E0           ADDS     R0,R6,R0
   \   000000C0   044090E0           ADDS     R4,R0,R4
    136                  cnt   = PAGE_SIZE-pageAddr;	
   \   000000C4   400F76E2           RSBS     R0,R6,#+256
   \   000000C8   0070B0E1           MOVS     R7,R0
    137                  pageAddr = 0;
   \   000000CC   0000A0E3           MOV      R0,#+0
   \   000000D0   0060B0E1           MOVS     R6,R0
    138                  page++;
   \   000000D4   015095E2           ADDS     R5,R5,#+1
    139              }
    140              while(size > PAGE_SIZE)
   \                     ??AT24C08_Write_6:
   \   000000D8   0100A0E3           MOV      R0,#+1
   \   000000DC   400F80E3           ORR      R0,R0,#0x100
   \   000000E0   000054E1           CMP      R4,R0
   \   000000E4   0C0000BA           BLT      ??AT24C08_Write_7
    141              {
    142                  AT24C08_Write_Page(page, pageAddr, (data+cnt), PAGE_SIZE);
   \   000000E8   403FA0E3           MOV      R3,#+256
   \   000000EC   082097E0           ADDS     R2,R7,R8
   \   000000F0   0610B0E1           MOVS     R1,R6
   \   000000F4   0500B0E1           MOVS     R0,R5
   \   000000F8   FF0010E2           ANDS     R0,R0,#0xFF      ;; Zero extend
   \   000000FC   ........           BL       AT24C08_Write_Page
    143                  page++;
   \   00000100   015095E2           ADDS     R5,R5,#+1
    144                  pageAddr = 0;
   \   00000104   0000A0E3           MOV      R0,#+0
   \   00000108   0060B0E1           MOVS     R6,R0
    145                  size -= PAGE_SIZE;
   \   0000010C   FF00E0E3           MVN      R0,#+255
   \   00000110   044090E0           ADDS     R4,R0,R4
    146                  cnt  += PAGE_SIZE;
   \   00000114   407F97E2           ADDS     R7,R7,#+256
   \   00000118   EEFFFFEA           B        ??AT24C08_Write_6
    147              }
    148              if(size > 0)	
   \                     ??AT24C08_Write_7:
   \   0000011C   010054E3           CMP      R4,#+1
   \   00000120   050000BA           BLT      ??AT24C08_Write_8
    149                  AT24C08_Write_Page(page, pageAddr, (data+cnt), size);  
   \   00000124   0430B0E1           MOVS     R3,R4
   \   00000128   082097E0           ADDS     R2,R7,R8
   \   0000012C   0610B0E1           MOVS     R1,R6
   \   00000130   0500B0E1           MOVS     R0,R5
   \   00000134   FF0010E2           ANDS     R0,R0,#0xFF      ;; Zero extend
   \   00000138   ........           BL       AT24C08_Write_Page
    150              
    151              delay_ms(10);	
   \                     ??AT24C08_Write_8:
   \   0000013C   0A00A0E3           MOV      R0,#+10
   \   00000140   ........           BL       delay_ms
    152              TWI_Close();
   \   00000144   ........           BL       TWI_Close
    153              return 0;
   \   00000148   0000A0E3           MOV      R0,#+0
   \                     ??AT24C08_Write_2:
   \   0000014C   F283BDE8           POP      {R1,R4-R9,PC}    ;; return
    154          }
    155          
    156          
    157          //*============================================================================
    158          //* 函数名称:AT24C08_Read_Page
    159          //* 函数功能:从AT24C08 指定的页面读取数据 (一次只能读取一个页面)
    160          //* 入口参数:page	: 页面值( AT24C08共4页(0,1,2,3) )
    161          //*	      address	: 读取数据地址(0~255)
    162          //*	      *data	: 读出数据存放的起始地址
    163          //*	      size	: 读取数据的长度
    164          //* 返回值  : 0: 读取数据正常
    165          //*	      1: 读取数据时发生错误	
    166          //*	      2: 页面值范围出错	
    167          //*	      3: 读取地址范围出错
    168          //*	      4: 数据长度范围出错
    169          //*============================================================================

   \                                 In section .text, align 4, keep-with-next
    170          char AT24C08_Read_Page(int page, int address, char *data, int size)
    171          {
   \                     AT24C08_Read_Page:
   \   00000000   F0412DE9           PUSH     {R4-R8,LR}
   \   00000004   0040B0E1           MOVS     R4,R0
   \   00000008   0150B0E1           MOVS     R5,R1
   \   0000000C   0260B0E1           MOVS     R6,R2
   \   00000010   0370B0E1           MOVS     R7,R3
    172              char slvAddr;
    173          	
    174              if( (page >= AT24C08_PAGE_SIZE)||(page<0) )		// AT24C08 共4页,分别为0,1,2,3, 大于3出错
   \   00000014   040054E3           CMP      R4,#+4
   \   00000018   010000AA           BGE      ??AT24C08_Read_Page_0
   \   0000001C   000054E3           CMP      R4,#+0
   \   00000020   0100005A           BPL      ??AT24C08_Read_Page_1
    175              {
    176                  // DBGU_Printk("Read page error !\r\n");
    177                  return 2;
   \                     ??AT24C08_Read_Page_0:
   \   00000024   0200A0E3           MOV      R0,#+2
   \   00000028   180000EA           B        ??AT24C08_Read_Page_2
    178              }
    179          	
    180              if( (address >= PAGE_SIZE)||(address<0) )			// AT24C08 每页只能读256字节,页内地址范围为(0~255)
   \                     ??AT24C08_Read_Page_1:
   \   0000002C   400F55E3           CMP      R5,#+256
   \   00000030   010000AA           BGE      ??AT24C08_Read_Page_3
   \   00000034   000055E3           CMP      R5,#+0
   \   00000038   0100005A           BPL      ??AT24C08_Read_Page_4
    181              {
    182                  // DBGU_Printk("Read address error !\r\n");
    183                  return 3;
   \                     ??AT24C08_Read_Page_3:
   \   0000003C   0300A0E3           MOV      R0,#+3
   \   00000040   120000EA           B        ??AT24C08_Read_Page_2
    184              }
    185          	
    186              if( (size > (PAGE_SIZE-address))||(size<0) )		// AT24C08 每页只能读 256 字节
   \                     ??AT24C08_Read_Page_4:
   \   00000044   400F75E2           RSBS     R0,R5,#+256
   \   00000048   070050E1           CMP      R0,R7
   \   0000004C   010000BA           BLT      ??AT24C08_Read_Page_5
   \   00000050   000057E3           CMP      R7,#+0
   \   00000054   0100005A           BPL      ??AT24C08_Read_Page_6
    187              {
    188                  // DBGU_Printk("Read word leng error !\r\n");
    189                  return 4;
   \                     ??AT24C08_Read_Page_5:
   \   00000058   0400A0E3           MOV      R0,#+4
   \   0000005C   0B0000EA           B        ??AT24C08_Read_Page_2
    190              }
    191          	
    192              slvAddr = AT24C08_BASE_ADDR + page;
   \                     ??AT24C08_Read_Page_6:
   \   00000060   0400B0E1           MOVS     R0,R4

⌨️ 快捷键说明

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