Работа с MMC (или SD?)

Печатные платы, программируемая логика, разработка и изготовление аппаратуры

Moderator: Shaos

User avatar
FreemaN
Senior
Posts: 124
Joined: 09 Jan 2009 20:30
Location: Мурманск

Post by FreemaN »

Недавно разобрался с флешкой miniSD kingston 1GB.
Может кому поможет.
Если всё в порядке функция возвращает значение 0x00
Карты нет - значение 0xFF
Карта не инициализировалась (например если это SDHC) - значение 0xFD
код для АТмеги128

Code: Select all

unsigned char SD_init (void)
	{
	ClearError;
	unsigned int i=0;
	unsigned char b=0;
	SPI_low();	//Низкая скорость на шине (250кГц)
	init:
	SD_UNCS;
	while (i<74)	//Что-то вроде синхронизации - нужно при высоком уровне на CS 
		{
		write_SPI(0xFF);	//Послать 74 раз 0xFF
		i++;
		};
	SD_CS;
	i=0;
	write_SPI(0xFF);
	write_SPI(0xFF);
	write_SPI(0xFF);
	write_SPI(0xFF);
	write_SPI(0xFF);
	write_SPI(0xFF);
	write_SPI(0xFF);
	write_SPI(0xFF);
	write_SPI(0xFF);
	write_SPI(0xFF);
	write_SPI(0x40);	//далее шлём команду сброса - CMD0
	write_SPI(0x00);
	write_SPI(0x00);
	write_SPI(0x00);
	write_SPI(0x00);
	b=write_SPI(0x95);
	while (b==0xFF)	//Пока карта не ответит
		{
		b=write_SPI(0xFF);
		if (i==1000) {SD_UNCS; return 0xFF;};	//Или не кончатся попытки - это значит что карты нету
		i++;
		};
	SD_err=b;
	if (b!=0x01) {goto init;};	//Карта не ответила верно
	SD_UNCS;
	_delay_ms(1);
	SD_CS;
	_delay_ms(500);
	_delay_ms(500);
	_delay_ms(500);
	write_SPI(0xFF);
	b=0xFF;
	while (b!=0x00)	//Пока карта не ответит
		{
		write_SPI(0xFF);	//без этого не пашет...
		write_SPI(0x41);	//Команда инициализации стандартная, для ММС
		write_SPI(0x00);
		write_SPI(0x00);
		write_SPI(0x00);
		write_SPI(0x00);
		b=write_SPI(0x01);
		while (b==0xFF) b=write_SPI(0xFF);//Вот тут может возникнуть вечный цикл, что нехорошо
		};
	SD_err=b;
	if (b!=0x00) {write_SPI(0xFF); SD_UNCS; return 0xFD;};	//SD Карта не инициализировалась
	//Далее настраиваем скорость на шине
	SPI_high();	//4МГц
	SD_UNCS;	//Готово!!
	ClearError;
	return 0x00;
	}
CS карточки подключен к PINE4

Code: Select all

#define SD_CS PORTE|=0x20; _delay_us(1); PORTE&=(~0x10) //выбор SD карточки
#define SD_UNCS PORTE|=0x10 //для инициализации нужно чтоб была лог.1
Ксожалению ММС или ещё какой другой флешки у меня нет, так бы проверил работоспособность с ними.
---исправил небольшой баг
Last edited by FreemaN on 23 Jan 2009 20:07, edited 1 time in total.
Всё что ты видишь - лживый облик.
User avatar
FreemaN
Senior
Posts: 124
Joined: 09 Jan 2009 20:30
Location: Мурманск

Post by FreemaN »

З.Ы. Силно не бить, я знаю что часть кода немножко спёр :oops:
а именно это:
while (b==0xFF) b=write_SPI(0xFF);
Просто выражение понравилось :wink:
HardwareMan wrote:
jdigreze wrote: Если инициализация обмена сделана "по протоколу", никаких глюков быть не должно.
Полностью согласен. Покурите это - сильно помогает!
http://elm-chan.org/docs/mmc/mmc_e.html
Это очень полезная ссылка. Там рассказано даже про команды SDHC карт(те что ёмкостью от 4 до 32гигов...).
Всё что ты видишь - лживый облик.
User avatar
FreemaN
Senior
Posts: 124
Joined: 09 Jan 2009 20:30
Location: Мурманск

Post by FreemaN »

И может кто знает, где можно добыть коды производителей карт (Manufacturer ID (MID)) 127...120 Биты регистра CID.
Это написано в доке от SanDisk:
The manufacturer IDs are controlled and assigned by the SD Card Association.
Но их сайт ужасен и я так ничё полезного там не нашёл :cry:
Хуже только сайт MMCA :) Потому что там вообще ничё нет
Всё что ты видишь - лживый облик.
User avatar
FreemaN
Senior
Posts: 124
Joined: 09 Jan 2009 20:30
Location: Мурманск

Post by FreemaN »

Собственно, после разбирательства с картой пошли разбирательства с файловой системой...
Прочёл нулевой сектор, посчитал размер, вычислил расположение таблиц FAT и корневого каталога. :roll: И вдруг возник вопрос: А всё ли так как надо? вот прилагаю небольшой дампик http://ifolder.ru/10303260
Первые 513байт (значений 0х55 0хАА) - нулевой сектор диска
вторые 513байт (тоже до значений 0х55 0хАА) - Загрузочный сектор
третьи 512байт - самое начало корневого каталога.
Меня немного смутило расположение длинных имён файлов - начинаются с середины. а так вроде похоже на правду...
Подскажите пожалста, так ли оно?
Всё что ты видишь - лживый облик.
User avatar
HardWareMan
Banned
Posts: 2139
Joined: 20 Mar 2005 13:41
Location: От туда

Post by HardWareMan »

У тебя косяк. Сектор ровно 512 байт. Если выкинуть 1 байт в самом начале и один байт посередние среди 00 во втором секторе, то все просто идеально. Разъясняю:
1. Флешки форматируются как жесткие диски, поэтому 0 сектор это MBR. Только вот программы загрузчика там нет, одна таблица разделов (что и видно). Сигнатура 55АА должна быть в последних 2х байтах сектора (510 и 511, если считать от 0).
2. Второй сектор - стандартный boot сектор. Опять же, без самого загрузчика - только параметры FS.
3. Если сделать коррекцию, то директория выглядит нормально.
4. Что касается LFN, курите доки. Я вижу здесь, что они нормальные.

Короче, я читаю уже SD/MMC (только правда средствами М68К на Сеге) и у меня все пучком. Загрузчики при желании можно положить, для этого просто форматируем карты под DOSом в USB картридере с включенной эмуляцией в BIOSе системы. (или тупо винхексом туда положить). Еще бывает форматирование карты без MBR. Это скорее исключение, т.к. сама винда все флешки форматирует с MBR записью. Но иногда я напарывался (видимокакие-то автономные девайсы делали так). В этом случае флешка как дискета, начинается с MBR. Добавить поддержку несложно, но можно тупо залупиться и выдать "Форматируйте нах". %)
User avatar
FreemaN
Senior
Posts: 124
Joined: 09 Jan 2009 20:30
Location: Мурманск

Post by FreemaN »

насчёт косяка, эт я знаю но ничё поделать не могу :cry:
именно с этой флешкой некоторые сектора получаются по 513байт... попробовал другую, на два гига - прекрасно работает и 512байт возвращает.
А насчёт загрузчика - интересно... можно заставить мегу грузиться с флешки. занятно получится :)

случай с отсутствием MBR я тоже предусмотрел:

Code: Select all

	ReadBuffp=SD_read(0x00000000);
	i=0;
	while (i<10)
		{
		if(ReadBuffp[i]!=0x00) {goto PBRread;}
		i++;
		};
если первые десять байт попадётся не ноль то это PBR.
пасиба за ответ, значит буду копать дальше, думать как сделать что-то вроде файл-менеджера...
Всё что ты видишь - лживый облик.
User avatar
Shaos
Admin
Posts: 24014
Joined: 08 Jan 2003 23:22
Location: Silicon Valley

Post by Shaos »

HardWareMan wrote: Короче, я читаю уже SD/MMC (только правда средствами М68К на Сеге) и у меня все пучком.
чем кодишь на м68к? я уже который год мечтаю компик замутить на нём ;)
Я тут за главного - если что шлите мыло на me собака shaos точка net
User avatar
HardWareMan
Banned
Posts: 2139
Joined: 20 Mar 2005 13:41
Location: От туда

Post by HardWareMan »

Shaos wrote:
HardWareMan wrote: Короче, я читаю уже SD/MMC (только правда средствами М68К на Сеге) и у меня все пучком.
чем кодишь на м68к? я уже который год мечтаю компик замутить на нём ;)
Искал долго нормальный ASM для М68К. Остановился на IDE:
Image
У одник глюки, чторые требуют какой-то свой синтаксис - не осилил. До этого IDE Юзал какой-то заточенный под Сегу ASM, но он глючный страшно. А в этом IDE есть симулятор (он мне не нужен в принципе). И единственный его глюк - это неправильная компиляция команды MOVEM (делаю через DB ручками). Ну и отсуствие инклуды для бинарника. Т.е. бинарник приходиться переводить в текстик с DBшками и инклюдить. Эээх...
User avatar
Shaos
Admin
Posts: 24014
Joined: 08 Jan 2003 23:22
Location: Silicon Valley

Post by Shaos »

HardWareMan wrote:
Shaos wrote:
HardWareMan wrote: Короче, я читаю уже SD/MMC (только правда средствами М68К на Сеге) и у меня все пучком.
чем кодишь на м68к? я уже который год мечтаю компик замутить на нём ;)
Искал долго нормальный ASM для М68К. Остановился на IDE:
Image
У одник глюки, чторые требуют какой-то свой синтаксис - не осилил. До этого IDE Юзал какой-то заточенный под Сегу ASM, но он глючный страшно. А в этом IDE есть симулятор (он мне не нужен в принципе). И единственный его глюк - это неправильная компиляция команды MOVEM (делаю через DB ручками). Ну и отсуствие инклуды для бинарника. Т.е. бинарник приходиться переводить в текстик с DBшками и инклюдить. Эээх...
А исходные коды своих наработок не публикуешь, мистер Gates? ;)
Может кому пригодятся :roll:
Я тут за главного - если что шлите мыло на me собака shaos точка net
User avatar
HardWareMan
Banned
Posts: 2139
Joined: 20 Mar 2005 13:41
Location: От туда

Post by HardWareMan »

Shaos wrote:А исходные коды своих наработок не публикуешь, мистер Gates? ;)
Может кому пригодятся :roll:
Хыхы. Они еще далеки до завершения. К тому же подтормаживают нехило... Закончу все - выложу вместе с проектом.
User avatar
Shaos
Admin
Posts: 24014
Joined: 08 Jan 2003 23:22
Location: Silicon Valley

Post by Shaos »

HardWareMan wrote:
Shaos wrote:А исходные коды своих наработок не публикуешь, мистер Gates? ;)
Может кому пригодятся :roll:
Хыхы. Они еще далеки до завершения. К тому же подтормаживают нехило... Закончу все - выложу вместе с проектом.
Договорились. Ещё я знаю, что на ассемблере m68k можно кодить по разному - типа какие регистры для чего обычно использовать и т д. Интересно было бы услышать от тех кто до сих пор кодит о подобных предпочтениях. Можно топик отдельный создать на эту тему...
Я тут за главного - если что шлите мыло на me собака shaos точка net
User avatar
FreemaN
Senior
Posts: 124
Joined: 09 Jan 2009 20:30
Location: Мурманск

Post by FreemaN »

Пока что получилось сделать так:
Image
думаю скоро сделаю меню навигации... :kruto:
"ЛЕНИНГРАД" - метка диска :rotate:
а вот это так сказать макетка:
Image
Всё что ты видишь - лживый облик.
User avatar
FreemaN
Senior
Posts: 124
Joined: 09 Jan 2009 20:30
Location: Мурманск

Post by FreemaN »

Удалось прочитать файл и отправить его в VS1002D :o :D
Причём судя по всему ещё и ресурсы остаются... для решения простеньких задач
Потребляет 40-60мА (mp3, 320kbps, 44100, громкость средняя) - многовато, но пока оптимизацией по питанию не занимался
Всё что ты видишь - лживый облик.
User avatar
Shaos
Admin
Posts: 24014
Joined: 08 Jan 2003 23:22
Location: Silicon Valley

Re:

Post by Shaos »

HardWareMan wrote:
jdigreze wrote:Если инициализация обмена сделана "по протоколу", никаких глюков быть не должно.
Полностью согласен. Покурите это - сильно помогает!
http://elm-chan.org/docs/mmc/mmc_e.html
А между тем этот ресурс всё ещё доступен и похоже регулярно обновляется :)
Я тут за главного - если что шлите мыло на me собака shaos точка net