From: geijoenr Date: Thu, 29 Jan 2015 20:13:09 +0000 (+0000) Subject: devsd: wait for response after CMD24 X-Git-Url: https://git.ndcode.org/public/gitweb.cgi?a=commitdiff_plain;h=6d87224b24a534944f7ce92c5e58340fffc7949e;p=FUZIX.git devsd: wait for response after CMD24 on CMD24 after the sending CRC you may get 0xFF before receiving DTR_ACCEPTED --- diff --git a/Kernel/dev/devsd.c b/Kernel/dev/devsd.c index 939e37a1..8a82b3a5 100644 --- a/Kernel/dev/devsd.c +++ b/Kernel/dev/devsd.c @@ -25,6 +25,7 @@ static void sd_spi_release(uint8_t drive); static bool sd_spi_wait_ready(uint8_t drive); static bool sd_spi_receive_prepare(uint8_t drive); static int sd_send_command(uint8_t drive, unsigned char cmd, uint32_t arg); +static uint8_t sd_spi_receive_byte_when_ready(uint8_t drive); static uint8_t devsd_transfer_sector(void) { @@ -49,7 +50,8 @@ static uint8_t devsd_transfer_sector(void) sd_spi_transmit_sector(drive); sd_spi_transmit_byte(drive, 0xFF); /* dummy CRC */ sd_spi_transmit_byte(drive, 0xFF); - reply = sd_spi_receive_byte(drive); + /* sd card may return 0xFF while writing */ + reply = sd_spi_receive_byte_when_ready(drive); success = ((reply & 0x1f) == 0x05); } } @@ -74,25 +76,42 @@ static void sd_spi_release(uint8_t drive) sd_spi_receive_byte(drive); } +static uint8_t sd_spi_receive_byte_when_ready(uint8_t drive) +{ + uint8_t res; + timer_t timer; + + res = sd_spi_receive_byte(drive); + if (res != 0xFF) + return res; + + timer = set_timer_ms(500); + while(res == 0xFF){ + res = sd_spi_receive_byte(drive); + if(timer_expired(timer)){ + kputs("sd: timeout\n"); + } + } + return res; +} + static bool sd_spi_wait_ready(uint8_t drive) { uint8_t res; timer_t timer; timer = set_timer_ms(500); - sd_spi_receive_byte(drive); + res = sd_spi_receive_byte(drive); - while(true){ + while(res != 0xFF){ res = sd_spi_receive_byte(drive); - if(res == 0xFF) - return true; if(timer_expired(timer)){ kputs("sd: timeout\n"); - break; + return false; } } - return false; + return true; } static bool sd_spi_receive_prepare(uint8_t drive)