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

📄 sddriver.lst

📁 针对at91sam7a3为主芯片开发板开发的spi口应用程序
💻 LST
📖 第 1 页 / 共 5 页
字号:
   \   00000032   03D1               BNE         ??SD_WriteBlock_3
    239          	{
    240          		SD_EndSD();
   \   00000034   ........           BL          SD_EndSD
    241          		return SD_ERR_WRITE_PROTECT;							/* 卡有写保护 */
   \   00000038   4220               MOV         R0,#+0x42
   \   0000003A   2CE0               B           ??SD_WriteBlock_1
    242          	}
    243          	
    244          	ret = SD_WriteSingleBlock(blockaddr);						/* 写单块命令 write single block */
   \                     ??SD_WriteBlock_3:
   \   0000003C   201C               MOV         R0,R4
   \   0000003E   ........           _BLF        SD_WriteSingleBlock,SD_WriteSingleBlock??rT
   \   00000042   061C               MOV         R6,R0
    245          	if (ret != SD_NO_ERR)
   \   00000044   002E               CMP         R6,#+0
   \   00000046   03D0               BEQ         ??SD_WriteBlock_4
    246          	{	
    247          		SD_EndSD();
   \   00000048   ........           BL          SD_EndSD
    248          		return ret;
   \   0000004C   301C               MOV         R0,R6
   \   0000004E   22E0               B           ??SD_WriteBlock_1
    249          	}
    250          	
    251          	ret = SD_WriteBlockData(0, SD_BLOCKSIZE, sendbuf);			/* 写入数据 write data */
   \                     ??SD_WriteBlock_4:
   \   00000050   2A1C               MOV         R2,R5
   \   00000052   8021               MOV         R1,#+0x80
   \   00000054   8900               LSL         R1,R1,#+0x2        ;; #+0x200
   \   00000056   0020               MOV         R0,#+0
   \   00000058   ........           _BLF        SD_WriteBlockData,SD_WriteBlockData??rT
   \   0000005C   061C               MOV         R6,R0
    252           	if (ret == SD_NO_ERR)										/* 读Card Status寄存器, 检查写入是否成功 */
   \   0000005E   002E               CMP         R6,#+0
   \   00000060   16D1               BNE         ??SD_WriteBlock_5
    253           	{															/* read Card Status register to check write wheather sucessfully */
    254           		ret = SD_ReadCard_Status(2, tmp);
   \   00000062   6946               MOV         R1,SP
   \   00000064   0220               MOV         R0,#+0x2
   \   00000066   ........           _BLF        SD_ReadCard_Status,SD_ReadCard_Status??rT
   \   0000006A   061C               MOV         R6,R0
    255           		if (ret != SD_NO_ERR)
   \   0000006C   002E               CMP         R6,#+0
   \   0000006E   03D0               BEQ         ??SD_WriteBlock_6
    256           		{
    257           			SD_EndSD();
   \   00000070   ........           BL          SD_EndSD
    258           			return ret;											/* 读寄存器失败 read register fail */
   \   00000074   301C               MOV         R0,R6
   \   00000076   0EE0               B           ??SD_WriteBlock_1
    259          		}
    260          
    261           		if((tmp[0] != 0) || (tmp[1] != 0))
   \                     ??SD_WriteBlock_6:
   \   00000078   6846               MOV         R0,SP
   \   0000007A   0078               LDRB        R0,[R0, #+0]
   \   0000007C   0028               CMP         R0,#+0
   \   0000007E   03D1               BNE         ??SD_WriteBlock_7
   \   00000080   6846               MOV         R0,SP
   \   00000082   4078               LDRB        R0,[R0, #+0x1]
   \   00000084   0028               CMP         R0,#+0
   \   00000086   03D0               BEQ         ??SD_WriteBlock_5
    262           		{
    263           			SD_EndSD();
   \                     ??SD_WriteBlock_7:
   \   00000088   ........           BL          SD_EndSD
    264          			ret = SD_ERR_WRITE_BLK; 			     			/* 响应指示写失败 response indicate write fail */
   \   0000008C   4020               MOV         R0,#+0x40
   \   0000008E   061C               MOV         R6,R0
    265           		}
    266           	}
    267          
    268              SD_EndSD();
   \                     ??SD_WriteBlock_5:
   \   00000090   ........           BL          SD_EndSD
    269           	return ret;													/* 返回写入结果 return the result of writing */									
   \   00000094   301C               MOV         R0,R6
   \                     ??SD_WriteBlock_1:
   \   00000096   01B0               ADD         SP,#+0x4
   \   00000098   70BC               POP         {R4-R6}
   \   0000009A   02BC               POP         {R1}
   \   0000009C   0847               BX          R1                 ;; return
    270          }
    271          
    272          /**********************************************************************************************************************
    273          ** 函数名称: INT8U SD_WriteMultiBlock()				Name:	  INT8U SD_WriteMultiBlock()
    274          ** 功能描述: 向SD/MMC卡中写入多个块					Function: write multi blocks to SD/MMC card
    275          ** 输   入: INT32U blockaddr: 块地址				Input:	  INT32U blockaddr: address of block
    276          			 INT32U blocknum : 块数量						  INT32U blocknum : the numbers of block
    277          			 INT8U *sendbuf  : 发送缓冲区每块512字节    	  INT8U *sendbuf  : the send buffer,each block length is 512Bytes
    278          ** 输    出: 0:   成功    >0:  错误码				Output:	  0:  right			>0:  error code
    279          ***********************************************************************************************************************/
    280          #if SD_WriteMultiBlock_EN
    281          INT8U SD_WriteMultiBlock(INT32U blockaddr, INT32U blocknum, INT8U *sendbuf)
    282          {
    283          	INT32U i;
    284          	INT8U ret,tmp[2];
    285          	
    286          	SD_StartSD();												/* 向OS申请访问卡信号量 request semaphore acessed SD/MMC to OS */
    287              if (SD_ChkCard() != 1)							
    288              {
    289              	SD_EndSD();	
    290              	return SD_ERR_NO_CARD;   								/* 卡没完全插入卡中 card is not inserted entirely */
    291          	}
    292          		
    293          	if ((blockaddr + blocknum) > sds.block_num)	
    294          	{
    295          		SD_EndSD();	
    296          		return SD_ERR_OVER_CARDRANGE;							/* 操作超出卡容量范围 operate over the card range */
    297          	}
    298          		
    299          	if (SD_ChkCardWP() == 1)
    300          	{
    301          		SD_EndSD();
    302          		return SD_ERR_WRITE_PROTECT;							/* 卡有写保护 */
    303          	}
    304          	
    305          	ret = SD_WriteMultipleBlock(blockaddr);						/* 写多块命令 write multiple blocks command */
    306          	if (ret != SD_NO_ERR)
    307          	{
    308          		SD_EndSD();
    309          		return ret;
    310          	}
    311          	
    312              for (i = 0; i < blocknum; i++)
    313              {															
    314           		ret = SD_WriteBlockData(1, SD_BLOCKSIZE, sendbuf);		/* 写入数据 write data */
    315           		if (ret == SD_NO_ERR)	
    316           			sendbuf = sendbuf + SD_BLOCKSIZE;
    317           		else
    318           		{														/* 写失败 write fail */
    319          			SD_StopTransmission();								/* 停止数据传输 stop data transmission */	
    320          			SD_WaitBusy(SD_WAIT_WRITE);							/* 等待 waiting */
    321          			SD_EndSD();
    322          			return ret;
    323          		}
    324          	}
    325          
    326              SD_StopMultiToken();										/* 发送数据停止令牌 send data stop token */
    327          
    328              ret = SD_WaitBusy(SD_WAIT_WRITE);							/* 等待写入的完成 wait for finishing writing */
    329              if (ret != SD_NO_ERR)
    330              {
    331              	SD_EndSD();
    332              	return SD_ERR_TIMEOUT_WRITE;
    333              }
    334          
    335              if (sds.card_type == CARDTYPE_SD)
    336              {
    337             		ret = SD_GetNumWRBlcoks(&i);							/* 读正确写入的块数 read the blocks that be written correctly */
    338             		if (ret != SD_NO_ERR)
    339             		{
    340             			SD_EndSD();
    341             		  	return ret;
    342             		}
    343             		if(i != blocknum)
    344          			ret =  SD_ERR_WRITE_BLKNUMS;						/* 正确写入块数错误 the blocks that be written correctly is error */
    345             	}
    346             	else
    347             	{
    348             	 	ret = SD_ReadCard_Status(2, tmp);
    349           		if (ret != SD_NO_ERR)
    350           		{
    351           			SD_EndSD();
    352           			return ret;											/* 读寄存器失败 read register fail */
    353          		}
    354           		if((tmp[0] != 0) || (tmp[1] != 0))
    355          			ret = SD_ERR_WRITE_BLK; 			     			/* 响应指示写失败 response indicate write fail */
    356             	}
    357             	 	
    358             	SD_EndSD();   	
    359          	return ret;													/* 返回写入成功 return write sucessfully */			
    360          }
    361          #endif
    362          
    363          /*********************************************************************************************************************
    364          ** 函数名称: INT8U SD_EraseBlock()					Name:	  INT8U SD_EraseBlock()
    365          ** 功能描述: 擦除SD/MMC卡中的块						Function: Erase the block of SD/MMC card
    366          ** 输   入: INT32U startaddr: 起始地址				Input:    INT32U startaddr: start address
    367          			 INT32U endaddr  : 终止地址						  INT32U endaddr  : end address
    368          ** 输    出: 0:   成功    >0:  错误码				Output:	  0:  right			>0:  error code
    369          ** 注    意: startaddr 和 blocknum 建议为 sds.erase_unit 的整数倍, 因为有的卡只能以 sds.erase_unit 为单位进行擦除
    370          *********************************************************************************************************************/
    371          #if SD_EraseBlock_EN
    372          INT8U SD_EraseBlock(INT32U startaddr, INT32U blocknum)
    373          {
    374          	INT32 tmp;
    375          	INT8U ret;
    376          	
    377          	SD_StartSD();												/* 向OS申请访问卡信号量 request semaphore acessed SD/MMC to OS */
    378              if (SD_ChkCard() != 1)							
    379              {
    380              	SD_EndSD();	
    381              	return SD_ERR_NO_CARD;   								/* 卡没完全插入卡中 card is not inserted entirely */
    382          	}
    383          	
    384          	if ((startaddr + blocknum) > sds.block_num)	
    385          	{
    386          		SD_EndSD();	
    387          		return SD_ERR_OVER_CARDRANGE;							/* 操作超出卡容量范围 operate over the card range */
    388          	}
    389          		
    390          	if (SD_ChkCardWP() == 1)
    391          	{
    392          		SD_EndSD();
    393          		return SD_ERR_WRITE_PROTECT;							/* 卡有写保护 */
    394          	}	
    395          
    396          	tmp = blocknum - sds.erase_unit;	
    397          	while(tmp >= 0)												/* 每次擦除扇区 once erase is sector size */
    398          	{	
    399          		ret = SD_EraseStartBlock(startaddr);					/* 选择起始块地址 select start address */
    400          		if (ret != SD_NO_ERR)
    401          		{
    402          			SD_EndSD();
    403          			return ret;

⌨️ 快捷键说明

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