Я пытаюсь прочитать блок данных с карты micro SD стандартной емкости, но полученные данные не имеют никакого смысла. Вот что я делаю:
Данные, которые я пытаюсь прочитать, — это загрузочный сектор FAT16, как показано ниже: И данные, которые я получаю, следующие:
В этот момент я даже не могу начать думать о том, что происходит не так. Я не думаю, что это ошибка передачи, потому что данные всегда одни и те же. Я также могу каждый раз читать подпись загрузочного сектора 0x55 0xAA, даже если я установил начальный адрес на 510 и прочитал два байта, они возвращаются отлично. Проблема в том, что я не могу прочитать другие байты.
Я также пробовал менять карты местами, и это тоже не помогло.
Что мне не хватает?
РЕДАКТИРОВАТЬ: рассматриваемая функция ниже.
bit sd_read_block(unsigned long size, unsigned long start_addr)
{
unsigned long i;
unsigned char r;
SD_CS = 0;
r = sd_card_cmd(16, size, 0);
sprintf(usb_uart_tx_buffer, "CMD16 R Token: %02x.\r\n", r);
usb_uart_tx(usb_uart_tx_buffer);
r = sd_card_cmd(17, start_addr, 0);
sprintf(usb_uart_tx_buffer, "CMD17 R Token: %02x.\r\n", r);
usb_uart_tx(usb_uart_tx_buffer);
// wait for start token
r = 0;
while (spi_rx_byte() != 0xfe) {
if (r++ > 25) {
SD_CS = 1;
return r;
}
}
for (i = 0; i < size; i++) {
if (i % 20 == 0) {
UART1_TX(0x0d);
UART1_TX(0x0a);
}
sprintf(usb_uart_tx_buffer, "%02x ", spi_rx_byte());
usb_uart_tx(usb_uart_tx_buffer);
}
// CRC
spi_rx_byte();
spi_rx_byte();
// extra clocks
r = spi_rx_byte();
SD_CS = 1;
return 0;
}
Получается, что я читал MBR, которая находится по адресу 0
на SD-карте. Чтобы найти расположение загрузочного сектора, нужно прочитать соответствующую запись в MBR. Записи начинаются с адреса 0x01be
и имеют размер 16 байт каждый. Точка интереса в записи находится по смещению 0x08
, имеет длину 4 байта и называется LBA. [Википедия] Чтобы получить адрес расположения загрузочного сектора, нужно умножить LBA на размер сектора (512 байт). [Форум Микрочипа]
Например:
В приведенном выше выводе четыре записи выглядят так:
00 02 10 00 06 2f ef af 8d 00 00 00 73 0f 3a 00
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
Как видите, используется только одна запись. LBA в этом случае имеет 8d 00 00 00
и находится в формате с прямым порядком байтов, поэтому в формате с прямым порядком байтов это будет 0x8d
или 141 в десятичном формате. Умножьте это на 512, и вы получите 72192 ( 0x11a00
). Это адрес сектора, где начинается FAT.
Петр Кула