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

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

Moderator: Shaos

Romanich
Banned
Posts: 608
Joined: 12 Oct 2006 16:44

Post by Romanich »

Different wrote:А картинка за нумером 6 - это что такое? Для чего? Бескорпусный слот?
а фиг его знает... у меня небыло того, что можно было туда воткнуть.

Кстати, в ходе доительных испытаний, выяснилось, что моя MMC+ может иногда не инициализироваться с первого раза. А стандартная MMC (та что на 16МБ) работает безотказно всегда. На electronix.ru fk0 высказал мысль, что некоторые MMC от Kingston (как раз моя MMC+) работают в режиме SPI с другой полярностью/фазой...

Короче говоря, с этими мультимедиа- карточками тоже не всё так просто... Или чё-то не догоняю? :oops:
jdigreze
God
Posts: 1388
Joined: 02 Jan 2006 02:28
Location: Abakan

Post by jdigreze »

Если инициализация обмена сделана "по протоколу", никаких глюков быть не должно.
User avatar
HardWareMan
Banned
Posts: 2139
Joined: 20 Mar 2005 13:41
Location: От туда

Post by HardWareMan »

jdigreze wrote:Если инициализация обмена сделана "по протоколу", никаких глюков быть не должно.
Полностью согласен. Покурите это - сильно помогает!
http://elm-chan.org/docs/mmc/mmc_e.html
Romanich
Banned
Posts: 608
Joined: 12 Oct 2006 16:44

Post by Romanich »

HardwareMan, спасибо за линк :)
Буду искать ошибку в своём коде
Найду - отпишусь
jdigreze
God
Posts: 1388
Joined: 02 Jan 2006 02:28
Location: Abakan

Post by jdigreze »

давай я пояснение напишу к своему коду ;)
spi_init:
setb _cs - выборка отключена
setb mosi - подтяжка к высокому
setb miso - аналогично
setb sck - аналогично
mov spcr, #01010001b - выставляем фазы по мануалу

далее ОБЯЗАТЕЛЬНО отсылка в SD/MMC десять штук 0xFFх - spi_sync_byte
это делается (дай Бог памяти) для гарантированного ресета контроллера внутри флэшки
call spi_sync_byte
call spi_sync_byte
call spi_sync_byte
call spi_sync_byte
call spi_sync_byte
call spi_sync_byte
call spi_sync_byte
call spi_sync_byte
call spi_sync_byte
call spi_sync_byte
; - обнуляем переменные параметров
clr a
mov param1, a
mov param2, a
mov param3, a
mov param4, a
call spi_send_command - отсылается CMD0 с нулевыми параметрами (сам байт команды <>0, см. процедурку spi_send_command)

call spi_read_response - ждем отклика
cjne a, #001h, _no_response - если не пришло сразу 0x01, значит карточки нет

_wait_for_init:
mov a, #CMD1 - отсылаем CMD1
call spi_send_command

call spi_read_response - ждем отклика, т.е. пока CMD1 не даст в результате выполнения 0x00
jnz _wait_for_init

setb cy - показываем, что инициализировались нормально
ret - возвращаемся в родительский код
_no_response:
mov last_error, #err_sd_init
clr cy - ошибка инициализации
ret

Так вот. Пока я не проставил 10 синков при невыбранной флешки, у меня инициализация шла как "то едем, то 3 раза не едем" ;) Похоже что у тебя также
User avatar
HardWareMan
Banned
Posts: 2139
Joined: 20 Mar 2005 13:41
Location: От туда

Post by HardWareMan »

jdigreze wrote:далее ОБЯЗАТЕЛЬНО отсылка в SD/MMC десять штук 0xFFх - spi_sync_byte
это делается (дай Бог памяти) для гарантированного ресета контроллера внутри флэшки
если ты читал датащит, то там ясно написано - после подачи питания дайте карте 100 тактовых импульсов (остальные линии в лог.'1'). Это нужно для инита контроллера памяти.
Romanich
Banned
Posts: 608
Joined: 12 Oct 2006 16:44

Post by Romanich »

jdigreze wrote:Пока я не проставил 10 синков при невыбранной флешки, у меня инициализация шла как "то едем, то 3 раза не едем" ;) Похоже что у тебя также
у меня они стоЯт. позже свою батву опубликую
jdigreze
God
Posts: 1388
Joined: 02 Jan 2006 02:28
Location: Abakan

Post by jdigreze »

HardWareMan wrote:
jdigreze wrote:далее ОБЯЗАТЕЛЬНО отсылка в SD/MMC десять штук 0xFFх - spi_sync_byte
это делается (дай Бог памяти) для гарантированного ресета контроллера внутри флэшки
если ты читал датащит, то там ясно написано - после подачи питания дайте карте 100 тактовых импульсов (остальные линии в лог.'1'). Это нужно для инита контроллера памяти.
Видимо у меня был другой даташит. ;) Не с потолка же я это взял?
Romanich
Banned
Posts: 608
Joined: 12 Oct 2006 16:44

Post by Romanich »

Вот моя батва:

Code: Select all

