Freeuser 0 3 декабря, 2009 Опубликовано 3 декабря, 2009 · Жалоба реализовываю связку SD card+at91sam7x, с SPI режимом разобрался, теперь нужно чтобы это дело работало в SD mode с 4-х битной шиной данных. Почитал спецификацию для карт, принцип работы примерно понял. Но тут возник вопрос: допустим я подконнектил ногу контроллера PA16 к пину CMD карточки. Как мне сконфигурировать PA16, чтобы передавать команды карте? Ну то что этот вывод нужно сделать выходом, это понятно. P.S. Если у кого есть фрагмент кода работы с картой в SD-режиме, пожалуйста поделитесь, буду очень признателен. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
aaarrr 69 3 декабря, 2009 Опубликовано 3 декабря, 2009 · Жалоба Лучше запустите карту в SPI режиме на частоте 25MHz. SD через PIO однозначно будет медленнее. Или возьмите контроллер с нативной поддержкой SD. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
zltigo 1 3 декабря, 2009 Опубликовано 3 декабря, 2009 · Жалоба Лучше... Вы вопроса не поняли все хуже :( "вопрос: допустим я подконнектил ногу контроллера PA16 к пину CMD карточки. Как мне сконфигурировать PA16, чтобы передавать команды карте? Ну то что этот вывод нужно сделать выходом..." Ну а уж то, что софтовое махание пинами безнадежно уступает SPI на хорошей скорости, это действительно так... Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Freeuser 0 4 декабря, 2009 Опубликовано 4 декабря, 2009 · Жалоба Сейчас быстродействие не является важным, самое главное запустить карту не с помощью SPI, а с использованием SD-протокола. Я благодарен за ценные замечания и советы. Использовать другой контроллер не получится, поэтому придется работать с уже имеющимся. А можно услышать что нибудь конкретно по сабжу? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
aaarrr 69 4 декабря, 2009 Опубликовано 4 декабря, 2009 · Жалоба А можно услышать что нибудь конкретно по сабжу? Могу только посоветовать начать с однобитного SD. Но если возникают вопросы, как послать команду... то лучше начать с программного SPI, чтобы их больше не было. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Freeuser 0 4 декабря, 2009 Опубликовано 4 декабря, 2009 (изменено) · Жалоба ...то лучше начать с программного SPI... С программной реализацией SPI познакомился, вы оказались правы, много вопросов отпало. З.Ы.: Многие форумчане заводили карту в SD режиме. Может быть кто-нибудь поделится исходниками для ознакомления? Изменено 4 декабря, 2009 пользователем Freeuser Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
KAlex 0 7 декабря, 2009 Опубликовано 7 декабря, 2009 · Жалоба З.Ы.: Многие форумчане заводили карту в 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(); } Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Freeuser 0 10 декабря, 2009 Опубликовано 10 декабря, 2009 · Жалоба А можно взглянуть на функцию send_comm_to_sd(); Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
KAlex 0 11 декабря, 2009 Опубликовано 11 декабря, 2009 · Жалоба А можно взглянуть на функцию 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 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Freeuser 0 14 декабря, 2009 Опубликовано 14 декабря, 2009 · Жалоба Спасибо большое, ваш код очень помог, карта заговорила. Теперь будем ускорять процесс общения. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться