Перейти к содержанию
    

запуск карты в SD mode

реализовываю связку SD card+at91sam7x, с SPI режимом разобрался, теперь нужно чтобы это дело работало в SD mode с 4-х битной шиной данных. Почитал спецификацию для карт, принцип работы примерно понял. Но тут возник вопрос: допустим я подконнектил ногу контроллера PA16 к пину CMD карточки. Как мне сконфигурировать PA16, чтобы передавать команды карте? Ну то что этот вывод нужно сделать выходом, это понятно.

P.S. Если у кого есть фрагмент кода работы с картой в SD-режиме, пожалуйста поделитесь, буду очень признателен.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Лучше запустите карту в SPI режиме на частоте 25MHz. SD через PIO однозначно будет медленнее.

Или возьмите контроллер с нативной поддержкой SD.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Лучше...

Вы вопроса не поняли все хуже :(

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

 

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Сейчас быстродействие не является важным, самое главное запустить карту не с помощью SPI, а с использованием SD-протокола. Я благодарен за ценные замечания и советы. Использовать другой контроллер не получится, поэтому придется работать с уже имеющимся. А можно услышать что нибудь конкретно по сабжу?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

А можно услышать что нибудь конкретно по сабжу?

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

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

 

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

Изменено пользователем Freeuser

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

Ну чтож, поделюсь.

  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();
}

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

А можно взглянуть на функцию send_comm_to_sd();

Реализовано на АСМе для скорости.

Входной параметр - указатель на comstr.

 

		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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Спасибо большое, ваш код очень помог, карта заговорила. Теперь будем ускорять процесс общения.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
К сожалению, ваш контент содержит запрещённые слова. Пожалуйста, отредактируйте контент, чтобы удалить выделенные ниже слова.
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...