void MMCCS(unsigned long int mmccs)
{
 PIOA_ODSR=(PIOA_ODSR&(~(1<<4)))|(mmccs<<4);
 Delay(100);
}

unsigned char OutMMC(unsigned char mmc)
{
 SPI_TDR=(1<<16)|mmc;
 while(!(SPI_SR&2));
 while(!(SPI_SR&1));
 return SPI_RDR;
}

void PrepareMMC(void)
{
 unsigned char i,b;
 SPI_CSR1=1|(125<<8); //100MHz/2/125=400kHz
 MMCCS(0);
 for(i=0;i<10;i++) OutMMC(0xFF);
 MMCCS(1);
 for(i=0;i<2;i++) OutMMC(0xFF);
 //CMD0
 MMCCS(0);
 CMD0:
 OutMMC(0x40);
 OutMMC(0);
 OutMMC(0);
 OutMMC(0);
 OutMMC(0);
 b=OutMMC(0x95);
 while(b==0xFF) b=OutMMC(0xFF);
 while(OutMMC(0xFF)!=0xFF);
 if(b!=0x01) goto CMD0;
 MMCCS(1);
 //CMD1
 MMCCS(0);
 CMD1:
 OutMMC(0x41);
 OutMMC(0);
 OutMMC(0);
 OutMMC(0);
 OutMMC(0);
 b=OutMMC(0xFF);
 while(b==0xFF) b=OutMMC(0xFF);
 while(OutMMC(0xFF)!=0xFF);
 if(b!=0x00) goto CMD1;
 MMCCS(1);
 SPI_CSR1=1|(3<<8); //100MHz/2/3=16.7 MHz
}

void InSector(unsigned long int Sector)
{
 unsigned char b;
 unsigned short int i;
 Sector<<=9;
 MMCCS(0);
 OutMMC(0x51);
 OutMMC(Sector>>24);
 OutMMC(Sector>>16);
 OutMMC(Sector>> 8);
 OutMMC(Sector    );
 b=OutMMC(0xFF);
 while(b==0xFF) b=OutMMC(0xFF);
 while(b!=0xFF) b=OutMMC(0xFF);
 while(b!=0xFE) b=OutMMC(0xFF);
 for(i=0;i<SectorSize;i++) Buffer[i]=OutMMC(0xFF);
 while(OutMMC(0xFF)!=0xFF);
 MMCCS(1);
}

void OutSector(unsigned long int Sector)
{
 unsigned char b;
 unsigned short int i;
 Sector<<=9;
 MMCCS(0);
 OutMMC(0x58);
 OutMMC(Sector>>24);
 OutMMC(Sector>>16);
 OutMMC(Sector>> 8);
 OutMMC(Sector    );
 b=OutMMC(0xFF);
 while(b==0xFF) b=OutMMC(0xFF);
 while(b!=0xFF) b=OutMMC(0xFF);
 OutMMC(0xFE);
 for(i=0;i<SectorSize;i++) OutMMC(Buffer[i]);
 OutMMC(0xFF);
 OutMMC(0xFF);
 OutMMC(0xFF);
 while(OutMMC(0xFF)!=0xFF);
 MMCCS(1);
}
Romanich
Banned
Posts: 608
Joined: 12 Oct 2006 16:44

Post by Romanich »

Чуть не забыл:

Code: Select all

#define SectorSize=512
unsigned char Buffer[SectorSize];
jdigreze
God
Posts: 1388
Joined: 02 Jan 2006 02:28
Location: Abakan

Post by jdigreze »

Почему:

Code: Select all

MMCCS(0); 
 for(i=0;i<10;i++) OutMMC(0xFF);
(MMCCS(0))??? Или "0" выставляется на контакте "1"?
Romanich
Banned
Posts: 608
Joined: 12 Oct 2006 16:44

Post by Romanich »

jdigreze wrote:Почему:

Code: Select all

MMCCS(0); 
 for(i=0;i<10;i++) OutMMC(0xFF);
(MMCCS(0))??? Или "0" выставляется на контакте "1"?
MMCCS(0) - означает 0В напряжения на ножке.
Это взято из спецификации на MMC+ (инициализация)
Shaos убил линки, дома поищу -точно скажу
jdigreze
God
Posts: 1388
Joined: 02 Jan 2006 02:28
Location: Abakan

Post by jdigreze »

Или я туплю, или одно из двух. Romanich, может заметил отличия моего кода и своего? Мой точно работает. Попробуй в начале инициализации FF-ки слать при /SC=high... Так, ради эксперимента...
Romanich
Banned
Posts: 608
Joined: 12 Oct 2006 16:44

Post by Romanich »

jdigreze, я понимаю о чём вы говорите, я хочу докопаться до истины - почему в разных даташитах по-разному?.
Ваши рекомендации, конечно попробую!
Даже не сомневаюсь, что вы правы!
jdigreze
God
Posts: 1388
Joined: 02 Jan 2006 02:28
Location: Abakan

Post by jdigreze »

Romanich, да я в общем то без наездов ;)
Фиг его знает, почему в разных даташитах по-разному... Может банальная опечатка?