📄 msd.txt
字号:
; generated by ARM/Thumb C/C++ Compiler with , RVCT3.1 [Build 938] for uVision
; commandline ArmCC [--split_sections --debug -c --asm --interleave -o..\Release\msd.o --depend=..\Release\msd.d --device=DARMSTM --apcs=interwork -O3 -I..\code\header -I..\code\library\inc -I..\..\include -I..\..\..\..\library\inc -I..\..\..\..\..\FWLib\library\inc -I..\code\FAT16 -I..\code\driver -ID:\Keil\ARM\INC\ST\STM32F10x -DVECT_TAB_FLASH --omf_browse=..\Release\msd.crf ..\code\driver\msd.c]
THUMB
AREA ||i.MSD_WriteByte||, CODE, READONLY, ALIGN=2
MSD_WriteByte PROC
000000 b570 PUSH {r4-r6,lr}
000002 4c07 LDR r4,|L1.32|
000004 4605 MOV r5,r0
|L1.6|
000006 2102 MOVS r1,#2
000008 4620 MOV r0,r4
00000a f7fffffe BL SPI_I2S_GetFlagStatus
00000e 2800 CMP r0,#0
000010 d0f9 BEQ |L1.6|
000012 4629 MOV r1,r5
000014 4620 MOV r0,r4
000016 e8bd4070 POP {r4-r6,lr}
00001a f7ffbffe B.W SPI_I2S_SendData
ENDP
00001e 0000 DCW 0x0000
|L1.32|
000020 40013000 DCD 0x40013000
AREA ||i.MSD_SendCmd||, CODE, READONLY, ALIGN=1
MSD_SendCmd PROC
;;;518 void MSD_SendCmd(u8 Cmd, u32 Arg, u8 Crc)
;;;519 {
000000 b57c PUSH {r2-r6,lr}
;;;520 u32 i = 0x00;
;;;521 u8 Frame[6];
;;;522
;;;523 /* Construct byte1 */
;;;524 Frame[0] = (Cmd | 0x40);
000002 f0400040 ORR r0,r0,#0x40
000006 f88d0000 STRB r0,[sp,#0]
;;;525 /* Construct byte2 */
;;;526 Frame[1] = (u8)(Arg >> 24);
00000a 0e08 LSRS r0,r1,#24
00000c f88d0001 STRB r0,[sp,#1]
;;;527 /* Construct byte3 */
;;;528 Frame[2] = (u8)(Arg >> 16);
000010 0c08 LSRS r0,r1,#16
000012 2400 MOVS r4,#0 ;520
000014 f88d0002 STRB r0,[sp,#2]
;;;529 /* Construct byte4 */
;;;530 Frame[3] = (u8)(Arg >> 8);
000018 0a08 LSRS r0,r1,#8
;;;531 /* Construct byte5 */
;;;532 Frame[4] = (u8)(Arg);
00001a f88d1004 STRB r1,[sp,#4]
00001e f88d0003 STRB r0,[sp,#3] ;530
;;;533 /* Construct CRC: byte6 */
;;;534 Frame[5] = (Crc);
000022 f88d2005 STRB r2,[sp,#5]
000026 466d MOV r5,sp
|L2.40|
;;;535
;;;536 /* Send the Cmd bytes */
;;;537 for (i = 0; i < 6; i++)
;;;538 {
;;;539 MSD_WriteByte(Frame[i]);
000028 5d28 LDRB r0,[r5,r4]
00002a f7fffffe BL MSD_WriteByte
00002e 1c64 ADDS r4,r4,#1 ;537
000030 2c06 CMP r4,#6 ;537
000032 d3f9 BCC |L2.40|
;;;540 }
;;;541 }
000034 bd7c POP {r2-r6,pc}
;;;542
ENDP
AREA ||i.MSD_ReadByte||, CODE, READONLY, ALIGN=2
MSD_ReadByte PROC
;;;723 u8 MSD_ReadByte(void)
;;;724 {
000000 b510 PUSH {r4,lr}
000002 4c0b LDR r4,|L3.48|
|L3.4|
;;;725 u8 Data = 0;
;;;726
;;;727 /* Wait until the transmit buffer is empty */
;;;728 while (SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_TXE) == RESET);
000004 2102 MOVS r1,#2
000006 4620 MOV r0,r4
000008 f7fffffe BL SPI_I2S_GetFlagStatus
00000c 2800 CMP r0,#0
00000e d0f9 BEQ |L3.4|
;;;729 /* Send the byte */
;;;730 SPI_I2S_SendData(SPI1, DUMMY);
000010 21ff MOVS r1,#0xff
000012 4620 MOV r0,r4
000014 f7fffffe BL SPI_I2S_SendData
|L3.24|
;;;731
;;;732 /* Wait until a data is received */
;;;733 while (SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_RXNE) == RESET);
000018 2101 MOVS r1,#1
00001a 4620 MOV r0,r4
00001c f7fffffe BL SPI_I2S_GetFlagStatus
000020 2800 CMP r0,#0
000022 d0f9 BEQ |L3.24|
;;;734 /* Get the received data */
;;;735 Data = SPI_I2S_ReceiveData(SPI1);
000024 4620 MOV r0,r4
000026 f7fffffe BL SPI_I2S_ReceiveData
00002a b2c0 UXTB r0,r0
;;;736
;;;737 /* Return the shifted data */
;;;738 return Data;
;;;739 }
00002c bd10 POP {r4,pc}
;;;740
ENDP
00002e 0000 DCW 0x0000
|L3.48|
000030 40013000 DCD 0x40013000
AREA ||i.MSD_GetResponse||, CODE, READONLY, ALIGN=1
MSD_GetResponse PROC
000000 b570 PUSH {r4-r6,lr}
000002 4605 MOV r5,r0
000004 f64074ff MOV r4,#0xfff
000008 e000 B |L4.12|
|L4.10|
00000a 1e64 SUBS r4,r4,#1
|L4.12|
00000c f7fffffe BL MSD_ReadByte
000010 42a8 CMP r0,r5
000012 d002 BEQ |L4.26|
000014 2c00 CMP r4,#0
000016 d1f8 BNE |L4.10|
000018 e000 B |L4.28|
|L4.26|
00001a b90c CBNZ r4,|L4.32|
|L4.28|
00001c 20ff MOVS r0,#0xff
00001e bd70 POP {r4-r6,pc}
|L4.32|
000020 2000 MOVS r0,#0
000022 bd70 POP {r4-r6,pc}
ENDP
AREA ||i.MSD_GoIdleState||, CODE, READONLY, ALIGN=2
MSD_GoIdleState PROC
;;;663 u8 MSD_GoIdleState(void)
;;;664 {
000000 b510 PUSH {r4,lr}
;;;665 /* MSD chip select low */
;;;666 MSD_CS_LOW();
000002 4c17 LDR r4,|L5.96|
000004 2108 MOVS r1,#8
000006 4620 MOV r0,r4
000008 f7fffffe BL GPIO_ResetBits
;;;667 /* Send CMD0 (GO_IDLE_STATE) to put MSD in SPI mode */
;;;668 MSD_SendCmd(MSD_GO_IDLE_STATE, 0, 0x95);
00000c 2100 MOVS r1,#0
00000e 2295 MOVS r2,#0x95
000010 4608 MOV r0,r1
000012 f7fffffe BL MSD_SendCmd
;;;669
;;;670 /* Wait for In Idle State Response (R1 Format) equal to 0x01 */
;;;671 if (MSD_GetResponse(MSD_IN_IDLE_STATE))
000016 2001 MOVS r0,#1
000018 f7fffffe BL MSD_GetResponse
00001c b108 CBZ r0,|L5.34|
;;;672 {
;;;673 /* No Idle State Response: return response failue */
;;;674 return MSD_RESPONSE_FAILURE;
00001e 20ff MOVS r0,#0xff
;;;675 }
;;;676 /*----------Activates the card initialization process-----------*/
;;;677 do
;;;678 {
;;;679 /* MSD chip select high */
;;;680 MSD_CS_HIGH();
;;;681 /* Send Dummy byte 0xFF */
;;;682 MSD_WriteByte(DUMMY);
;;;683
;;;684 /* MSD chip select low */
;;;685 MSD_CS_LOW();
;;;686
;;;687 /* Send CMD1 (Activates the card process) until response equal to 0x0 */
;;;688 MSD_SendCmd(MSD_SEND_OP_COND, 0, 0xFF);
;;;689 /* Wait for no error Response (R1 Format) equal to 0x00 */
;;;690 }
;;;691 while (MSD_GetResponse(MSD_RESPONSE_NO_ERROR));
;;;692
;;;693 /* MSD chip select high */
;;;694 MSD_CS_HIGH();
;;;695 /* Send dummy byte 0xFF */
;;;696 MSD_WriteByte(DUMMY);
;;;697
;;;698 return MSD_RESPONSE_NO_ERROR;
;;;699 }
000020 bd10 POP {r4,pc}
|L5.34|
000022 2108 MOVS r1,#8 ;680
000024 4620 MOV r0,r4 ;680
000026 f7fffffe BL GPIO_SetBits
00002a 20ff MOVS r0,#0xff ;682
00002c f7fffffe BL MSD_WriteByte
000030 2108 MOVS r1,#8 ;685
000032 4620 MOV r0,r4 ;685
000034 f7fffffe BL GPIO_ResetBits
000038 22ff MOVS r2,#0xff ;688
00003a 2100 MOVS r1,#0 ;688
00003c 2001 MOVS r0,#1 ;688
00003e f7fffffe BL MSD_SendCmd
000042 2000 MOVS r0,#0 ;691
000044 f7fffffe BL MSD_GetResponse
000048 2800 CMP r0,#0 ;691
00004a d1ea BNE |L5.34|
00004c 2108 MOVS r1,#8 ;694
00004e 4620 MOV r0,r4 ;694
000050 f7fffffe BL GPIO_SetBits
000054 20ff MOVS r0,#0xff ;696
000056 f7fffffe BL MSD_WriteByte
00005a 2000 MOVS r0,#0 ;698
00005c bd10 POP {r4,pc}
;;;700
ENDP
00005e 0000 DCW 0x0000
|L5.96|
000060 40011800 DCD 0x40011800
AREA ||i.MSD_Init||, CODE, READONLY, ALIGN=2
MSD_Init PROC
;;;57 u8 MSD_Init(void)
;;;58 {
000000 b510 PUSH {r4,lr}
;;;59 u32 i = 0;
000002 2400 MOVS r4,#0
;;;60
;;;61 /* Initialize SPI1 */
;;;62 SPI_Config();
000004 f7fffffe BL SPI_Config
;;;63 /* MSD chip select high */
;;;64 MSD_CS_HIGH();
000008 2108 MOVS r1,#8
00000a 4806 LDR r0,|L6.36|
00000c f7fffffe BL GPIO_SetBits
|L6.16|
;;;65 /* Send dummy byte 0xFF, 10 times with CS high*/
;;;66 /* rise CS and MOSI for 80 clocks cycles */
;;;67 for (i = 0; i <= 9; i++)
;;;68 {
;;;69 /* Send dummy byte 0xFF */
;;;70 MSD_WriteByte(DUMMY);
000010 20ff MOVS r0,#0xff
000012 f7fffffe BL MSD_WriteByte
000016 1c64 ADDS r4,r4,#1 ;67
000018 2c09 CMP r4,#9 ;67
00001a d9f9 BLS |L6.16|
;;;71 }
;;;72 /*------------Put MSD in SPI mode--------------*/
;;;73 /* MSD initialized and set to SPI mode properly */
;;;74 return (MSD_GoIdleState());
00001c e8bd4010 POP {r4,lr}
000020 f7ffbffe B.W MSD_GoIdleState
;;;75 }
;;;76
ENDP
|L6.36|
000024 40011800 DCD 0x40011800
AREA ||i.MSD_GetDataResponse||, CODE, READONLY, ALIGN=1
MSD_GetDataResponse PROC
;;;554 u8 MSD_GetDataResponse(void)
;;;555 {
000000 b570 PUSH {r4-r6,lr}
;;;556 u32 i = 0;
000002 2500 MOVS r5,#0
|L7.4|
;;;557 u8 response, rvalue;
;;;558
;;;559 while (i <= 64)
;;;560 {
;;;561 /* Read resonse */
;;;562 response = MSD_ReadByte();
000004 f7fffffe BL MSD_ReadByte
;;;563 /* Mask unused bits */
;;;564 response &= 0x1F;
000008 f000041f AND r4,r0,#0x1f
;;;565
;;;566 switch (response)
00000c 2c05 CMP r4,#5
00000e d00a BEQ |L7.38|
000010 2c0b CMP r4,#0xb
000012 d003 BEQ |L7.28|
000014 2c0d CMP r4,#0xd
000016 d103 BNE |L7.32|
;;;567 {
;;;568 case MSD_DATA_OK:
;;;569 {
;;;570 rvalue = MSD_DATA_OK;
;;;571 break;
;;;572 }
;;;573
;;;574 case MSD_DATA_CRC_ERROR:
;;;575 return MSD_DATA_CRC_ERROR;
;;;576
;;;577 case MSD_DATA_WRITE_ERROR:
;;;578 return MSD_DATA_WRITE_ERROR;
000018 200d MOVS r0,#0xd
;;;579
;;;580 default:
;;;581 {
;;;582 rvalue = MSD_DATA_OTHER_ERROR;
;;;583 break;
;;;584 }
;;;585 }
;;;586 /* Exit loop in case of data ok */
;;;587 if (rvalue == MSD_DATA_OK)
;;;588 break;
;;;589 /* Increment loop counter */
;;;590 i++;
;;;591 }
;;;592 /* Wait null data */
;;;593 while (MSD_ReadByte() == 0);
;;;594 /* Return response */
;;;595 return response;
;;;596 }
00001a bd70 POP {r4-r6,pc}
|L7.28|
00001c 200b MOVS r0,#0xb ;575
00001e bd70 POP {r4-r6,pc}
|L7.32|
000020 1c6d ADDS r5,r5,#1 ;590
000022 2d40 CMP r5,#0x40 ;559
000024 d9ee BLS |L7.4|
|L7.38|
000026 f7fffffe BL MSD_ReadByte
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -