Fix for sdio_write_sectors
The issue was found by using f_mkdir("directory_name").
The function always returned FR_DISK_ERR due to an unhadled case in sdio_write_sectors().
According to this documentation: http://www.convict.lu/pdf/ProdManualSDCardv1.9.pdf#page=92 stop transmission command should be sent after writing multiple blocks.
This patch fixes this bug also adds a test case for it.
			
			
This commit is contained in:
		
							parent
							
								
									0fa4213577
								
							
						
					
					
						commit
						b43c3cee2d
					
				
					 2 changed files with 23 additions and 13 deletions
				
			
		|  | @ -12,6 +12,7 @@ | ||||||
| 
 | 
 | ||||||
| #define CS_GPIO_PIN 2 | #define CS_GPIO_PIN 2 | ||||||
| #define TEST_FILENAME "/test_loooong_filename.txt" | #define TEST_FILENAME "/test_loooong_filename.txt" | ||||||
|  | #define TEST_DIRECTORYNAME "my_directory" | ||||||
| #define TEST_CONTENTS "Hello! It's FatFs on esp8266 with ESP Open RTOS!" | #define TEST_CONTENTS "Hello! It's FatFs on esp8266 with ESP Open RTOS!" | ||||||
| #define READBUF_SIZE 256 | #define READBUF_SIZE 256 | ||||||
| #define DELAY_MS 3000 | #define DELAY_MS 3000 | ||||||
|  | @ -69,6 +70,19 @@ void check_fatfs() | ||||||
|     if (failed(f_chdrive(vol))) |     if (failed(f_chdrive(vol))) | ||||||
|         return; |         return; | ||||||
| 
 | 
 | ||||||
|  |     // Create a directory if it not exists
 | ||||||
|  |     FILINFO info; | ||||||
|  |     if (failed(f_stat(TEST_DIRECTORYNAME, &info)) && info.fattrib & AM_DIR) | ||||||
|  |     { | ||||||
|  |       printf("f_mkdir (\"%s\")\n", TEST_DIRECTORYNAME); | ||||||
|  |       if (failed(f_mkdir(TEST_DIRECTORYNAME))) | ||||||
|  |           return; | ||||||
|  |     } | ||||||
|  |     else | ||||||
|  |     { | ||||||
|  |       printf("\"%s\" directory already exists\n", TEST_DIRECTORYNAME); | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|     FIL f; |     FIL f; | ||||||
|     // Create test file
 |     // Create test file
 | ||||||
|     printf("f_open(&f, \"%s\", FA_WRITE | FA_CREATE_ALWAYS)", TEST_FILENAME); |     printf("f_open(&f, \"%s\", FA_WRITE | FA_CREATE_ALWAYS)", TEST_FILENAME); | ||||||
|  |  | ||||||
|  | @ -394,16 +394,10 @@ sdio_error_t sdio_write_sectors(sdio_card_t *card, uint32_t sector, uint8_t *src | ||||||
|     if (card->type != SDIO_TYPE_SDHC) |     if (card->type != SDIO_TYPE_SDHC) | ||||||
|         sector <<= 9; |         sector <<= 9; | ||||||
| 
 | 
 | ||||||
|     if (count == 1) |     bool multi = count != 1; | ||||||
|     { |  | ||||||
|         // single block
 |  | ||||||
|         if (command(card, CMD24, sector)) |  | ||||||
|             return set_error(card, SDIO_ERR_IO); |  | ||||||
|         return set_error(card, write_data_block(card, TOKEN_SINGLE_TRAN, src)); |  | ||||||
|     } |  | ||||||
| 
 | 
 | ||||||
|     // send pre-erase count
 |     // send pre-erase count
 | ||||||
|     if ((card->type == SDIO_TYPE_SD1 |     if (multi && (card->type == SDIO_TYPE_SD1 | ||||||
|         || card->type == SDIO_TYPE_SD2 |         || card->type == SDIO_TYPE_SD2 | ||||||
|         || card->type == SDIO_TYPE_SDHC) |         || card->type == SDIO_TYPE_SDHC) | ||||||
|         && app_command(card, ACMD23, count)) |         && app_command(card, ACMD23, count)) | ||||||
|  | @ -411,16 +405,19 @@ sdio_error_t sdio_write_sectors(sdio_card_t *card, uint32_t sector, uint8_t *src | ||||||
|         return set_error(card, SDIO_ERR_IO); |         return set_error(card, SDIO_ERR_IO); | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
|     if (command(card, CMD25, sector)) |     if (command(card, multi ? CMD25 : CMD24, sector)) | ||||||
|         return set_error(card, SDIO_ERR_IO); |         return set_error(card, SDIO_ERR_IO); | ||||||
| 
 | 
 | ||||||
|     while (count--) |     while (count--) | ||||||
|     { |     { | ||||||
|         if (write_data_block(card, TOKEN_MULTI_TRAN, src) != SDIO_ERR_NONE) |         if (write_data_block(card, multi ? TOKEN_MULTI_TRAN : TOKEN_SINGLE_TRAN, src) != SDIO_ERR_NONE){ | ||||||
|           return card->error; |           return card->error; | ||||||
|  |         } | ||||||
|         src += SDIO_BLOCK_SIZE; |         src += SDIO_BLOCK_SIZE; | ||||||
|     } |     } | ||||||
|     spi_transfer_8(BUS, TOKEN_STOP_TRAN); | 
 | ||||||
|  |     if (multi && command(card, CMD12, 0)) | ||||||
|  |         return set_error(card, SDIO_ERR_IO); | ||||||
| 
 | 
 | ||||||
|     return set_error(card, SDIO_ERR_NONE); |     return set_error(card, SDIO_ERR_NONE); | ||||||
| } | } | ||||||
|  | @ -449,4 +446,3 @@ sdio_error_t sdio_erase_sectors(sdio_card_t *card, uint32_t first, uint32_t last | ||||||
| 
 | 
 | ||||||
|     return set_error(card, wait() ? SDIO_ERR_NONE : SDIO_ERR_TIMEOUT); |     return set_error(card, wait() ? SDIO_ERR_NONE : SDIO_ERR_TIMEOUT); | ||||||
| } | } | ||||||
| 
 |  | ||||||
|  |  | ||||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue