⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 msd.txt

📁 MP3_PLAYER.rar
💻 TXT
📖 第 1 页 / 共 4 页
字号:
; 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 + -