Цитата(Evgenius_Alex @ Jan 23 2013, 15:41)

Добрый день!
При работе с SD картой столкнулся с проблемой чтения блока.
Читаю сектора вот так:
CODE
// Прочитать содержимое буфера в переменную Sector из MMC карты
// N-номер сектора
//-----------------------------------------------------------------------------
void SDReadSector(unsigned long int N)
{
char rsp,rsp1;
short int crc;
SPCR = 0x50; //0x50 fclk/4; 0x51 fclk/16; 0x52 fclk/64
SPSR = 0x00; //
//for(i=0; i<512; i++) Sector[i]=0xEE;
if(!BlockAdressMode) Adr = N*512; //Адрес начала сектора, побайтная адресация
else Adr=N; //Блочная адресация
rsp = MMC_cmd(CMD17, (unsigned int)(Adr>>16),(unsigned int)(Adr&0x0000ffff), 0xFF); //CMD17 Read a block from specify addr
if(rsp){ SD_init(); //Если rsp!=0x00 будим карту снова
rsp = MMC_cmd(CMD17, (unsigned int)(Adr>>16),(unsigned int)(Adr&0x0000ffff), 0xFF); }
if(!rsp) rsp1 = MMC_read(512); //Заполним массив Sector[]
if(!rsp1){ StringPrepare("Block read Err."); Scroll(); ScrollUpdate(); }
PORTB |= MMC_CE_PIN; //MMC-disable
//StringPrepare("CMD17 "); HexToStr(rsp, 7); Scroll();
crc = MMC_crc16(&Sector[0], 512);
if(crc1!=(unsigned char)(crc >> 8) || crc2!=(unsigned char)(crc & 0xff) ){
StringPrepare("CRC Err ");
HexToStr(crc1, 5); HexToStr(crc2, 8); Scroll();
ScrollUpdate(); }
}
PS: Код писал около года назад, помню, что многие проблемы решились после того, как добавил расчет CRC
по спецификации CRC является обязательной только для команд иницилизации, потом может быть отключена.
Сообщение отредактировал IgorKossak - Jan 23 2013, 19:54
Причина редактирования: [codebox] для длинного кода, [code] - для короткого!!!