nedoPC.org

Electronics hobbyists community established in 2002
Atom Feed | View unanswered posts | View active topics It is currently 16 Apr 2024 04:06



Reply to topic  [ 59 posts ]  Go to page Previous  1, 2, 3, 4  Next
Работа с MMC (или SD?) 
Author Message
Banned

Joined: 12 Oct 2006 16:44
Posts: 608
Reply with quote
Post 
Different wrote:
А картинка за нумером 6 - это что такое? Для чего? Бескорпусный слот?

а фиг его знает... у меня небыло того, что можно было туда воткнуть.

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

Короче говоря, с этими мультимедиа- карточками тоже не всё так просто... Или чё-то не догоняю? :oops:


11 Dec 2007 02:03
Profile
God

Joined: 02 Jan 2006 02:28
Posts: 1390
Location: Abakan
Reply with quote
Post 
Если инициализация обмена сделана "по протоколу", никаких глюков быть не должно.


16 Dec 2007 20:06
Profile
Banned
User avatar

Joined: 20 Mar 2005 13:41
Posts: 2141
Location: От туда
Reply with quote
Post 
jdigreze wrote:
Если инициализация обмена сделана "по протоколу", никаких глюков быть не должно.

Полностью согласен. Покурите это - сильно помогает!
http://elm-chan.org/docs/mmc/mmc_e.html


16 Dec 2007 23:23
Profile
Banned

Joined: 12 Oct 2006 16:44
Posts: 608
Reply with quote
Post 
HardwareMan, спасибо за линк :)
Буду искать ошибку в своём коде
Найду - отпишусь


17 Dec 2007 00:37
Profile
God

Joined: 02 Jan 2006 02:28
Posts: 1390
Location: Abakan
Reply with quote
Post 
давай я пояснение напишу к своему коду ;)
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 раза не едем" ;) Похоже что у тебя также


17 Dec 2007 02:26
Profile
Banned
User avatar

Joined: 20 Mar 2005 13:41
Posts: 2141
Location: От туда
Reply with quote
Post 
jdigreze wrote:
далее ОБЯЗАТЕЛЬНО отсылка в SD/MMC десять штук 0xFFх - spi_sync_byte
это делается (дай Бог памяти) для гарантированного ресета контроллера внутри флэшки

если ты читал датащит, то там ясно написано - после подачи питания дайте карте 100 тактовых импульсов (остальные линии в лог.'1'). Это нужно для инита контроллера памяти.


17 Dec 2007 04:47
Profile
Banned

Joined: 12 Oct 2006 16:44
Posts: 608
Reply with quote
Post 
jdigreze wrote:
Пока я не проставил 10 синков при невыбранной флешки, у меня инициализация шла как "то едем, то 3 раза не едем" ;) Похоже что у тебя также

у меня они стоЯт. позже свою батву опубликую


17 Dec 2007 19:54
Profile
God

Joined: 02 Jan 2006 02:28
Posts: 1390
Location: Abakan
Reply with quote
Post 
HardWareMan wrote:
jdigreze wrote:
далее ОБЯЗАТЕЛЬНО отсылка в SD/MMC десять штук 0xFFх - spi_sync_byte
это делается (дай Бог памяти) для гарантированного ресета контроллера внутри флэшки

если ты читал датащит, то там ясно написано - после подачи питания дайте карте 100 тактовых импульсов (остальные линии в лог.'1'). Это нужно для инита контроллера памяти.
Видимо у меня был другой даташит. ;) Не с потолка же я это взял?


17 Dec 2007 22:13
Profile
Banned

Joined: 12 Oct 2006 16:44
Posts: 608
Reply with quote
Post 
Вот моя батва:
Code:
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);
}


18 Dec 2007 21:13
Profile
Banned

Joined: 12 Oct 2006 16:44
Posts: 608
Reply with quote
Post 
Чуть не забыл:
Code:
#define SectorSize=512
unsigned char Buffer[SectorSize];


18 Dec 2007 21:15
Profile
God

Joined: 02 Jan 2006 02:28
Posts: 1390
Location: Abakan
Reply with quote
Post 
Почему:
Code:
MMCCS(0);
 for(i=0;i<10;i++) OutMMC(0xFF);
(MMCCS(0))??? Или "0" выставляется на контакте "1"?


19 Dec 2007 02:21
Profile
Banned

Joined: 12 Oct 2006 16:44
Posts: 608
Reply with quote
Post 
jdigreze wrote:
Почему:
Code:
MMCCS(0);
 for(i=0;i<10;i++) OutMMC(0xFF);
(MMCCS(0))??? Или "0" выставляется на контакте "1"?

MMCCS(0) - означает 0В напряжения на ножке.
Это взято из спецификации на MMC+ (инициализация)
Shaos убил линки, дома поищу -точно скажу


19 Dec 2007 18:41
Profile
God

Joined: 02 Jan 2006 02:28
Posts: 1390
Location: Abakan
Reply with quote
Post 
Или я туплю, или одно из двух. Romanich, может заметил отличия моего кода и своего? Мой точно работает. Попробуй в начале инициализации FF-ки слать при /SC=high... Так, ради эксперимента...


19 Dec 2007 20:40
Profile
Banned

Joined: 12 Oct 2006 16:44
Posts: 608
Reply with quote
Post 
jdigreze, я понимаю о чём вы говорите, я хочу докопаться до истины - почему в разных даташитах по-разному?.
Ваши рекомендации, конечно попробую!
Даже не сомневаюсь, что вы правы!


19 Dec 2007 21:04
Profile
God

Joined: 02 Jan 2006 02:28
Posts: 1390
Location: Abakan
Reply with quote
Post 
Romanich, да я в общем то без наездов ;)
Фиг его знает, почему в разных даташитах по-разному... Может банальная опечатка?


19 Dec 2007 21:47
Profile
Display posts from previous:  Sort by  
Reply to topic   [ 59 posts ]  Go to page Previous  1, 2, 3, 4  Next

Who is online

Users browsing this forum: No registered users and 9 guests


You cannot post new topics in this forum
You cannot reply to topics in this forum
You cannot edit your posts in this forum
You cannot delete your posts in this forum
You cannot post attachments in this forum

Search for:
Jump to:  
Powered by phpBB® Forum Software © phpBB Group
Designed by ST Software.