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
Post a Comment