doom13 0 18 августа, 2014 Опубликовано 18 августа, 2014 · Жалоба Парочку вопросов задавал тут, ответа не получил. Проблема осталась, решил создать свою тему. Есть микросхема 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"??? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
doom13 0 18 августа, 2014 Опубликовано 18 августа, 2014 · Жалоба Нашёл решение проблемы, после GO_IDLE_STATE (CMD0) надо несколько раз посылать SEND_OP_CMD (CMD1) и ждать пока в ответе R3 в OCR флаг BUSY установится в 1. Данный бит как-то непонятно работает, после перехода в состояние IDLE надо несколько раз послать SEND_OP_CMD (CMD1) (на второй раз даёт нормальный ответ с BUSY равным 1), чтобы получить ответ, что память готова. От времени, которое прошло после подачи питания он никак не зависит. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
doom13 0 21 августа, 2014 Опубликовано 21 августа, 2014 · Жалоба На рисунках показаны осциллограммы для шины данных eMMC (зелёный - DAT0, жёлтый - DAT3, фиолетовый - DAT7): 1) Bus mode - x1. 2) Bus mode - x4. 3) Bus mode - x8. Во всех случаях записывается 512 байт, почему время записи для x4 и x8 получилось одинаковым? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
doom13 0 22 августа, 2014 Опубликовано 22 августа, 2014 · Жалоба Нашёл, что одинаковое время записи для x4 и х8 обусловлено работой MMC контроллера. DMA пока не использую, поэтому на время заполнения фифо данными на шине отсутствует тактирование (поправте, если что-то неправильно понимаю). На осциллограммах: жёлтый - CLK, зелёный - DAT0, голубой - DAT3, фиолетовый - DAT7. 1) Режим x4 2) Режим х8 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
doom13 0 22 августа, 2014 Опубликовано 22 августа, 2014 · Жалоба Может быть кто подскажет, какую частоту CLK (для SDR) потянет память??? Характеристики памяти ниже, нужно пояснение, что означают параметры в таблице? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
sergeystm32 0 8 августа, 2018 Опубликовано 8 августа, 2018 · Жалоба Подскажите как задать контроллеру 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); Отправляю команду вот так, правильно ли это? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
doom13 0 8 августа, 2018 Опубликовано 8 августа, 2018 · Жалоба Как-то так было: 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()) ; } Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
sergeystm32 0 9 августа, 2018 Опубликовано 9 августа, 2018 · Жалоба 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 осциллографом но ничего нет( в чем может быть ошибка? чего не хватает? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Viktuar 0 27 сентября, 2018 Опубликовано 27 сентября, 2018 · Жалоба 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: Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться