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

📄 mmc.lst

📁 at91sam7x256 FREERTOS sd卡的读写程序
💻 LST
📖 第 1 页 / 共 5 页
字号:
   \   00000006   6070               STRB        R0,[R4, #+1]
    145          	rcvr_spi();
   \   00000008   FF20               MOV         R0,#+255
   \   0000000A   ........           BL          AT91_spi
    146          	do
    147          		res = rcvr_spi();
   \                     ??wait_ready_0:
   \   0000000E   FF20               MOV         R0,#+255
   \   00000010   ........           BL          AT91_spi
    148          	while ((res != 0xFF) && Timer);
   \   00000014   FF28               CMP         R0,#+255
   \   00000016   02D0               BEQ         ??wait_ready_1
   \   00000018   6178               LDRB        R1,[R4, #+1]
   \   0000001A   0029               CMP         R1,#+0
   \   0000001C   F7D1               BNE         ??wait_ready_0
    149          	return res;
   \                     ??wait_ready_1:
   \   0000001E   10BC               POP         {R4}
   \   00000020   02BC               POP         {R1}
   \   00000022   0847               BX          R1                 ;; return
    150          }
    151          
    152          /*--------------------------------*/
    153          /* Receive a data packet from MMC */
    154          

   \                                 In segment CODE, align 4, keep-with-next
    155          extern
    156          unsigned int rcvr_datablock (
    157          	BYTE *buff,			/* Data buffer to store received data */
    158          	BYTE wc				/* Word count (0 means 256 words) */
    159          )
    160          {
   \                     rcvr_datablock:
   \   00000000   70B5               PUSH        {R4-R6,LR}
   \   00000002   041C               MOV         R4,R0
   \   00000004   0D1C               MOV         R5,R1
    161          	BYTE token;
    162          
    163          	Timer = 10;
   \   00000006   ....               LDR         R6,??DataTable8    ;; Stat
   \   00000008   0A20               MOV         R0,#+10
   \   0000000A   7070               STRB        R0,[R6, #+1]
   \   0000000C   02E0               B           ??rcvr_datablock_0
    164          	do {							/* Wait for data packet in timeout of 100ms */
    165          		token = rcvr_spi();
    166          	} while ((token == 0xFF) && Timer );
   \                     ??rcvr_datablock_1:
   \   0000000E   7078               LDRB        R0,[R6, #+1]
   \   00000010   0028               CMP         R0,#+0
   \   00000012   06D0               BEQ         ??rcvr_datablock_2
   \                     ??rcvr_datablock_0:
   \   00000014   FF20               MOV         R0,#+255
   \   00000016   ........           BL          AT91_spi
   \   0000001A   FF28               CMP         R0,#+255
   \   0000001C   F7D0               BEQ         ??rcvr_datablock_1
    167          	if(token != 0xFE) return FALSE;	/* If not valid data token, retutn with error */
   \   0000001E   FE28               CMP         R0,#+254
   \   00000020   01D0               BEQ         ??rcvr_datablock_3
   \                     ??rcvr_datablock_2:
   \   00000022   0020               MOV         R0,#+0
   \   00000024   14E0               B           ??rcvr_datablock_4
    168          
    169          	do {							/* Receive the data block into buffer */
    170          		rcvr_spi_m(buff++);
   \                     ??rcvr_datablock_3:
   \   00000026   FF20               MOV         R0,#+255
   \   00000028   ........           BL          AT91_spi
   \   0000002C   2070               STRB        R0,[R4, #+0]
   \   0000002E   641C               ADD         R4,R4,#+1
    171          		rcvr_spi_m(buff++);
   \   00000030   FF20               MOV         R0,#+255
   \   00000032   ........           BL          AT91_spi
   \   00000036   2070               STRB        R0,[R4, #+0]
   \   00000038   641C               ADD         R4,R4,#+1
    172          	} while (--wc);
   \   0000003A   6D1E               SUB         R5,R5,#+1
   \   0000003C   2D06               LSL         R5,R5,#+24
   \   0000003E   2D0E               LSR         R5,R5,#+24
   \   00000040   F1D1               BNE         ??rcvr_datablock_3
    173          	rcvr_spi();						/* Discard CRC */
   \   00000042   FF20               MOV         R0,#+255
   \   00000044   ........           BL          AT91_spi
    174          	rcvr_spi();
   \   00000048   FF20               MOV         R0,#+255
   \   0000004A   ........           BL          AT91_spi
    175          
    176          	return TRUE;					/* Return with success */
   \   0000004E   0120               MOV         R0,#+1
   \                     ??rcvr_datablock_4:
   \   00000050   ....               B           ?Subroutine21
    177          }

   \                                 In segment CODE, align 4, keep-with-next
   \                     ?Subroutine21:
   \   00000000   70BC               POP         {R4-R6}
   \   00000002   02BC               POP         {R1}
   \   00000004   0847               BX          R1                 ;; return
    178          
    179          
    180          
    181          /*---------------------------*/
    182          /* Send a data packet to MMC */
    183          
    184          #ifndef _READONLY

   \                                 In segment CODE, align 4, keep-with-next
    185          static
    186          unsigned int xmit_datablock (
    187          	const BYTE *buff,	/* 512 byte data block to be transmitted */
    188          	BYTE token			/* Data/Stop token */
    189          )
    190          {
   \                     xmit_datablock:
   \   00000000   70B5               PUSH        {R4-R6,LR}
   \   00000002   041C               MOV         R4,R0
   \   00000004   0D1C               MOV         R5,R1
    191          	BYTE resp, wc = 0;
   \   00000006   0026               MOV         R6,#+0
    192          
    193          
    194          	if (wait_ready() != 0xFF) return FALSE;
   \   00000008   ........           BL          wait_ready
   \   0000000C   FF28               CMP         R0,#+255
   \   0000000E   01D0               BEQ         ??xmit_datablock_0
   \                     ??xmit_datablock_1:
   \   00000010   0020               MOV         R0,#+0
   \   00000012   1EE0               B           ??xmit_datablock_2
    195          
    196          	xmit_spi(token);					/* Xmit data token */
   \                     ??xmit_datablock_0:
   \   00000014   281C               MOV         R0,R5
   \   00000016   ........           BL          AT91_spi
    197          	if (token != 0xFD) {	/* Is data token */
   \   0000001A   FD2D               CMP         R5,#+253
   \   0000001C   18D0               BEQ         ??xmit_datablock_3
    198          		do {							/* Xmit the 512 byte data block to MMC */
    199          			xmit_spi(*buff++);
   \                     ??xmit_datablock_4:
   \   0000001E   2078               LDRB        R0,[R4, #+0]
   \   00000020   ........           BL          AT91_spi
   \   00000024   641C               ADD         R4,R4,#+1
    200          			xmit_spi(*buff++);
   \   00000026   2078               LDRB        R0,[R4, #+0]
   \   00000028   ........           BL          AT91_spi
   \   0000002C   641C               ADD         R4,R4,#+1
    201          		} while (--wc);
   \   0000002E   761E               SUB         R6,R6,#+1
   \   00000030   3606               LSL         R6,R6,#+24
   \   00000032   360E               LSR         R6,R6,#+24
   \   00000034   F3D1               BNE         ??xmit_datablock_4
    202          		xmit_spi(0xFF);					/* CRC (Dummy) */
   \   00000036   FF20               MOV         R0,#+255
   \   00000038   ........           BL          AT91_spi
    203          		xmit_spi(0xFF);
   \   0000003C   FF20               MOV         R0,#+255
   \   0000003E   ........           BL          AT91_spi
    204          		resp = rcvr_spi();				/* Reveive data response */
   \   00000042   FF20               MOV         R0,#+255
   \   00000044   ........           BL          AT91_spi
    205          		if ((resp & 0x1F) != 0x05)		/* If not accepted, return with error */
   \   00000048   C006               LSL         R0,R0,#+27
   \   0000004A   C00E               LSR         R0,R0,#+27
   \   0000004C   0528               CMP         R0,#+5
   \   0000004E   DFD1               BNE         ??xmit_datablock_1
    206          			return FALSE;
    207          	}
    208          
    209          	return TRUE;
   \                     ??xmit_datablock_3:
   \   00000050   0120               MOV         R0,#+1
   \                     ??xmit_datablock_2:
   \   00000052   C046               NOP         
   \   00000054                      REQUIRE ?Subroutine21
   \   00000054                      ;; // Fall through to label ?Subroutine21
    210          }
    211          #endif
    212          
    213          
    214          /*------------------------------*/
    215          /* Send a command packet to MMC */
    216          

   \                                 In segment CODE, align 4, keep-with-next
    217          extern
    218           BYTE send_cmd (
    219          	BYTE cmd,		/* Command byte */
    220          	DWORD arg		/* Argument */
    221          )
    222          {
   \                     send_cmd:
   \   00000000   30B5               PUSH        {R4,R5,LR}
   \   00000002   041C               MOV         R4,R0
   \   00000004   0D1C               MOV         R5,R1
    223          	BYTE n, res;
    224          
    225          
    226          	if (wait_ready() != 0xFF) return 0xFF;
   \   00000006   ........           BL          wait_ready
   \   0000000A   FF28               CMP         R0,#+255
   \   0000000C   01D0               BEQ         ??send_cmd_0
   \   0000000E   FF20               MOV         R0,#+255
   \   00000010   24E0               B           ??send_cmd_1
    227          
    228          	/* Send command packet */
    229          	xmit_spi(cmd);						/* Command */
   \                     ??send_cmd_0:
   \   00000012   201C               MOV         R0,R4
   \   00000014   ........           BL          AT91_spi
    230          	xmit_spi((BYTE)(arg >> 24));		/* Argument[31..24] */
   \   00000018   280E               LSR         R0,R5,#+24
   \   0000001A   ........           BL          AT91_spi
    231          	xmit_spi((BYTE)(arg >> 16));		/* Argument[23..16] */
   \   0000001E   280C               LSR         R0,R5,#+16
   \   00000020   0006               LSL         R0,R0,#+24
   \   00000022   000E               LSR         R0,R0,#+24
   \   00000024   ........           BL          AT91_spi
    232          	xmit_spi((BYTE)(arg >> 8));			/* Argument[15..8] */
   \   00000028   280A               LSR         R0,R5,#+8
   \   0000002A   0006               LSL         R0,R0,#+24
   \   0000002C   000E               LSR         R0,R0,#+24
   \   0000002E   ........           BL          AT91_spi
    233          	xmit_spi((BYTE)arg);				/* Argument[7..0] */
   \   00000032   2806               LSL         R0,R5,#+24
   \   00000034   000E               LSR         R0,R0,#+24
   \   00000036   ........           BL          AT91_spi
    234          	xmit_spi(0x95);						/* CRC (valid for only CMD0) */
   \   0000003A   9520               MOV         R0,#+149
   \   0000003C   ........           BL          AT91_spi
    235          
    236          	/* Receive command response */
    237          	if (cmd == CMD12) rcvr_spi();		/* Skip a stuff byte when stop reading */
   \   00000040   4C2C               CMP         R4,#+76
   \   00000042   02D1               BNE         ??send_cmd_2
   \   00000044   FF20               MOV         R0,#+255
   \   00000046   ........           BL          AT91_spi
    238          	n = 10;								/* Wait for a valid response in timeout of 10 attempts */
   \                     ??send_cmd_2:
   \   0000004A   0A24               MOV         R4,#+10
    239          	do
    240          		res = rcvr_spi();
   \                     ??send_cmd_3:
   \   0000004C   FF20               MOV         R0,#+255
   \   0000004E   ........           BL          AT91_spi
    241          	while ((res & 0x80) && --n);
   \   00000052   0106               LSL         R1,R0,#+24
   \   00000054   02D5               BPL         ??send_cmd_1
   \   00000056   641E               SUB         R4,R4,#+1
   \   00000058   2106               LSL         R1,R4,#+24
   \   0000005A   F7D1               BNE         ??send_cmd_3
    242          
    243          	return res;			/* Return with the response value */
   \                     ??send_cmd_1:

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -