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

📄 sdcmd.lst

📁 针对at91sam7a3为主芯片开发板开发的spi口应用程序
💻 LST
📖 第 1 页 / 共 5 页
字号:
    285          /********************************************************************************************************************
    286          ** 函数名称: INT8U SD_WriteSingleBlock()			Name:	  INT8U SD_WriteSingleBlock()
    287          ** 功能描述: 写单块命令								Function: write single block command
    288          ** 输   入: INT32U blockaddr: block address		Input:	  INT32U blockaddr: block address
    289          ** 输   出: 0:   正确    >0:   错误码		  		Output:	  0:  right		>0:  error code
    290          *********************************************************************************************************************/

   \                                 In segment CODE, align 4, keep-with-next
    291          INT8U SD_WriteSingleBlock(INT32U blockaddr)
    292          {
   \                     SD_WriteSingleBlock:
   \   00000000   10B5               PUSH        {R4,LR}
   \   00000002   041C               MOV         R4,R0
    293          	return (SD_BlockCommand(CMD24, CMD24_R, blockaddr)); /* 写单块命令 command that write single block */
   \   00000004   221C               MOV         R2,R4
   \   00000006   0121               MOV         R1,#+0x1
   \   00000008   1820               MOV         R0,#+0x18
   \   0000000A   ........           BL          SD_BlockCommand
   \   0000000E   10BC               POP         {R4}
   \   00000010   02BC               POP         {R1}
   \   00000012   0847               BX          R1                 ;; return
    294          }
    295          
    296          /********************************************************************************************************************
    297          ** 函数名称: INT8U SD_WriteMultipleBlock()			Name:	  INT8U SD_WriteMultipleBlock()
    298          ** 功能描述: 写多块命令								Function: write multiple block command
    299          ** 输   入: INT32U blockaddr: 块地址				Input:	  INT32U blockaddr: block address
    300          ** 输   出: 0:   正确    >0:   错误码		  		Output:	  0:  right	>0:  error code
    301          *********************************************************************************************************************/

   \                                 In segment CODE, align 4, keep-with-next
    302          INT8U SD_WriteMultipleBlock(INT32U blockaddr)
    303          {
   \                     SD_WriteMultipleBlock:
   \   00000000   10B5               PUSH        {R4,LR}
   \   00000002   041C               MOV         R4,R0
    304          	return (SD_BlockCommand(CMD25, CMD25_R, blockaddr)); /* 写多块命令 command that write multiple block */
   \   00000004   221C               MOV         R2,R4
   \   00000006   0121               MOV         R1,#+0x1
   \   00000008   1920               MOV         R0,#+0x19
   \   0000000A   ........           BL          SD_BlockCommand
   \   0000000E   10BC               POP         {R4}
   \   00000010   02BC               POP         {R1}
   \   00000012   0847               BX          R1                 ;; return
    305          }
    306          
    307          /********************************************************************************************************************
    308          ** 函数名称: INT8U SD_ProgramCSD()						Name:	  INT8U SD_ProgramCSD()
    309          ** 功能描述: 写CSD寄存器								Function: write CSD register
    310          ** 输   入: INT8U *buff   		 : CSD寄存器内容		Input:	  INT8U *buff   	  : the content of CSD register	
    311          			 INT8U len	  		 : CSD寄存器长度			  	  INT8U len			  : the length of CSD register
    312          ** 输   出: 0:   正确    >0:   错误码		  			Output:	  0:  right		>0:  error code
    313          ********************************************************************************************************************/
    314          #if SD_ProgramCSD_EN
    315          INT8U SD_ProgramCSD(INT8U len, INT8U *buff)
    316          {
    317          	INT8U param[4] = {0,0,0,0},resp,ret;
    318          	
    319          	if (len != 16) return SD_ERR_USER_PARAM;
    320          
    321          	ret = SD_SendCmd(CMD27, param, CMD27_R, &resp); 	/* 发送写CSD寄存器命令 send command that write CSD */
    322          	if (ret != SD_NO_ERR)
    323          		return ret;
    324          		
    325              if (resp != 0)
    326                  return SD_ERR_CMD_RESP;
    327          		
    328          	buff[15] = (SD_GetCRC7(buff, 15) << 1) + 0x01;  	/* 计算CSD中的crc 位域 calculate crc field in CSD */
    329          		
    330          	return(SD_WriteBlockData(0, 16, buff));
    331          }
    332          
    333          /********************************************************************************************************************
    334          ** 函数名称: INT8U SD_GetCRC7()						Name:	  INT8U SD_GetCRC7()
    335          ** 功能描述: 计算CRC7								Function: calculate crc7
    336          ** 输   入: INT8U *pSource: 数据					Input:    INT8U *pSource: data
    337          			 INT16U len    : 数据长度						  INT16U len   : data length
    338          ** 输   出: CRC7码									Output:	  CRC7 code
    339          *********************************************************************************************************************/
    340          INT8U SD_GetCRC7(INT8U *pSource, INT16U len)
    341          {
    342          	INT8U i = 0, j;
    343          	INT8U reg = 0;
    344          	
    345          	do
    346          	{
    347          	    for (j = 0; j < 8; j++)
    348          	    {
    349          			reg <<= 1;
    350          			reg ^= ((((pSource[i] << j) ^ reg) & 0x80) ? 0x9 : 0);
    351          	    }
    352          	
    353          	    i++;
    354          	
    355          	}while(i < len);
    356          	
    357          	return reg;
    358          }	
    359          #endif	
    360          
    361          #if SD_EraseBlock_EN
    362          /********************************************************************************************************************
    363          ** 函数名称: INT8U SD_EraseStartBlock()				Name:	  INT8U SD_EraseStartBlock()
    364          ** 功能描述: 设置块擦除起始地址						Function: select the start block address of erasing operation
    365          ** 输   入: INT32U startblock: 块地址				Input: 	  INT32U startblock	: block address
    366          ** 输   出: 0:   正确    >0:   错误码		  		Output:	  0:  right	   >0:  error code
    367          *********************************************************************************************************************/
    368          INT8U SD_EraseStartBlock(INT32U startblock)
    369          {
    370          	if (sds.card_type == CARDTYPE_SD)
    371          		return (SD_BlockCommand(CMD32, CMD32_R, startblock));	/* 发送擦除起始块地址 send the start block address of erasing operation */
    372          	else
    373          		return (SD_BlockCommand(CMD35, CMD35_R, startblock));	/* 发送擦除起始块地址 send the start block address of erasing operation */
    374          }
    375          
    376          /********************************************************************************************************************
    377          ** 函数名称: INT8U SD_EraseEndBlock()				Name:	  INT8U SD_EraseEndBlock()
    378          ** 功能描述: 设置块擦除终止地址						Function: select the end block address of erasing operation
    379          ** 输   入: INT32U endblock: 块地址				Input:	  INT32U Length	: block address
    380          ** 输   出: 0:   正确    >0:   错误码		  		Output:	  0:  right	   >0:  error code
    381          *********************************************************************************************************************/
    382          INT8U SD_EraseEndBlock(INT32U endblock)
    383          {
    384          	if (sds.card_type == CARDTYPE_SD)
    385          		return (SD_BlockCommand(CMD33, CMD33_R, endblock));     /* 发送擦除终止块地址 send the end block address of erasing operation */
    386          	else
    387          		return (SD_BlockCommand(CMD36, CMD36_R, endblock));     /* 发送擦除终止块地址 send the end block address of erasing operation */
    388          }
    389          
    390          /********************************************************************************************************************
    391          ** 函数名称: INT8U SD_EraseSelectedBlock()			Name:	  INT8U SD_EraseSelectedBlock()
    392          ** 功能描述: 擦除已选中的块							Function: erase block selected
    393          ** 输   入: 无										Input:	  NULL
    394          ** 输   出: 0:   正确    >0:   错误码		  		Output:	  0:  right		>0:  error code
    395          *********************************************************************************************************************/
    396          INT8U SD_EraseSelectedBlock(void)
    397          {
    398          	INT8U param[4],resp,tmp;
    399          	
    400          	SD_PackParam(param, 0);
    401          	
    402          	tmp = SD_SendCmd(CMD38, param, CMD38_R, &resp);	 	    /* 擦除所选择的块  erase blocks selected */
    403          	if (tmp != SD_NO_ERR)
    404          		return tmp;							 	
    405          	
    406          	if (SD_WaitBusy(SD_WAIT_ERASE) != SD_NO_ERR)			/* 等待擦除完成 wait for finishing erasing */
    407          		return SD_ERR_TIMEOUT_ERASE;
    408          	else
    409          		return SD_NO_ERR;									
    410          }	
    411          #endif
    412          
    413          /*********************************************************************************************************************
    414          ** 函数名称: INT8U SD_ReadOCR()						Name:	  INT8U SD_ReadOCR()
    415          ** 功能描述: 读操作条件寄存器OCR					Function: read OCR register of card
    416          ** 输   入: INT8U ocrlen  : 寄存器长度(固定为4)	Input:	  INT8U ocrlen  : len of register (fixed,is 4)
    417          			 INT8U *recbuf : 接收缓冲区					      INT8U *recbuf : recbuffer	
    418          ** 输   出: 0:   正确    >0:   错误码		  		Output:	  0:  right		>0:  error code
    419          **********************************************************************************************************************/

   \                                 In segment CODE, align 4, keep-with-next
    420          INT8U SD_ReadOCR(INT8U ocrlen, INT8U *recbuf)
    421          {
   \                     SD_ReadOCR:
   \   00000000   70B5               PUSH        {R4-R6,LR}
   \   00000002   83B0               SUB         SP,#+0xC
   \   00000004   041C               MOV         R4,R0
   \   00000006   0D1C               MOV         R5,R1
    422              INT8U param[4] = {0,0,0,0},resp[5],tmp;
   \   00000008   6846               MOV         R0,SP
   \   0000000A   0021               MOV         R1,#+0
   \   0000000C   0160               STR         R1,[R0, #0]
    423          
    424              tmp = SD_SendCmd(CMD58, param, CMD58_R, resp);		/* 读 OCR 寄存器命令 */
   \   0000000E   01AB               ADD         R3,SP,#+0x4
   \   00000010   0422               MOV         R2,#+0x4
   \   00000012   6946               MOV         R1,SP
   \   00000014   3A20               MOV         R0,#+0x3A
   \   00000016   ........           BL          SD_SendCmd
   \   0000001A   061C               MOV         R6,R0
    425              if (tmp != SD_NO_ERR)								/* read OCR register command */
   \   0000001C   3606               LSL         R6,R6,#+0x18       ;; ZeroExt     R6,R6,#+0x18,#+0x18
   \   0000001E   360E               LSR         R6,R6,#+0x18
   \   00000020   002E               CMP         R6,#+0
   \   00000022   03D0               BEQ         ??SD_ReadOCR_0
    426              	return tmp;		 										
   \   00000024   301C               MOV         R0,R6
   \   00000026   0006               LSL         R0,R0,#+0x18       ;; ZeroExt     R0,R0,#+0x18,#+0x18
   \   00000028   000E               LSR         R0,R0,#+0x18
   \   0000002A   16E0               B           ??SD_ReadOCR_1
    427              												
    428              if (resp[0] != 0)
   \                     ??SD_ReadOCR_0:
   \   0000002C   6846               MOV         R0,SP
   \   0000002E   0079               LDRB        R0,[R0, #+0x4]
   \   00000030   0028               CMP         R0,#+0
   \   00000032   01D0               BEQ         ??SD_ReadOCR_2
    429                  return SD_ERR_CMD_RESP;			 				/* 响应错误 response is error */
   \   00000034   1220               MOV         R0,#+0x12
   \   00000036   10E0               B           ??SD_ReadOCR_1
    430          
    431              for (tmp = 0; tmp < 4; tmp++)
   \                     ??SD_ReadOCR_2:
   \   00000038   0020               MOV         R0,#+0
   \   0000003A   061C               MOV         R6,R0

⌨️ 快捷键说明

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