|
|
  |
запуск карты в SD mode, вопрос по конфигурации ног контроллера |
|
|
|
Dec 3 2009, 14:21
|
Участник

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

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

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

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

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

|
Цитата ...то лучше начать с программного SPI... С программной реализацией SPI познакомился, вы оказались правы, много вопросов отпало. З.Ы.: Многие форумчане заводили карту в SD режиме. Может быть кто-нибудь поделится исходниками для ознакомления?
Сообщение отредактировал Freeuser - Dec 4 2009, 12:50
|
|
|
|
|
Dec 7 2009, 13:23
|

Местный
  
Группа: Свой
Сообщений: 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(); }
|
|
|
|
|
Dec 10 2009, 11:43
|
Участник

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

|
А можно взглянуть на функцию send_comm_to_sd();
|
|
|
|
|
Dec 11 2009, 09:01
|

Местный
  
Группа: Свой
Сообщений: 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
Причина редактирования: Оформление цитаты исходника.
|
|
|
|
|
Dec 14 2009, 09:55
|
Участник

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

|
Спасибо большое, ваш код очень помог, карта заговорила. Теперь будем ускорять процесс общения.
|
|
|
|
|
  |
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|