c - Write a block to SD with SPI, strange response from SD -


here code writing 512byte block sd card. code works fine, when check went (by reading response sd), read 0xff.

that values should (from sd reference manual):

‘010’—data accepted. ‘101’—data rejected due crc error.  ‘110’—data rejected due write error 

this code:

uint8_t sdcard_sendblock(uint32_t block, uint8_t * data)  {      switch (sd_write_blk_machine.fields.state) {  case write_start:      //enable card     gpioc_pdor &= ~gpio_pdor_pdo(gpio_pin(10));      sd_cmd_arg.sd_cmd_tot_argument = block << sd_block_shift;     sd_write_blk_machine.fields.state = write_send_cmd24;      /*inizializzo le variabili locali*/     write_send_data_counter = 0;     sd_cmd_machine.sd_cmd_machine = 0;     break;  case write_send_cmd24:     send_command_return = sdsendcmd(cmd24|0x40,aspected_ok_response);          if( send_command_return == sdcard_cmd_fails)         {             //disable card             gpioc_pdor |= gpio_pdor_pdo(gpio_pin(10));             sd_write_blk_machine.fields.complete = 1;             system_error.flags.sdcard_error = sdcard_write_fail;             return(sdcard_write_fail);               }         sd_write_blk_machine.fields.state = write_send_start_token;     }     break;  case write_send_start_token:     spi_writedata(spi0,sd_tok_write_sblock); //sd_tok_write_sblock = 0xfe ,           spi_control_machine.spi_control_machine = 0;         sd_write_blk_machine.fields.state = write_send_data;      break;  case write_send_data:      if (write_send_data_counter < sdcard_block_size) //sdcard_block_size = 512 byte             {                 spi_writedata(spi0, data[write_send_data_counter]);                 {                     spi_control_machine.spi_control_machine = 0;                     write_send_data_counter++;                 }             }             else                 sd_write_blk_machine.fields.state = write_send_idle_1;             break;  case write_send_idle_1:     spi_writedata(spi0,0xff); // 0xff = spi_idle            sd_write_blk_machine.fields.state = write_send_idle_2;       break;  case write_send_idle_2:     spi_writedata(spi0,0xff);   // 0xff = spi_idle           sd_write_blk_machine.fields.state = write_read_response_token;      break;  case write_read_response_token:     /*every data block written card acknowledged data response    token. 1 byte long     , has following format:     x x x 0 status 1     meaning of status bits defined follows:     010 - data accepted.     101 - data rejected due crc error.     110 - data rejected due write error*/          spi_control_machine.spi_control_machine = 0;     spi_readdata(spi0, &write_read_response);   // here problem !!!! write_read_response = 0xff                      if ( (write_read_response & 0x0f) != sd_accepted_write_data )                     {                         //disabilita carta                         gpioc_pdor |= gpio_pdor_pdo(gpio_pin(10));                         system_error.flags.sdcard_error = sdcard_write_fail;                         sd_write_blk_machine.fields.complete = 1;                         sendblockreturn=0;                         return (sdcard_write_fail);                      }                       sd_write_blk_machine.fields.complete = 1;                     status.flags.sdwrite_wait_attemp = 1;                     sendblockreturn=1;                     return (terminate_ok);                break;      } 

the issue in last case of switch.

it looks card returning 0xff until has completed write. according physical layer simplified specification in section 7.2.4:

as long card busy programming, continuous stream of busy tokens sent host (effectively holding dataout line low).

that said, i'm not sure why card isn't returning '010' accepted response first - case of card manufacturer not following spec.

what want repeatedly call spi_readdata until returned byte becomes 0 or '010' accepted.


Comments

Popular posts from this blog

basic authentication with http post params android -

vb.net - Virtual Keyboard commands -

c++ - End of file on pipe magic during open -