Linker 6 13 февраля, 2020 Опубликовано 13 февраля, 2020 · Жалоба 2 hours ago, Integro said: Если запись идет блоком 512 байт то SD карта вычитает страницу из NAND(4к или больше, зависит от NAND) модифицирует страницу и запишет обратно, по-этому эффективнее работать с блоками равными(или больше но кратными) странице NAND. Логично. А карта выдает как-то размер страницы NAND? Может команда есть какая? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
mantech 34 13 февраля, 2020 Опубликовано 13 февраля, 2020 · Жалоба 7 часов назад, Linker сказал: Или это общее время записи? Да. 4 часа назад, Linker сказал: А карта выдает как-то размер страницы NAND? Может команда есть какая? На сколько помню - нет. Проще писать 4К блоками, может и больше можно, но тут надо проверять, от объема карты прямая зависимость... Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Integro 0 13 февраля, 2020 Опубликовано 13 февраля, 2020 · Жалоба 5 hours ago, Linker said: Может команда есть какая? Такой команды нет, просто используют write multiply команду с большим буфером. Как показывает практика такой подход эффективнее. Еще можно получить небольшой выигрыш за счет увеличения размера транзакции с 512 байт до 2к например. В регистре CSD есть параметр WRITE_BL_EN из него можно брать максимальный размер блока, но карты с блоками по 2К это редкость, по крайней мере пара штук из пары десятков попадались. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Linker 6 19 февраля, 2020 Опубликовано 19 февраля, 2020 · Жалоба Судя по всему при write multiply флэшкин MCUcard накапливает блок для записи по-секторно в своей оперативке (буфере), а потом выставляет на MISO Busy и начинает записывать содержимое буфера в NAND. Как узнать размер этого буфера? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
GenaSPB 11 19 февраля, 2020 Опубликовано 19 февраля, 2020 · Жалоба static DRESULT SD_Get_Block_Size ( BYTE drv, /* Physical drive nmuber (0..) */ DWORD *buff /* Data buffer to store read data */ ) { enum { KB = 1024, MB = KB * KB }; static const unsigned long aus [16] = { 0, 16 * KB, // 1h 16 KB 32 * KB, 64 * KB, 128 * KB, 256 * KB, 512 * KB, 1 * MB, 2 * MB, 4 * MB, 8 * MB, 12 * MB, 16 * MB, 24 * MB, 32 * MB, 64 * MB, }; static RAMNOINIT_D1 ALIGNX_BEGIN uint8_t sdhost_sdcard_SDSTATUS [64] ALIGNX_END; if (sdhost_read_registers_acmd(SD_CMD_SD_APP_STATUS, sdhost_sdcard_SDSTATUS, 64, 6, sizeof sdhost_sdcard_SDSTATUS) == 0) // ACMD13 { const unsigned au = array_get_bits(sdhost_sdcard_SDSTATUS, 512, 431, 4); // [431:428] AU_SIZE const unsigned es = array_get_bits(sdhost_sdcard_SDSTATUS, 512, 423, 16); // [423:408] ERASE_SIZE PRINTF(PSTR("ioctl: GET_BLOCK_SIZE: AU_SIZE=0x%02x, ERASE_SIZE=0x%04x\n"), au, es); * buff = aus [au] * es; return RES_OK; } return RES_ERROR; } #define SD_CMD_SD_APP_STATUS ((uint8_t)13) /*!< For SD Card only */ // Функция получения значения бита по номеру из массива static unsigned long array_get_bit(const uint8_t * data, unsigned total, unsigned leftbit) { const unsigned bitfromstart = (total - 1) - leftbit; const unsigned byteindex = bitfromstart / 8; const unsigned bitindex = 7 - bitfromstart % 8; return (data [byteindex] >> bitindex) & 0x01; } // Функция получения значения битового поля из массива static unsigned long array_get_bits(const uint8_t * data, unsigned total, unsigned leftbit, unsigned width) { unsigned long v = 0; while (width --) v = v * 2 + array_get_bit(data, total, leftbit --); return v; } Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Linker 6 20 февраля, 2020 Опубликовано 20 февраля, 2020 · Жалоба 12 hours ago, GenaSPB said: ACMD13 Если я правильно понял, то в статусе здесь показывается размер Allocation Unit. Разве это и есть размер буфера? Т.е. для карты 8 Гб буфер составляет 4 Мб. Хорошо, если так. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
GenaSPB 11 20 февраля, 2020 Опубликовано 20 февраля, 2020 (изменено) · Жалоба Не знаю откуда Вы взяли зависимость "для карты 8 Гб буфер составляет 4 Мб". Значения возвращены в информационном блоке в 64 байта, полученном от карты. Там много интересного еще. В документе на требования к картам все есть. Изменено 20 февраля, 2020 пользователем GenaSPB Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Linker 6 20 февраля, 2020 Опубликовано 20 февраля, 2020 · Жалоба 32 minutes ago, GenaSPB said: Не знаю откуда Вы взяли зависимость "для карты 8 Гб буфер составляет 4 Мб". Из спецификации: Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
GenaSPB 11 20 февраля, 2020 Опубликовано 20 февраля, 2020 · Жалоба Написано что не больше. Может быть меньше. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться