📄 eeprom.lst
字号:
\ 00000064 500090E2 ADDS R0,R0,#+80
\ 00000068 0080B0E1 MOVS R8,R0
193
194 TWI_Read(AT91C_BASE_TWI, slvAddr, address, data, size);
\ 0000006C 08702DE5 STR R7,[SP, #-8]!
\ 00000070 0630B0E1 MOVS R3,R6
\ 00000074 0520B0E1 MOVS R2,R5
\ 00000078 0810B0E1 MOVS R1,R8
\ 0000007C FF1011E2 ANDS R1,R1,#0xFF ;; Zero extend
\ 00000080 ........ LDR R0,??DataTable4 ;; 0xfffac000
\ 00000084 ........ BL TWI_Read
\ 00000088 08D08DE2 ADD SP,SP,#+8 ;; stack cleaning
195
196 return 0;
\ 0000008C 0000A0E3 MOV R0,#+0
\ ??AT24C08_Read_Page_2:
\ 00000090 F081BDE8 POP {R4-R8,PC} ;; return
197 }
198
199
200 //*============================================================================
201 //* 函数名称:AT24C08_Read
202 //* 函数功能:从 AT24C08 读取数据
203 //* 入口参数:address : 读取数据地址(0~1023)
204 //* *data : 读出数据存放的起始地址
205 //* size : 读取数据的长度
206 //* 返回值 : 0: 读取正常
207 //* 1: 读取数据时发生错误
208 //* 2: 无
209 //* 3: 读取地址范围出错
210 //* 4: 数据长度范围出错
211 //*============================================================================
\ In section .text, align 4, keep-with-next
212 char AT24C08_Read(int address, char *data, int size)
213 {
\ AT24C08_Read:
\ 00000000 F8432DE9 PUSH {R3-R9,LR}
\ 00000004 0090B0E1 MOVS R9,R0
\ 00000008 0180B0E1 MOVS R8,R1
\ 0000000C 0240B0E1 MOVS R4,R2
214 int page;
215 int pageAddr,cnt;
216
217 TWI_Open();
\ 00000010 ........ BL TWI_Open
218
219 if( (address >= AT24C08_MAX_ADDR)||(address<0) ) // AT24C08 寻址范围为(0~1023)共1204字节
\ 00000014 400E59E3 CMP R9,#+1024
\ 00000018 010000AA BGE ??AT24C08_Read_0
\ 0000001C 000059E3 CMP R9,#+0
\ 00000020 0200005A BPL ??AT24C08_Read_1
220 {
221 // DBGU_Printk("Write AT24C08 address error !\r\n");
222 TWI_Close();
\ ??AT24C08_Read_0:
\ 00000024 ........ BL TWI_Close
223 return 3;
\ 00000028 0300A0E3 MOV R0,#+3
\ 0000002C 400000EA B ??AT24C08_Read_2
224 }
225
226 if( (size > (AT24C08_MAX_BYTE-address))||(size<0) ) // AT24C08 最大可写 1024 字节
\ ??AT24C08_Read_1:
\ 00000030 400E79E2 RSBS R0,R9,#+1024
\ 00000034 040050E1 CMP R0,R4
\ 00000038 010000BA BLT ??AT24C08_Read_3
\ 0000003C 000054E3 CMP R4,#+0
\ 00000040 0200005A BPL ??AT24C08_Read_4
227 {
228 // DBGU_Printk("Write AT24C08 word leng error !\r\n");
229 TWI_Close();
\ ??AT24C08_Read_3:
\ 00000044 ........ BL TWI_Close
230 return 4;
\ 00000048 0400A0E3 MOV R0,#+4
\ 0000004C 380000EA B ??AT24C08_Read_2
231 }
232
233 page = (address / PAGE_SIZE); // 获取起始页值
\ ??AT24C08_Read_4:
\ 00000050 0900B0E1 MOVS R0,R9
\ 00000054 401FA0E3 MOV R1,#+256
\ 00000058 ........ BL __aeabi_idivmod
\ 0000005C 0050B0E1 MOVS R5,R0
234 pageAddr = address % PAGE_SIZE; // 获取页面起始地址
\ 00000060 0900B0E1 MOVS R0,R9
\ 00000064 401FA0E3 MOV R1,#+256
\ 00000068 ........ BL __aeabi_idivmod
\ 0000006C 0160B0E1 MOVS R6,R1
235
236 if(size < (PAGE_SIZE - pageAddr) ) // 要读的字节数不足一页
\ 00000070 400F76E2 RSBS R0,R6,#+256
\ 00000074 000054E1 CMP R4,R0
\ 00000078 070000AA BGE ??AT24C08_Read_5
237 {
238 AT24C08_Read_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 ........ BL AT24C08_Read_Page
239 size = 0;
\ 00000090 0000A0E3 MOV R0,#+0
\ 00000094 0040B0E1 MOVS R4,R0
\ 00000098 0C0000EA B ??AT24C08_Read_6
240 }
241 else
242 {
243 AT24C08_Read_Page(page, pageAddr, data, (256-pageAddr));
\ ??AT24C08_Read_5:
\ 0000009C 403F76E2 RSBS R3,R6,#+256
\ 000000A0 0820B0E1 MOVS R2,R8
\ 000000A4 0610B0E1 MOVS R1,R6
\ 000000A8 0500B0E1 MOVS R0,R5
\ 000000AC ........ BL AT24C08_Read_Page
244 size -= (PAGE_SIZE - pageAddr);
\ 000000B0 FF00E0E3 MVN R0,#+255
\ 000000B4 000096E0 ADDS R0,R6,R0
\ 000000B8 044090E0 ADDS R4,R0,R4
245 cnt = PAGE_SIZE - pageAddr;
\ 000000BC 400F76E2 RSBS R0,R6,#+256
\ 000000C0 0070B0E1 MOVS R7,R0
246 page++;
\ 000000C4 015095E2 ADDS R5,R5,#+1
247 pageAddr = 0;
\ 000000C8 0000A0E3 MOV R0,#+0
\ 000000CC 0060B0E1 MOVS R6,R0
248 }
249 while(size > PAGE_SIZE) // 读一页
\ ??AT24C08_Read_6:
\ 000000D0 0100A0E3 MOV R0,#+1
\ 000000D4 400F80E3 ORR R0,R0,#0x100
\ 000000D8 000054E1 CMP R4,R0
\ 000000DC 0B0000BA BLT ??AT24C08_Read_7
250 {
251 AT24C08_Read_Page(page, pageAddr, (data+cnt), PAGE_SIZE);
\ 000000E0 403FA0E3 MOV R3,#+256
\ 000000E4 082097E0 ADDS R2,R7,R8
\ 000000E8 0610B0E1 MOVS R1,R6
\ 000000EC 0500B0E1 MOVS R0,R5
\ 000000F0 ........ BL AT24C08_Read_Page
252 page++;
\ 000000F4 015095E2 ADDS R5,R5,#+1
253 pageAddr = 0;
\ 000000F8 0000A0E3 MOV R0,#+0
\ 000000FC 0060B0E1 MOVS R6,R0
254 size -= PAGE_SIZE;
\ 00000100 FF00E0E3 MVN R0,#+255
\ 00000104 044090E0 ADDS R4,R0,R4
255 cnt += PAGE_SIZE;
\ 00000108 407F97E2 ADDS R7,R7,#+256
\ 0000010C EFFFFFEA B ??AT24C08_Read_6
256 }
257 if(size > 0) // 读最后一页
\ ??AT24C08_Read_7:
\ 00000110 010054E3 CMP R4,#+1
\ 00000114 040000BA BLT ??AT24C08_Read_8
258 AT24C08_Read_Page(page, pageAddr, (data+cnt), size);
\ 00000118 0430B0E1 MOVS R3,R4
\ 0000011C 082097E0 ADDS R2,R7,R8
\ 00000120 0610B0E1 MOVS R1,R6
\ 00000124 0500B0E1 MOVS R0,R5
\ 00000128 ........ BL AT24C08_Read_Page
259
260 TWI_Close();
\ ??AT24C08_Read_8:
\ 0000012C ........ BL TWI_Close
261 return 0;
\ 00000130 0000A0E3 MOV R0,#+0
\ ??AT24C08_Read_2:
\ 00000134 F283BDE8 POP {R1,R4-R9,PC} ;; return
262 }
263
264
265 #define DataLeng 1024
266 //*============================================================================
267 //* 函数名称: AT24C08_Test()
268 //* 函数功能:测试AT24C08
269 //* 入口参数:无
270 //* 返回值 :无
271 //*============================================================================
\ In section .text, align 4, keep-with-next
272 void AT24C08_Test(void)
273 {
\ AT24C08_Test:
\ 00000000 70402DE9 PUSH {R4-R6,LR}
\ 00000004 C0DE4DE2 SUB SP,SP,#+3072
274 int i, j, error = 0;
\ 00000008 0000A0E3 MOV R0,#+0
\ 0000000C 0060B0E1 MOVS R6,R0
275 char write[DataLeng], read[DataLeng], zero[DataLeng];
276
277 DBGU_Printk("\r\n EEPROM Test:\r\n");
\ 00000010 AC019FE5 LDR R0,??AT24C08_Test_0+0x4 ;; `?<Constant "\\r\\n EEPROM Test:\\r\\n">`
\ 00000014 ........ BL DBGU_Printk
278
279 // 初始化数据
280 for(i=0; i<DataLeng; i++)
\ 00000018 0000A0E3 MOV R0,#+0
\ 0000001C 0040B0E1 MOVS R4,R0
\ ??AT24C08_Test_1:
\ 00000020 400E54E3 CMP R4,#+1024
\ 00000024 0F0000AA BGE ??AT24C08_Test_2
281 {
282 j = i;
\ 00000028 0450B0E1 MOVS R5,R4
283 while(j > 255)
\ ??AT24C08_Test_3:
\ 0000002C 400F55E3 CMP R5,#+256
\ 00000030 020000BA BLT ??AT24C08_Test_4
284 j -= 256;
\ 00000034 FF00E0E3 MVN R0,#+255
\ 00000038 055090E0 ADDS R5,R0,R5
\ 0000003C FAFFFFEA B ??AT24C08_Test_3
285 write[i] = j;
\ ??AT24C08_Test_4:
\ 00000040 800E8DE2 ADD R0,SP,#+2048
\ 00000044 0050C4E7 STRB R5,[R4, +R0]
286 read[i] = 0;
\ 00000048 400E8DE2 ADD R0,SP,#+1024
\ 0000004C 0010A0E3 MOV R1,#+0
\ 00000050 0010C4E7 STRB R1,[R4, +R0]
287 zero[i] = 0;
\ 00000054 0D00B0E1 MOVS R0,SP
\ 00000058 0010A0E3 MOV R1,#+0
\ 0000005C 0010C4E7 STRB R1,[R4, +R0]
288 }
\ 00000060 014094E2 ADDS R4,R4,#+1
\ 00000064 EDFFFFEA B ??AT24C08_Test_1
289
290 DBGU_Printk("write data to EEPROM:\r\n");
\ ??AT24C08_Test_2:
\ 00000068 58019FE5 LDR R0,??AT24C08_Test_0+0x8 ;; `?<Constant "write data to EEPROM:\\r\\n">`
\ 0000006C ........ BL DBGU_Printk
291 for(i = 0; i<DataLeng; i++)
\ 00000070 0000A0E3 MOV R0,#+0
\ 00000074 0040B0E1 MOVS R4,R0
\ ??AT24C08_Test_5:
\ 00000078 400E54E3 CMP R4,#+1024
\ 0000007C 050000AA BGE ??AT24C08_Test_6
292 printf("%3d ",write[i]);
\ 00000080 800E8DE2 ADD R0,SP,#+2048
\ 00000084 0010D4E7 LDRB R1,[R4, +R0]
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -