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