Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: запуск карты в SD mode
Форум разработчиков электроники ELECTRONIX.ru > Сайт и форум > В помощь начинающему > ARM, 32bit
Freeuser
реализовываю связку SD card+at91sam7x, с SPI режимом разобрался, теперь нужно чтобы это дело работало в SD mode с 4-х битной шиной данных. Почитал спецификацию для карт, принцип работы примерно понял. Но тут возник вопрос: допустим я подконнектил ногу контроллера PA16 к пину CMD карточки. Как мне сконфигурировать PA16, чтобы передавать команды карте? Ну то что этот вывод нужно сделать выходом, это понятно.
P.S. Если у кого есть фрагмент кода работы с картой в SD-режиме, пожалуйста поделитесь, буду очень признателен.
aaarrr
Лучше запустите карту в SPI режиме на частоте 25MHz. SD через PIO однозначно будет медленнее.
Или возьмите контроллер с нативной поддержкой SD.
zltigo
Цитата(aaarrr @ Dec 3 2009, 17:33) *
Лучше...

Вы вопроса не поняли все хуже sad.gif
"вопрос: допустим я подконнектил ногу контроллера PA16 к пину CMD карточки. Как мне сконфигурировать PA16, чтобы передавать команды карте? Ну то что этот вывод нужно сделать выходом..."

Ну а уж то, что софтовое махание пинами безнадежно уступает SPI на хорошей скорости, это действительно так...
Freeuser
Сейчас быстродействие не является важным, самое главное запустить карту не с помощью SPI, а с использованием SD-протокола. Я благодарен за ценные замечания и советы. Использовать другой контроллер не получится, поэтому придется работать с уже имеющимся. А можно услышать что нибудь конкретно по сабжу?
aaarrr
Цитата(Freeuser @ Dec 4 2009, 10:13) *
А можно услышать что нибудь конкретно по сабжу?

Могу только посоветовать начать с однобитного SD. Но если возникают вопросы, как послать команду... то лучше начать с программного SPI, чтобы их больше не было.
Freeuser
Цитата
...то лучше начать с программного SPI...

С программной реализацией SPI познакомился, вы оказались правы, много вопросов отпало.

З.Ы.: Многие форумчане заводили карту в SD режиме. Может быть кто-нибудь поделится исходниками для ознакомления?
KAlex
Цитата(Freeuser @ Dec 4 2009, 15:07) *
З.Ы.: Многие форумчане заводили карту в SD режиме. Может быть кто-нибудь поделится исходниками для ознакомления?

Ну чтож, поделюсь.
CODE
send_comstr( CMD_0, 0, 6); // R1
ocr_rca = HC = 0;
send_comstr( CMD_8, 0x1AA, 17); // R1
if (comstr->com == 8) HC = 1;

do {
wait_ms(1);
send_comstr(CMD_55, 0, 6); // R1
wait_ms(1);
send_comstr(ACMD_41, ocr_rca, 6);
ocr_rca = (comstr->arg3)|(comstr->arg2<<8)|(comstr->arg1<<16)|(comstr->arg0<<24);
ocr_rca |= (1 << 30);
} while (!(comstr->arg0 & 0x80));

send_comstr(CMD_2, 0, 17);
send_comstr(CMD_3, 0, 6);
ocr_rca = (comstr->arg0<<24)|(comstr->arg1<<16);
send_comstr(CMD_9, ocr_rca, 17); // SEND_CSD

if (!(comstr->arg0 & 0x40)) HC = 0;
if (HC) {
flash_code = comstr->l[4] | (comstr->l[3] << 8);
memory_capacity = ((flash_code + 1) << 10);
}
else {
flash_code = ((comstr->l[1] & 0x03) << 10) | ((comstr->l[2] & 0xFF) << 2) | ((comstr->l[3] & 0xC0) >> 6);
code = ((comstr->l[4] & 0x03) << 1) | (comstr->l[5] >> 7);
memory_capacity = ( ((flash_code + 1) * (1 << (code + 2))) << (comstr->l[0] & 0x0F) );
}

send_comstr(CMD_7, ocr_rca, 6); // SELECT/DESELECT_CARD
send_comstr(CMD_16, 0x200, 6); // SET_BLOCKLEN
send_comstr(CMD_55, ocr_rca, 6); // R1
send_comstr(ACMD_6, 0x02, 6); // SET_BUS_WIDTH 4
.
.
.
.
void send_comstr(char command, int argum, char resp) {
comstr->com = command;
comstr->arg0 = (argum>>24);
comstr->arg1 = (argum>>16);
comstr->arg2 = (argum>>8);
comstr->arg3 = argum;
comstr->crc7 = crc7_OK ((unsigned char *)comstr);

send_comm_to_sd();
get_response(resp);
}

void get_response(char count){
unsigned char *ptr = (unsigned char *)comstr;
unsigned char c=0;
wait_res:
PORT0_SET = SD_CLC;
if (!(PORT0_INPUT & SD_CMD)) goto resp_now;
PORT0_CLR = SD_CLC;
if (++c) goto wait_res;
return;

resp_now:
for (c=0; c <= count; c++) *ptr++ = sd_getc();
}
Freeuser
А можно взглянуть на функцию send_comm_to_sd();
KAlex
Цитата(Freeuser @ Dec 10 2009, 14:43) *
А можно взглянуть на функцию send_comm_to_sd();

Реализовано на АСМе для скорости.
Входной параметр - указатель на comstr.

CODE
PUSH {R4-R7,LR}

LDR R5, PORT0_OUT ;; 0xfffff410
MOV R6,#+128
LSL R7,R6,#+6 ;; #+8192 SD_CLC
LSL R6,R6,#+1 ;; #+256 SD_CMD

STR R6,[R5, #+0] ;; PORT0_OUT = SD_CMD

MOV R2,#+6
SD_write_0:
LDRB R3,[R0, #+0]
LSL R3,R3,#+23
MOV R1,#+8
SD_write_2:
STR R6,[R5, #+36] ;; PORT_CLR = SD_CMD
LSL R3,R3,#+1
BPL SD_write_4
STR R6,[R5, #+32] ;; PORT_SET = SD_CMD
SD_write_4:
STR R7,[R5, #+32] ;; PORT_CLR = SD_CLC
SUB R1,#+1
STR R7,[R5, #+36] ;; PORT_SET = SD_CLC
BNE SD_write_2
SD_write_3:
ADD R0,#+1 ;; ptr++
SUB R2,#+1
BNE SD_write_0
SD_write_1:
POP {R4-R7}
POP {R0}
BX R0 ;; return
Freeuser
Спасибо большое, ваш код очень помог, карта заговорила. Теперь будем ускорять процесс общения.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.