📄 eeprom.lst
字号:
###############################################################################
# #
# 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 + -