📄 mmc.lst
字号:
\ 00000018 8021 MOV R1,#+0x80
\ 0000001A 8901 LSL R1,R1,#+0x6 ;; #+0x2000
\ 0000001C .... LDR R0,??DataTable22 ;; 0xfffff400
\ 0000001E ........ _BLF AT91F_PIO_ClearOutput,AT91F_PIO_ClearOutput??rT
190
191 //send 6 Byte Command to MMC/SD-Card
192 for (i=0;i<0x06;i++)
\ 00000022 0020 MOV R0,#+0
\ 00000024 071C MOV R7,R0
\ ??Write_Command_MMC_0:
\ 00000026 3F06 LSL R7,R7,#+0x18 ;; ZeroExt R7,R7,#+0x18,#+0x18
\ 00000028 3F0E LSR R7,R7,#+0x18
\ 0000002A 062F CMP R7,#+0x6
\ 0000002C 05D2 BCS ??Write_Command_MMC_1
193 {
194 Write_Byte_MMC(*CMD++);
\ 0000002E 2078 LDRB R0,[R4, #+0]
\ 00000030 ........ BL Write_Byte_MMC
\ 00000034 641C ADD R4,#+0x1
195 }
\ 00000036 7F1C ADD R7,#+0x1
\ 00000038 F5E7 B ??Write_Command_MMC_0
196
197 //get 16 bit response
198 Read_Byte_MMC(); //read the first byte,ignore it.
\ ??Write_Command_MMC_1:
\ 0000003A ........ BL Read_Byte_MMC
199 do
200 { //Only last 8 bit is used here.Read it out.
201 tmp = Read_Byte_MMC(); // R1响应总共48bit ,后8比特为crc7+end bit
\ ??Write_Command_MMC_2:
\ 0000003E ........ BL Read_Byte_MMC
\ 00000042 051C MOV R5,R0
202 retry++;
\ 00000044 761C ADD R6,#+0x1
203 }
204 while((tmp==0xff)&&(retry<100));
\ 00000046 FF2D CMP R5,#+0xFF
\ 00000048 03D1 BNE ??Write_Command_MMC_3
\ 0000004A 3606 LSL R6,R6,#+0x18 ;; ZeroExt R6,R6,#+0x18,#+0x18
\ 0000004C 360E LSR R6,R6,#+0x18
\ 0000004E 642E CMP R6,#+0x64
\ 00000050 F5D3 BCC ??Write_Command_MMC_2
205 return(tmp);
\ ??Write_Command_MMC_3:
\ 00000052 281C MOV R0,R5
\ 00000054 F0BC POP {R4-R7}
\ 00000056 02BC POP {R1}
\ 00000058 0847 BX R1 ;; return
206 }
207
208 //****************************************************************************
\ In segment CODE, align 4, keep-with-next
209 unsigned char Read_Byte_MMC(void) //SPI读数据函数
210 //****************************************************************************
211 {
\ Read_Byte_MMC:
\ 00000000 30B5 PUSH {R4,R5,LR}
212 unsigned char temp=0;
\ 00000002 0020 MOV R0,#+0
\ 00000004 041C MOV R4,R0
213 unsigned char i;
214
215 //Software SPI
216 for (i=0; i<8; i++) //MSB First
\ 00000006 0020 MOV R0,#+0
\ 00000008 051C MOV R5,R0
\ ??Read_Byte_MMC_0:
\ 0000000A 2D06 LSL R5,R5,#+0x18 ;; ZeroExt R5,R5,#+0x18,#+0x18
\ 0000000C 2D0E LSR R5,R5,#+0x18
\ 0000000E 082D CMP R5,#+0x8
\ 00000010 20D2 BCS ??Read_Byte_MMC_1
217 {
218 AT91F_PIO_ClearOutput(AT91C_BASE_PIOA,SPI_Clock) ; //Clock Impuls (Low)
\ 00000012 8021 MOV R1,#+0x80
\ 00000014 C902 LSL R1,R1,#+0xB ;; #+0x40000
\ 00000016 .... LDR R0,??DataTable22 ;; 0xfffff400
\ 00000018 ........ _BLF AT91F_PIO_ClearOutput,AT91F_PIO_ClearOutput??rT
219 if(Init_Flag) delay_us_8_;
\ 0000001C .... LDR R0,??DataTable18 ;; Init_Flag
\ 0000001E 0068 LDR R0,[R0, #+0]
\ 00000020 0028 CMP R0,#+0
\ 00000022 00D0 BEQ ??Read_Byte_MMC_2
\ 00000024 C046 nop
220 //read mmc data out pin
221 if((AT91F_PIO_GetInput(AT91C_BASE_PIOA) & (SPI_DI))!=0) //读输入数据
\ ??Read_Byte_MMC_2:
\ 00000026 .... LDR R0,??DataTable22 ;; 0xfffff400
\ 00000028 ........ _BLF AT91F_PIO_GetInput,AT91F_PIO_GetInput??rT
\ 0000002C C003 LSL R0,R0,#+0xF
\ 0000002E 04D5 BPL ??Read_Byte_MMC_3
222 temp = (temp << 1) + 1;
\ 00000030 2406 LSL R4,R4,#+0x18 ;; ZeroExt R4,R4,#+0x18,#+0x18
\ 00000032 240E LSR R4,R4,#+0x18
\ 00000034 6400 LSL R4,R4,#+0x1
\ 00000036 641C ADD R4,#+0x1
\ 00000038 00E0 B ??Read_Byte_MMC_4
223 else
224 temp = (temp << 1) + 0;
\ ??Read_Byte_MMC_3:
\ 0000003A 6400 LSL R4,R4,#+0x1
225 AT91F_PIO_SetOutput(AT91C_BASE_PIOA,SPI_Clock) ; //set Clock Impuls High
\ ??Read_Byte_MMC_4:
\ 0000003C 8021 MOV R1,#+0x80
\ 0000003E C902 LSL R1,R1,#+0xB ;; #+0x40000
\ 00000040 .... LDR R0,??DataTable22 ;; 0xfffff400
\ 00000042 ........ _BLF AT91F_PIO_SetOutput,AT91F_PIO_SetOutput??rT
226 if(Init_Flag) delay_us_8_;
\ 00000046 .... LDR R0,??DataTable18 ;; Init_Flag
\ 00000048 0068 LDR R0,[R0, #+0]
\ 0000004A 0028 CMP R0,#+0
\ 0000004C 00D0 BEQ ??Read_Byte_MMC_5
\ 0000004E C046 nop
227 }
\ ??Read_Byte_MMC_5:
\ 00000050 6D1C ADD R5,#+0x1
\ 00000052 DAE7 B ??Read_Byte_MMC_0
228 return (temp);
\ ??Read_Byte_MMC_1:
\ 00000054 201C MOV R0,R4
\ 00000056 0006 LSL R0,R0,#+0x18 ;; ZeroExt R0,R0,#+0x18,#+0x18
\ 00000058 000E LSR R0,R0,#+0x18
\ 0000005A 30BC POP {R4,R5}
\ 0000005C 02BC POP {R1}
\ 0000005E 0847 BX R1 ;; return
229 //上面的读的方法是直接驱动总线,也可以直接接收 SPI_RDR寄存器 ,如下:
230 //return( AT91F_SPI_GetChar (NowSD_SPI)) ;
231 }
232
233 //****************************************************************************
234 //Routine for sending a byte to MMC/SD-Card
\ In segment CODE, align 4, keep-with-next
235 void Write_Byte_MMC(unsigned char value)
236 //****************************************************************************
237 {
\ Write_Byte_MMC:
\ 00000000 30B5 PUSH {R4,R5,LR}
\ 00000002 041C MOV R4,R0
238 unsigned char i;
239
240 //Software SPI
241 for (i=0; i<8; i++)
\ 00000004 0020 MOV R0,#+0
\ 00000006 051C MOV R5,R0
\ ??Write_Byte_MMC_0:
\ 00000008 2D06 LSL R5,R5,#+0x18 ;; ZeroExt R5,R5,#+0x18,#+0x18
\ 0000000A 2D0E LSR R5,R5,#+0x18
\ 0000000C 082D CMP R5,#+0x8
\ 0000000E 28D2 BCS ??Write_Byte_MMC_1
242 { //write a byte
243 if (((value >> (7-i)) & 0x01)==0x01)
\ 00000010 2406 LSL R4,R4,#+0x18 ;; ZeroExt R4,R4,#+0x18,#+0x18
\ 00000012 240E LSR R4,R4,#+0x18
\ 00000014 0720 MOV R0,#+0x7
\ 00000016 401B SUB R0,R0,R5
\ 00000018 211C MOV R1,R4
\ 0000001A 0141 ASR R1,R0
\ 0000001C C807 LSL R0,R1,#+0x1F
\ 0000001E 05D5 BPL ??Write_Byte_MMC_2
244 AT91F_PIO_SetOutput(AT91C_BASE_PIOA,SPI_DO) ;//Send bit by bit(MSB First)
\ 00000020 8021 MOV R1,#+0x80
\ 00000022 8902 LSL R1,R1,#+0xA ;; #+0x20000
\ 00000024 .... LDR R0,??DataTable22 ;; 0xfffff400
\ 00000026 ........ _BLF AT91F_PIO_SetOutput,AT91F_PIO_SetOutput??rT
\ 0000002A 04E0 B ??Write_Byte_MMC_3
245 else
246 AT91F_PIO_ClearOutput(AT91C_BASE_PIOA,SPI_DO);
\ ??Write_Byte_MMC_2:
\ 0000002C 8021 MOV R1,#+0x80
\ 0000002E 8902 LSL R1,R1,#+0xA ;; #+0x20000
\ 00000030 .... LDR R0,??DataTable22 ;; 0xfffff400
\ 00000032 ........ _BLF AT91F_PIO_ClearOutput,AT91F_PIO_ClearOutput??rT
247 AT91F_PIO_ClearOutput(AT91C_BASE_PIOA,SPI_Clock); //set Clock Impuls low
\ ??Write_Byte_MMC_3:
\ 00000036 8021 MOV R1,#+0x80
\ 00000038 C902 LSL R1,R1,#+0xB ;; #+0x40000
\ 0000003A .... LDR R0,??DataTable22 ;; 0xfffff400
\ 0000003C ........ _BLF AT91F_PIO_ClearOutput,AT91F_PIO_ClearOutput??rT
248 if(Init_Flag) delay_us_8_;
\ 00000040 .... LDR R0,??DataTable18 ;; Init_Flag
\ 00000042 0068 LDR R0,[R0, #+0]
\ 00000044 0028 CMP R0,#+0
\ 00000046 00D0 BEQ ??Write_Byte_MMC_4
\ 00000048 C046 nop
249 AT91F_PIO_SetOutput(AT91C_BASE_PIOA,SPI_Clock); //set Clock Impuls High
\ ??Write_Byte_MMC_4:
\ 0000004A 8021 MOV R1,#+0x80
\ 0000004C C902 LSL R1,R1,#+0xB ;; #+0x40000
\ 0000004E .... LDR R0,??DataTable22 ;; 0xfffff400
\ 00000050 ........ _BLF AT91F_PIO_SetOutput,AT91F_PIO_SetOutput??rT
250 if(Init_Flag) delay_us_8_;
\ 00000054 .... LDR R0,??DataTable18 ;; Init_Flag
\ 00000056 0068 LDR R0,[R0, #+0]
\ 00000058 0028 CMP R0,#+0
\ 0000005A 00D0 BEQ ??Write_Byte_MMC_5
\ 0000005C C046 nop
251 }//write a byte
\ ??Write_Byte_MMC_5:
\ 0000005E 6D1C ADD R5,#+0x1
\ 00000060 D2E7 B ??Write_Byte_MMC_0
252 AT91F_PIO_SetOutput(AT91C_BASE_PIOA,SPI_DO); //set Output High
\ ??Write_Byte_MMC_1:
\ 00000062 8021 MOV R1,#+0x80
\ 00000064 8902 LSL R1,R1,#+0xA ;; #+0x20000
\ 00000066 .... LDR R0,??DataTable22 ;; 0xfffff400
\ 00000068 ........ _BLF AT91F_PIO_SetOutput,AT91F_PIO_SetOutput??rT
253 //使用如下的库函数来发送数据,但发送前不检测状态是否为 ready
254 /*
255 AT91F_SPI_PutChar (NowSD_SPI,value,0) ;
256 */
257 }
\ 0000006C 30BC POP {R4,R5}
\ 0000006E 01BC POP {R0}
\ 00000070 0047 BX R0 ;; return
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -