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

📄 mmc.lst

📁 at91sam7x256 FREERTOS sd卡的读写程序
💻 LST
📖 第 1 页 / 共 5 页
字号:
    154          void rcvr_spi_m(BYTE *dst)
    155          {
    156          	*dst = rcvr_spi();
    157          }
    158          
    159          
    160          /*---------------------*/
    161          /* Wait for card ready */
    162          

   \                                 In segment CODE, align 4, keep-with-next
    163          static
    164          BYTE wait_ready ()
    165          {
   \                     wait_ready:
   \   00000000   10B5               PUSH        {R4,LR}
    166          	BYTE res;
    167          	
    168          	Timer = 50;			/* Wait for ready in timeout of 500ms */
   \   00000002   ....               LDR         R4,??DataTable8    ;; Stat
   \   00000004   3220               MOV         R0,#+50
   \   00000006   6070               STRB        R0,[R4, #+1]
    169          	rcvr_spi();
   \   00000008   FF20               MOV         R0,#+255
   \   0000000A   ........           BL          AT91_spi
    170          	do
    171          		res = rcvr_spi();
   \                     ??wait_ready_0:
   \   0000000E   FF20               MOV         R0,#+255
   \   00000010   ........           BL          AT91_spi
    172          	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
    173          	return res;
   \                     ??wait_ready_1:
   \   0000001E   10BC               POP         {R4}
   \   00000020   02BC               POP         {R1}
   \   00000022   0847               BX          R1                 ;; return
    174          }
    175          
    176          /*--------------------------------*/
    177          /* Receive a data packet from MMC */
    178          

   \                                 In segment CODE, align 4, keep-with-next
    179          extern
    180          BOOL rcvr_datablock (
    181          	BYTE *buff,			/* Data buffer to store received data */
    182          	BYTE wc				/* Word count (0 means 256 words) */
    183          )
    184          {
   \                     rcvr_datablock:
   \   00000000   70B5               PUSH        {R4-R6,LR}
   \   00000002   041C               MOV         R4,R0
   \   00000004   0D1C               MOV         R5,R1
    185          	BYTE token;
    186          
    187          	Timer = 10;
   \   00000006   ....               LDR         R6,??DataTable8    ;; Stat
   \   00000008   0A20               MOV         R0,#+10
   \   0000000A   7070               STRB        R0,[R6, #+1]
   \   0000000C   02E0               B           ??rcvr_datablock_0
    188          	do {							/* Wait for data packet in timeout of 100ms */
    189          		token = rcvr_spi();
    190          	} 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
    191          	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
    192          
    193          	do {							/* Receive the data block into buffer */
    194          		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
    195          		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
    196          	} 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
    197          	rcvr_spi();						/* Discard CRC */
   \   00000042   FF20               MOV         R0,#+255
   \   00000044   ........           BL          AT91_spi
    198          	rcvr_spi();
   \   00000048   FF20               MOV         R0,#+255
   \   0000004A   ........           BL          AT91_spi
    199          
    200          	return TRUE;					/* Return with success */
   \   0000004E   0120               MOV         R0,#+1
   \                     ??rcvr_datablock_4:
   \   00000050   ....               B           ?Subroutine17
    201          }

   \                                 In segment CODE, align 4, keep-with-next
   \                     ?Subroutine17:
   \   00000000   70BC               POP         {R4-R6}
   \   00000002   02BC               POP         {R1}
   \   00000004   0847               BX          R1                 ;; return
    202          
    203          
    204          
    205          /*---------------------------*/
    206          /* Send a data packet to MMC */
    207          
    208          #ifndef _READONLY

   \                                 In segment CODE, align 4, keep-with-next
    209          static
    210          BOOL xmit_datablock (
    211          	const BYTE *buff,	/* 512 byte data block to be transmitted */
    212          	BYTE token			/* Data/Stop token */
    213          )
    214          {
   \                     xmit_datablock:
   \   00000000   70B5               PUSH        {R4-R6,LR}
   \   00000002   041C               MOV         R4,R0
   \   00000004   0D1C               MOV         R5,R1
    215          	BYTE resp, wc = 0;
   \   00000006   0026               MOV         R6,#+0
    216          
    217          
    218          	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
    219          
    220          	xmit_spi(token);					/* Xmit data token */
   \                     ??xmit_datablock_0:
   \   00000014   281C               MOV         R0,R5
   \   00000016   ........           BL          AT91_spi
    221          	if (token != 0xFD) {	/* Is data token */
   \   0000001A   FD2D               CMP         R5,#+253
   \   0000001C   18D0               BEQ         ??xmit_datablock_3
    222          		do {							/* Xmit the 512 byte data block to MMC */
    223          			xmit_spi(*buff++);
   \                     ??xmit_datablock_4:
   \   0000001E   2078               LDRB        R0,[R4, #+0]
   \   00000020   ........           BL          AT91_spi
   \   00000024   641C               ADD         R4,R4,#+1
    224          			xmit_spi(*buff++);
   \   00000026   2078               LDRB        R0,[R4, #+0]
   \   00000028   ........           BL          AT91_spi
   \   0000002C   641C               ADD         R4,R4,#+1
    225          		} 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
    226          		xmit_spi(0xFF);					/* CRC (Dummy) */
   \   00000036   FF20               MOV         R0,#+255
   \   00000038   ........           BL          AT91_spi
    227          		xmit_spi(0xFF);
   \   0000003C   FF20               MOV         R0,#+255
   \   0000003E   ........           BL          AT91_spi
    228          		resp = rcvr_spi();				/* Reveive data response */
   \   00000042   FF20               MOV         R0,#+255
   \   00000044   ........           BL          AT91_spi
    229          		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
    230          			return FALSE;
    231          	}
    232          
    233          	return TRUE;
   \                     ??xmit_datablock_3:
   \   00000050   0120               MOV         R0,#+1
   \                     ??xmit_datablock_2:
   \   00000052   C046               NOP         
   \   00000054                      REQUIRE ?Subroutine17
   \   00000054                      ;; // Fall through to label ?Subroutine17
    234          }
    235          #endif
    236          
    237          
    238          /*------------------------------*/
    239          /* Send a command packet to MMC */
    240          

   \                                 In segment CODE, align 4, keep-with-next
    241          extern
    242           BYTE send_cmd (
    243          	BYTE cmd,		/* Command byte */
    244          	DWORD arg		/* Argument */
    245          )
    246          {
   \                     send_cmd:
   \   00000000   30B5               PUSH        {R4,R5,LR}
   \   00000002   041C               MOV         R4,R0
   \   00000004   0D1C               MOV         R5,R1
    247          	BYTE n, res;
    248          
    249          
    250          	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
    251          
    252          	/* Send command packet */
    253          	xmit_spi(cmd);						/* Command */
   \                     ??send_cmd_0:
   \   00000012   201C               MOV         R0,R4
   \   00000014   ........           BL          AT91_spi
    254          	xmit_spi((BYTE)(arg >> 24));		/* Argument[31..24] */
   \   00000018   280E               LSR         R0,R5,#+24
   \   0000001A   ........           BL          AT91_spi
    255          	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
    256          	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
    257          	xmit_spi((BYTE)arg);				/* Argument[7..0] */
   \   00000032   2806               LSL         R0,R5,#+24
   \   00000034   000E               LSR         R0,R0,#+24
   \   00000036   ........           BL          AT91_spi
    258          	xmit_spi(0x95);						/* CRC (valid for only CMD0) */
   \   0000003A   9520               MOV         R0,#+149
   \   0000003C   ........           BL          AT91_spi
    259          
    260          	/* Receive command response */

⌨️ 快捷键说明

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