Телесистемы
 Разработка, производство и продажа радиоэлектронной аппаратуры
На главную   | Карта сайта | Пишите нам | В избранное
Требуется программист в Зеленограде
- обработка данных с датчиков; ColdFire; 40 тыс.
e-mail:jobsmp@pochta.ru

Телесистемы | Электроника | Конференция «Микроконтроллеры и их применение»

буквально только запустил исходники от Чана (+)

Отправлено sav_ua (80.78.42.183) 29 апреля 2010, г. 12:59
В ответ на: Вопрос по инициализации(+) отправлено S 29 апреля 2010, г. 12:21

карточка micro SD
Так вот, несмотря на то, что Чан утверждает (при автоопределении карты) что она должна выходить из идл режима командой ACMD41, в этом месте инициализация зависает. Две разных карты на 2Гб и 512Мб ведуд себя одинаково. Удалось вывести карты из Idl режима, обращаясь к ним, как к MMC (по чановскому примеру).
Вот исходный кусок кода инициализации от Чана

ty = 0;
if (send_cmd(CMD0, 0) == 1) { // Enter Idle state
if (send_cmd(CMD8, 0x1AA) == 1) { // SDv2
for (n = 0; n < 4; n++) ocr[n] = rcv_spi(); // Get trailing return value of R7 resp
if (ocr[2] == 0x01 && ocr[3] == 0xAA) { // The card can work at vdd range of 2.7-3.6V
for (tmr = 12000; tmr && send_cmd(ACMD41, 1UL << 30); tmr--) ; // Wait for leaving idle state (ACMD41 with HCS bit)
if (tmr && send_cmd(CMD58, 0) == 0) { // Check CCS bit in the OCR
for (n = 0; n < 4; n++) ocr[n] = rcv_spi();
ty = (ocr[0] & 0x40) ? CT_SD2 | CT_BLOCK : CT_SD2; // SDv2 (HC or SC)
}
}
} else { // SDv1 or MMCv3
if (send_cmd(ACMD41, 0) <= 1) {
ty = CT_SD1; cmd = ACMD41; // SDv1
} else {
ty = CT_MMC; cmd = CMD1; // MMCv3
}
for (tmr = 25000; tmr && send_cmd(cmd, 0); tmr--) ; // Wait for leaving idle state
if (!tmr || send_cmd(CMD16, 512) != 0) // Set R/W block length to 512
ty = 0;
}
}


Вот на что надо заменить этот кусок, чтобы работало

ty = 0;
Timer1 = 100; // Initialization timeout of 1000 msec
while(Timer1 && send_cmd(CMD0, 0) != 1);
if(Timer1 > 0){
Timer1 = 100; // Initialization timeout of 1000 msec
ty = CT_MMC; cmd = CMD1; // MMCv3
while (Timer1 && send_cmd(cmd, 0)); // Wait for leaving idle state

send_cmd(CMD59,0); // Disable CRC. Deafault - CRC disabled in SPI mode
if (!Timer1 || send_cmd(CMD16, 512) != 0) // Set R/W block length to 512
ty = 0;
}
else{
ty = 0;
}





Составить ответ | Вернуться на конференцию

Ответы


Отправка ответа
Имя*: 
Пароль: 
E-mail: 
Тема*:

Сообщение:

Ссылка на URL: 
URL изображения: 

если вы незарегистрированный на форуме пользователь, то
для успешного добавления сообщения заполните поле, как указано ниже:
введите число 47:

Перейти к списку ответов | Конференция | Раздел "Электроника" | Главная страница | Карта сайта

Rambler's Top100 Рейтинг@Mail.ru
 
Web telesys.ru