Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Осваиваю MMC SPI mode
Форум разработчиков электроники ELECTRONIX.ru > Интерфейсы > Форумы по интерфейсам
AndreyVN
Всем привет!
Народ, кто с MMC в SPI режиме работал? Хочу уточнить следующий момент.
Я отправляю в карточку команду, которая состоит из 6 байт. Если верить спецификации, то ответ (R1) генериться карточкой после первого байта команды (в котором сидит код команды, CMD0, CMD1...).
Код который я использую, естественно, из Интернета:

Цитата
char MMC_cmd(char befF, unsigned int AdrH, unsigned int AdrL, char befH)
{

MMC_spi(0xff);
MMC_spi(befF);
MMC_spi( (unsigned char) (AdrH>>8) );
MMC_spi( (unsigned char) (AdrH & 0xff) );
MMC_spi( (unsigned char) (AdrL>>8) );
MMC_spi( (unsigned char) (AdrL & 0xff) );
MMC_spi(befH);
MMC_spi(0xff);
return MMC_spi(0xff);
}


Не могу понять, зачем перед первым и после последнего байтов шлются FF, и почему ответ читается после всей посылки, да еще и 2 раза по FF после команды.

Хотя, отмечу, код работоспособный.
aaarrr
Цитата
Если верить спецификации, то ответ (R1) генериться карточкой после первого байта команды

Почитайте спецификацию со стр. 107 и ниже wink.gif
AndreyVN
Цитата
Почитайте спецификацию со стр. 107 и ниже wink.gif


Да, перечитал более внимательно, действительно до и после команды, следует подавать FF, как я догадываюсь это надо чтобы не прекращалось тактирование SPI интерфейса.

Но теперь возник вопрос по таблице 43 (Timing Values).

Все интервалы (Ncs, Ncr..), даны в некоторых интервалах, например от 1...8 байт. То есть, MMC может ответить после одного байта FF, а может зависнуть до 8 байт FF. А в исходном коде в нее кинули 2 байта FF и считываем ответ.

Получается, следует слать до 8 байт высокого уровеня (FF) и анализировать готовность приемного буфера SPI интерфейса.

Правильно я понимаю спецификацию MMC или нет ???
aaarrr
Правильно понимаете - нужно передавать 0xFF, и анализировать 7-й бит у принимаемых данных: в ответе он станет равен '0'.
AndreyVN
Цитата(aaarrr @ Nov 16 2006, 09:49) *
Правильно понимаете - нужно передавать 0xFF, и анализировать 7-й бит у принимаемых данных: в ответе он станет равен '0'.

Понял, спасибо.
AndreyVN
Вот и еще вопросик возник.

Что-то не найду в спецификации подробного описания адресации массива данных.
Вроде адресация линейная. Читается из карты только сектор целиком, значит адресоваться должен тоже сектор. Но размер сектора я ведь могу изменить, (кажется размер сектора сидит в CSD регистре) тогда, то тот-же адрес будет ссылаться на другой байт (начало сектора).
Возникает какая-то неоднозначность. Где я ошибся?

И еще, если мне надо изменить 1 байт в MMC карте (например в таблице размещения файлов), получается нужно считать сектор, внести изменения и записать сектор. Других путей нет?
aaarrr
Цитата(AndreyVN @ Nov 23 2006, 13:45) *
Но размер сектора я ведь могу изменить, (кажется размер сектора сидит в CSD регистре) тогда, то тот-же адрес будет ссылаться на другой байт (начало сектора).
Возникает какая-то неоднозначность. Где я ошибся?

В регистре CSD это поле только для чтения. Размер блока можно установить командой CMD16, но значение, отличное от 512, как правило, вызывает ошибку при попытке записи. Кроме того, CMD16 не является обязательной для реализации.

Цитата(AndreyVN @ Nov 23 2006, 13:45) *
И еще, если мне надо изменить 1 байт в MMC карте (например в таблице размещения файлов), получается нужно считать сектор, внести изменения и записать сектор. Других путей нет?

Увы, нет.
hserg
Народ, дайте, pls, ссылочку на MultiMediaCard system specification version 4.X
на мыло hserg@beholder.ru да и примеры какие желательно для PICа
umup
вот
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.