📄 sddriver.lst
字号:
\ 00000030 0128 CMP R0,#+0x1
\ 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();
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -