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

MMC (eMMC)

Парочку вопросов задавал тут, ответа не получил.

Проблема осталась, решил создать свою тему.

 

Есть микросхема N2M400FDB (eMMC флэш память 4 GB) совместимая с JEDEC/MMC standard v4.41.

Возникли вопросы по инициализации (идентификации eMMC) памяти.

Всё делаю согласно документации.

1) Устанавливаю тактовую частоту 400 кГц.

2) Далее отправляю команду GO_IDLE_STATE (CMD0). Память должна перейти в режим ожидания.

3) Отправляю SEND_OP_CMD (CMD1). В ответ должны получить R3.

 

В ответ на SEND_OP_CMD (CMD1) в регистре ответа вижу значение 0x00FF 8080. В даташите есть строки:

the e•MMC devices shall respond with a fixed pattern of either 0x00FF 8080 (capacity less than or equal to 2GB) or 0x40FF 8080 (capacity greater than 2GB) if device is busy, and they shall not move into Inactive state.

Т.е. полученный ответ не соответствует объёму используемой флэш-памяти, почему???

Судя по ответу девайс находится в состоянии "бизи", что можно сделать, чтоб вывести его из этого состояния??? Как работать с памятью дальше при таком "epic fail"???

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


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

Нашёл решение проблемы, после GO_IDLE_STATE (CMD0) надо несколько раз посылать SEND_OP_CMD (CMD1) и ждать пока в ответе R3 в OCR флаг BUSY установится в 1.

Данный бит как-то непонятно работает, после перехода в состояние IDLE надо несколько раз послать SEND_OP_CMD (CMD1) (на второй раз даёт нормальный ответ с BUSY равным 1), чтобы получить ответ, что память готова. От времени, которое прошло после подачи питания он никак не зависит.

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


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

На рисунках показаны осциллограммы для шины данных eMMC (зелёный - DAT0, жёлтый - DAT3, фиолетовый - DAT7):

1) Bus mode - x1.

2) Bus mode - x4.

3) Bus mode - x8.

Во всех случаях записывается 512 байт, почему время записи для x4 и x8 получилось одинаковым?

post-63539-1408624301_thumb.png

post-63539-1408624307_thumb.png

post-63539-1408624311_thumb.png

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


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

Нашёл, что одинаковое время записи для x4 и х8 обусловлено работой MMC контроллера. DMA пока не использую, поэтому на время заполнения фифо данными на шине отсутствует тактирование (поправте, если что-то неправильно понимаю). На осциллограммах: жёлтый - CLK, зелёный - DAT0, голубой - DAT3, фиолетовый - DAT7.

1) Режим x4

2) Режим х8

post-63539-1408692843_thumb.png

post-63539-1408692847_thumb.png

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


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

Может быть кто подскажет, какую частоту CLK (для SDR) потянет память???

Характеристики памяти ниже, нужно пояснение, что означают параметры в таблице?

post-63539-1408697075_thumb.jpg

post-63539-1408697082_thumb.jpg

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


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

Подскажите как задать контроллеру eMMC переход на 4bit BUS или 8 bit BUS

 

SDIO_CmdInitStructure.Argument = 0x03B70100;

SDIO_CmdInitStructure.CmdIndex = SDMMC_CMD_HS_SWITCH;

SDIO_CmdInitStructure.Response = SDMMC_RESPONSE_SHORT;

SDIO_CmdInitStructure.WaitForInterrupt = SDMMC_WAIT_NO;

SDIO_CmdInitStructure.CPSM = SDMMC_CPSM_ENABLE;

 

SDMMC_SendCommand(SDMMC1, &SDIO_CmdInitStructure);

 

Отправляю команду вот так, правильно ли это?

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


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

Как-то так было:

void EmmcMem::SetBusWidth(unsigned int width)
{
CardStatus status;
unsigned long arg;
MmcCmdReg cmdreg;

BusWidth(width);

switch(width)
{
	case BUS_WIDTH_1X:
		arg = 0x03B70000;
		break;
	case BUS_WIDTH_4X:
		arg = 0x03B70100;
		break;
	case BUS_WIDTH_8X:
		arg = 0x03B70200;
		break;
	default :
		break;
}

status.all = GetStatus();
while((status.bit.CURRENT_STATE) != TRAN)
{
	status.all = GetStatus();
}

cmdreg.all = 0;
cmdreg.bit.CMD = 6;
cmdreg.bit.RSPFMT = 1;
cmdreg.bit.BSYEXP = 1;

SendCmd(cmdreg, arg);

Resp_R1();

while(BusyDetected())
	;
}

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


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

CMD7 перехожу в Transfer State

CMD6 c arg=0x03B90100; для перехода на более высокую тактовую

CMD6 c arg=0x03B70100; для включения шины в 4bit

SD_Init4bit24mhz(); настраиваю sdio в stm32 на 4bit bus и 24МГц

CMD25 WRITE_MULT_BLOCK

и теперь смотрю на d0-d3 осциллографом но ничего нет(

 

в чем может быть ошибка? чего не хватает?

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


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

CMD7 перехожу в Transfer State

CMD6 c arg=0x03B90100; для перехода на более высокую тактовую

CMD6 c arg=0x03B70100; для включения шины в 4bit

SD_Init4bit24mhz(); настраиваю sdio в stm32 на 4bit bus и 24МГц

CMD25 WRITE_MULT_BLOCK

и теперь смотрю на d0-d3 осциллографом но ничего нет(

 

в чем может быть ошибка? чего не хватает?

Может не хватает самих данных :biggrin:

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


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

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

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

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

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

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

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

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

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

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