Перейти к содержанию
    

SDIO интерфейс SD-card: время записи блока

2 hours ago, Integro said:

Если запись идет блоком 512 байт то SD карта вычитает страницу из NAND(4к или больше, зависит от NAND) модифицирует страницу и запишет обратно, по-этому эффективнее работать с блоками равными(или больше но кратными) странице NAND.

Логично. А карта выдает как-то размер страницы NAND? Может команда есть какая? 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

7 часов назад, Linker сказал:

Или это общее время записи?

Да.

4 часа назад, Linker сказал:

А карта выдает как-то размер страницы NAND? Может команда есть какая? 

На сколько помню - нет. Проще писать 4К блоками, может и больше можно, но тут надо проверять, от объема карты прямая зависимость...

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

5 hours ago, Linker said:

Может команда есть какая? 

Такой команды нет, просто используют write multiply команду с большим буфером. Как показывает практика такой подход эффективнее.

Еще можно получить небольшой выигрыш за счет увеличения размера транзакции с 512 байт до 2к например.
В регистре CSD есть параметр WRITE_BL_EN из него можно брать максимальный размер блока, но карты с блоками по 2К это редкость, по крайней мере пара штук из пары десятков попадались.
image.thumb.png.d2e6b418db4b74c9e894a6a52f275d3a.png

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Судя по всему при write multiply флэшкин MCUcard накапливает блок для записи по-секторно в своей оперативке (буфере), а потом выставляет на MISO Busy и начинает записывать содержимое буфера в NAND. Как узнать размер этого буфера?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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;
}

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

12 hours ago, GenaSPB said:

ACMD13
 

Если я правильно понял, то в статусе здесь показывается размер Allocation Unit. Разве это и есть размер буфера? Т.е. для карты 8 Гб буфер составляет 4 Мб. Хорошо, если так.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Не знаю откуда Вы взяли зависимость "для карты 8 Гб буфер составляет 4 Мб".
Значения возвращены в информационном блоке в 64 байта, полученном от карты. Там много интересного еще. В документе на требования к картам все есть.

Изменено пользователем GenaSPB

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

32 minutes ago, GenaSPB said:

Не знаю откуда Вы взяли зависимость "для карты 8 Гб буфер составляет 4 Мб".

Из спецификации:
image.thumb.png.f04fd239a2b8f3c567daaec2e172d0d7.png

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...