[FL-1688] Incorrect SD read/write block address #649
Co-authored-by: あく <alleteam@gmail.com>
This commit is contained in:
		
							parent
							
								
									a024e470b7
								
							
						
					
					
						commit
						8d07e67dde
					
				| @ -393,13 +393,12 @@ uint8_t BSP_SD_GetCardInfo(SD_CardInfo* pCardInfo) { | |||||||
| uint8_t | uint8_t | ||||||
| BSP_SD_ReadBlocks(uint32_t* pData, uint32_t ReadAddr, uint32_t NumOfBlocks, uint32_t Timeout) { | BSP_SD_ReadBlocks(uint32_t* pData, uint32_t ReadAddr, uint32_t NumOfBlocks, uint32_t Timeout) { | ||||||
|     uint32_t offset = 0; |     uint32_t offset = 0; | ||||||
|  |     uint32_t addr; | ||||||
|     uint8_t retr = BSP_SD_ERROR; |     uint8_t retr = BSP_SD_ERROR; | ||||||
|  |     uint8_t* ptr = NULL; | ||||||
|     SD_CmdAnswer_typedef response; |     SD_CmdAnswer_typedef response; | ||||||
|     uint16_t BlockSize = 512; |     uint16_t BlockSize = 512; | ||||||
| 
 | 
 | ||||||
|     uint8_t* ptr = NULL; |  | ||||||
|     //  uint8_t ptr[512];
 |  | ||||||
| 
 |  | ||||||
|     /* Send CMD16 (SD_CMD_SET_BLOCKLEN) to set the size of the block and 
 |     /* Send CMD16 (SD_CMD_SET_BLOCKLEN) to set the size of the block and 
 | ||||||
|      Check if the SD acknowledged the set block length command: R1 response (0x00: no errors) */ |      Check if the SD acknowledged the set block length command: R1 response (0x00: no errors) */ | ||||||
|     response = SD_SendCmd(SD_CMD_SET_BLOCKLEN, BlockSize, 0xFF, SD_ANSWER_R1_EXPECTED); |     response = SD_SendCmd(SD_CMD_SET_BLOCKLEN, BlockSize, 0xFF, SD_ANSWER_R1_EXPECTED); | ||||||
| @ -415,15 +414,14 @@ BSP_SD_ReadBlocks(uint32_t* pData, uint32_t ReadAddr, uint32_t NumOfBlocks, uint | |||||||
|     } |     } | ||||||
|     memset(ptr, SD_DUMMY_BYTE, sizeof(uint8_t) * BlockSize); |     memset(ptr, SD_DUMMY_BYTE, sizeof(uint8_t) * BlockSize); | ||||||
| 
 | 
 | ||||||
|  |     /* Initialize the address */ | ||||||
|  |     addr = (ReadAddr * ((flag_SDHC == 1) ? 1 : BlockSize)); | ||||||
|  | 
 | ||||||
|     /* Data transfer */ |     /* Data transfer */ | ||||||
|     while(NumOfBlocks--) { |     while(NumOfBlocks--) { | ||||||
|         /* Send CMD17 (SD_CMD_READ_SINGLE_BLOCK) to read one block */ |         /* Send CMD17 (SD_CMD_READ_SINGLE_BLOCK) to read one block */ | ||||||
|         /* Check if the SD acknowledged the read block command: R1 response (0x00: no errors) */ |         /* Check if the SD acknowledged the read block command: R1 response (0x00: no errors) */ | ||||||
|         response = SD_SendCmd( |         response = SD_SendCmd(SD_CMD_READ_SINGLE_BLOCK, addr, 0xFF, SD_ANSWER_R1_EXPECTED); | ||||||
|             SD_CMD_READ_SINGLE_BLOCK, |  | ||||||
|             (ReadAddr + offset) * (flag_SDHC == 1 ? 1 : BlockSize), |  | ||||||
|             0xFF, |  | ||||||
|             SD_ANSWER_R1_EXPECTED); |  | ||||||
|         if(response.r1 != SD_R1_NO_ERROR) { |         if(response.r1 != SD_R1_NO_ERROR) { | ||||||
|             goto error; |             goto error; | ||||||
|         } |         } | ||||||
| @ -435,6 +433,8 @@ BSP_SD_ReadBlocks(uint32_t* pData, uint32_t ReadAddr, uint32_t NumOfBlocks, uint | |||||||
| 
 | 
 | ||||||
|             /* Set next read address*/ |             /* Set next read address*/ | ||||||
|             offset += BlockSize; |             offset += BlockSize; | ||||||
|  |             addr = ((flag_SDHC == 1) ? (addr + 1) : (addr + BlockSize)); | ||||||
|  | 
 | ||||||
|             /* get CRC bytes (not really needed by us, but required by SD) */ |             /* get CRC bytes (not really needed by us, but required by SD) */ | ||||||
|             SD_IO_WriteByte(SD_DUMMY_BYTE); |             SD_IO_WriteByte(SD_DUMMY_BYTE); | ||||||
|             SD_IO_WriteByte(SD_DUMMY_BYTE); |             SD_IO_WriteByte(SD_DUMMY_BYTE); | ||||||
| @ -471,6 +471,7 @@ error: | |||||||
| uint8_t | uint8_t | ||||||
| BSP_SD_WriteBlocks(uint32_t* pData, uint32_t WriteAddr, uint32_t NumOfBlocks, uint32_t Timeout) { | BSP_SD_WriteBlocks(uint32_t* pData, uint32_t WriteAddr, uint32_t NumOfBlocks, uint32_t Timeout) { | ||||||
|     uint32_t offset = 0; |     uint32_t offset = 0; | ||||||
|  |     uint32_t addr; | ||||||
|     uint8_t retr = BSP_SD_ERROR; |     uint8_t retr = BSP_SD_ERROR; | ||||||
|     uint8_t* ptr = NULL; |     uint8_t* ptr = NULL; | ||||||
|     SD_CmdAnswer_typedef response; |     SD_CmdAnswer_typedef response; | ||||||
| @ -490,15 +491,14 @@ BSP_SD_WriteBlocks(uint32_t* pData, uint32_t WriteAddr, uint32_t NumOfBlocks, ui | |||||||
|         goto error; |         goto error; | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
|  |     /* Initialize the address */ | ||||||
|  |     addr = (WriteAddr * ((flag_SDHC == 1) ? 1 : BlockSize)); | ||||||
|  | 
 | ||||||
|     /* Data transfer */ |     /* Data transfer */ | ||||||
|     while(NumOfBlocks--) { |     while(NumOfBlocks--) { | ||||||
|         /* Send CMD24 (SD_CMD_WRITE_SINGLE_BLOCK) to write blocks  and
 |         /* Send CMD24 (SD_CMD_WRITE_SINGLE_BLOCK) to write blocks  and
 | ||||||
|        Check if the SD acknowledged the write block command: R1 response (0x00: no errors) */ |        Check if the SD acknowledged the write block command: R1 response (0x00: no errors) */ | ||||||
|         response = SD_SendCmd( |         response = SD_SendCmd(SD_CMD_WRITE_SINGLE_BLOCK, addr, 0xFF, SD_ANSWER_R1_EXPECTED); | ||||||
|             SD_CMD_WRITE_SINGLE_BLOCK, |  | ||||||
|             (WriteAddr + offset) * (flag_SDHC == 1 ? 1 : BlockSize), |  | ||||||
|             0xFF, |  | ||||||
|             SD_ANSWER_R1_EXPECTED); |  | ||||||
|         if(response.r1 != SD_R1_NO_ERROR) { |         if(response.r1 != SD_R1_NO_ERROR) { | ||||||
|             goto error; |             goto error; | ||||||
|         } |         } | ||||||
| @ -515,6 +515,7 @@ BSP_SD_WriteBlocks(uint32_t* pData, uint32_t WriteAddr, uint32_t NumOfBlocks, ui | |||||||
| 
 | 
 | ||||||
|         /* Set next write address */ |         /* Set next write address */ | ||||||
|         offset += BlockSize; |         offset += BlockSize; | ||||||
|  |         addr = ((flag_SDHC == 1) ? (addr + 1) : (addr + BlockSize)); | ||||||
|          |          | ||||||
|         /* Put CRC bytes (not really needed by us, but required by SD) */ |         /* Put CRC bytes (not really needed by us, but required by SD) */ | ||||||
|         SD_IO_WriteByte(SD_DUMMY_BYTE); |         SD_IO_WriteByte(SD_DUMMY_BYTE); | ||||||
|  | |||||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user
	 SG
						SG