реклама на сайте
подробности

 
 
 
Reply to this topicStart new topic
> запуск карты в SD mode, вопрос по конфигурации ног контроллера
Freeuser
сообщение Dec 3 2009, 14:21
Сообщение #1


Участник
*

Группа: Участник
Сообщений: 66
Регистрация: 18-11-09
Из: Мск
Пользователь №: 53 718



реализовываю связку SD card+at91sam7x, с SPI режимом разобрался, теперь нужно чтобы это дело работало в SD mode с 4-х битной шиной данных. Почитал спецификацию для карт, принцип работы примерно понял. Но тут возник вопрос: допустим я подконнектил ногу контроллера PA16 к пину CMD карточки. Как мне сконфигурировать PA16, чтобы передавать команды карте? Ну то что этот вывод нужно сделать выходом, это понятно.
P.S. Если у кого есть фрагмент кода работы с картой в SD-режиме, пожалуйста поделитесь, буду очень признателен.
Go to the top of the page
 
+Quote Post
aaarrr
сообщение Dec 3 2009, 14:33
Сообщение #2


Гуру
******

Группа: Свой
Сообщений: 10 713
Регистрация: 11-12-04
Пользователь №: 1 448



Лучше запустите карту в SPI режиме на частоте 25MHz. SD через PIO однозначно будет медленнее.
Или возьмите контроллер с нативной поддержкой SD.
Go to the top of the page
 
+Quote Post
zltigo
сообщение Dec 3 2009, 14:38
Сообщение #3


Гуру
******

Группа: Свой
Сообщений: 13 372
Регистрация: 27-11-04
Из: Riga, Latvia
Пользователь №: 1 244



Цитата(aaarrr @ Dec 3 2009, 17:33) *
Лучше...

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

Ну а уж то, что софтовое махание пинами безнадежно уступает SPI на хорошей скорости, это действительно так...


--------------------
Feci, quod potui, faciant meliora potentes
Go to the top of the page
 
+Quote Post
Freeuser
сообщение Dec 4 2009, 07:13
Сообщение #4


Участник
*

Группа: Участник
Сообщений: 66
Регистрация: 18-11-09
Из: Мск
Пользователь №: 53 718



Сейчас быстродействие не является важным, самое главное запустить карту не с помощью SPI, а с использованием SD-протокола. Я благодарен за ценные замечания и советы. Использовать другой контроллер не получится, поэтому придется работать с уже имеющимся. А можно услышать что нибудь конкретно по сабжу?
Go to the top of the page
 
+Quote Post
aaarrr
сообщение Dec 4 2009, 10:27
Сообщение #5


Гуру
******

Группа: Свой
Сообщений: 10 713
Регистрация: 11-12-04
Пользователь №: 1 448



Цитата(Freeuser @ Dec 4 2009, 10:13) *
А можно услышать что нибудь конкретно по сабжу?

Могу только посоветовать начать с однобитного SD. Но если возникают вопросы, как послать команду... то лучше начать с программного SPI, чтобы их больше не было.
Go to the top of the page
 
+Quote Post
Freeuser
сообщение Dec 4 2009, 12:07
Сообщение #6


Участник
*

Группа: Участник
Сообщений: 66
Регистрация: 18-11-09
Из: Мск
Пользователь №: 53 718



Цитата
...то лучше начать с программного SPI...

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

З.Ы.: Многие форумчане заводили карту в SD режиме. Может быть кто-нибудь поделится исходниками для ознакомления?

Сообщение отредактировал Freeuser - Dec 4 2009, 12:50
Go to the top of the page
 
+Quote Post
KAlex
сообщение Dec 7 2009, 13:23
Сообщение #7


Местный
***

Группа: Свой
Сообщений: 387
Регистрация: 20-12-06
Из: Obninsk
Пользователь №: 23 719



Цитата(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();
}
Go to the top of the page
 
+Quote Post
Freeuser
сообщение Dec 10 2009, 11:43
Сообщение #8


Участник
*

Группа: Участник
Сообщений: 66
Регистрация: 18-11-09
Из: Мск
Пользователь №: 53 718



А можно взглянуть на функцию send_comm_to_sd();
Go to the top of the page
 
+Quote Post
KAlex
сообщение Dec 11 2009, 09:01
Сообщение #9


Местный
***

Группа: Свой
Сообщений: 387
Регистрация: 20-12-06
Из: Obninsk
Пользователь №: 23 719



Цитата(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
Причина редактирования: Оформление цитаты исходника.
Go to the top of the page
 
+Quote Post
Freeuser
сообщение Dec 14 2009, 09:55
Сообщение #10


Участник
*

Группа: Участник
Сообщений: 66
Регистрация: 18-11-09
Из: Мск
Пользователь №: 53 718



Спасибо большое, ваш код очень помог, карта заговорила. Теперь будем ускорять процесс общения.
Go to the top of the page
 
+Quote Post

Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 20th July 2025 - 09:15
Рейтинг@Mail.ru


Страница сгенерированна за 0.01428 секунд с 7
ELECTRONIX ©2004-2016