![]() |
|
|
Общетехнические вопросы Общие вопросы аналоговой и цифровой электроники. |
![]() |
|
Опции темы | Опции просмотра |
![]() |
#1 |
Senior Member
Регистрация: 08.12.2007
Возраст: 37
Сообщений: 172
Вес репутации: 185/43 ![]() ![]() |
![]()
Изучаю теорию по работе с картами памяти.
Все понятно кроме одного ![]() Где можно посмтреть полный список кодов команд? А то в манулах типа вот этого http://elm-chan.org/docs/mmc/mmc_e.html все ясно и красиво - ну пишут CMD0 и тп - а кодов самих нету ![]() Посмотрел пару исходников из ссылок конфы - там коды некоторых команд есть. Но хочется узнать из первоисточника полный список с кодами ![]() Подскажете где пошукать ЗЫ на гугле и яндексе ищу - но нахожу манулы без кодов ![]() Последний раз редактировалось DenisG; 23.06.2008 в 09:18. |
![]() |
![]() |
![]() |
#2 | |
Senior Member
Регистрация: 25.02.2007
Возраст: 48
Сообщений: 1,748
Вес репутации: 3479/95 ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() |
![]() Цитата:
Код:
/** MMC/SD card SPI mode commands **/ #define CMD0 0x40 // software reset #define CMD1 0x41 // brings card out of idle state #define CMD2 0x42 // not used in SPI mode #define CMD3 0x43 // not used in SPI mode #define CMD4 0x44 // not used in SPI mode #define CMD5 0x45 // Reserved #define CMD6 0x46 // Reserved #define CMD7 0x47 // not used in SPI mode #define CMD8 0x48 // Reserved #define CMD9 0x49 // ask card to send card speficic data (CSD) #define CMD10 0x4A // ask card to send card identification (CID) #define CMD11 0x4B // not used in SPI mode #define CMD12 0x4C // stop transmission on multiple block read #define CMD13 0x4D // ask the card to send it's status register #define CMD14 0x4E // Reserved #define CMD15 0x4F // not used in SPI mode #define CMD16 0x50 // sets the block length used by the memory card #define CMD17 0x51 // read single block #define CMD18 0x52 // read multiple block #define CMD19 0x53 // Reserved #define CMD20 0x54 // not used in SPI mode #define CMD21 0x55 // Reserved #define CMD22 0x56 // Reserved #define CMD23 0x57 // Reserved #define CMD24 0x58 // writes a single block #define CMD25 0x59 // writes multiple blocks #define CMD26 0x5A // not used in SPI mode #define CMD27 0x5B // change the bits in CSD #define CMD28 0x5C // sets the write protection bit #define CMD29 0x5D // clears the write protection bit #define CMD30 0x5E // checks the write protection bit #define CMD31 0x5F // Reserved #define CMD32 0x60 // Sets the address of the first sector of the erase group #define CMD33 0x61 // Sets the address of the last sector of the erase group #define CMD34 0x62 // removes a sector from the selected group #define CMD35 0x63 // Sets the address of the first group #define CMD36 0x64 // Sets the address of the last erase group #define CMD37 0x65 // removes a group from the selected section #define CMD38 0x66 // erase all selected groups #define CMD39 0x67 // not used in SPI mode #define CMD40 0x68 // not used in SPI mode #define CMD41 0x69 // Reserved #define CMD42 0x6A // locks a block // CMD43 ... CMD57 are Reserved #define CMD58 0x7A // reads the OCR register #define CMD59 0x7B // turns CRC off // CMD60 ... CMD63 are not used in SPI mode |
|
![]() |
![]() |
![]() |
#3 |
Senior Member
Регистрация: 08.12.2007
Возраст: 37
Сообщений: 172
Вес репутации: 185/43 ![]() ![]() |
![]()
спасибо
![]() |
![]() |
![]() |
![]() |
#4 |
Senior Member
Регистрация: 28.03.2007
Адрес: Almaty
Возраст: 33
Сообщений: 365
Вес репутации: 194/48 ![]() ![]() |
![]()
Можно я тоже спасибо скажу? =)
Как раз доделываю картридер =)
__________________
Бывает, проснешься как птица – Крылатой пружиной на взводе. И хочется жить и трудиться!.. Но к завтраку это проходит... |
![]() |
![]() |
![]() |
#5 |
Senior Member
|
![]()
может, кому для мемористиков попадалось то же самое?
мне нигде не удавалось. вернее, один раз всё же нащёл, но вместо кодов команд стояли ХХ и ХХХХ Можно было бы конечно , подобрать методом перебора, но уж больно нудно.. Последний раз редактировалось killer258; 23.06.2008 в 16:31. |
![]() |
![]() |
![]() |
#6 |
Senior Member
|
![]()
а..как работать с ними в полноскоростном режиме-а не SPI?
|
![]() |
![]() |
![]() |
#7 |
Senior Member
|
![]()
а никак
![]() потому что в этом случае нужно считать контрольную сумму команды,а её алгоритма не знает никто ![]() этот алгоритм, похоже, скрывается от широких масс.. А преимущества полноскоростного режима несомненны.Но- недоступно ![]() |
![]() |
![]() |
![]() |
#8 |
Junior Member
Регистрация: 11.01.2009
Возраст: 31
Сообщений: 6
Вес репутации: 100/0 ![]() ![]() |
![]()
Приветствую вас! Люди добрые подскажите пожалуйста, посмотрел по этой ссылке http://elm-chan.org/docs/mmc/mmc_e.html распиновку карт. Вопрос в том, что есть ли возможность найти распин карты Memory Stic Pro Duo, и сделать типа переходника с карты Micro SD под слот Memory Stic Pro Duo. Или просто как то перепаять.Прошу простить если что то не так назвал или что то не так обьяснил.
Буду очень благодарен за любую подсказку. |
![]() |
![]() |
![]() |
#9 | |
Senior Member
|
![]() Цитата:
|
|
![]() |
![]() |
![]() |
#10 | |
Junior Member
Регистрация: 11.01.2009
Возраст: 31
Сообщений: 6
Вес репутации: 100/0 ![]() ![]() |
![]() Цитата:
А не могли бы вы что нибуть посоветовать? Есть ли вообще смысл заморачиваться? В такой технике не сильно силен, прошу простить за ранее за неграмотность. За ранее благодарен!!! |
|
![]() |
![]() |
![]() |
#11 |
Banned
Регистрация: 27.02.2007
Адрес: Красноярск
Возраст: 48
Сообщений: 2,387
Вес репутации: 950/0 ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() |
![]()
IMHO нет смысла с Memory Stick париться, протокол закрытый, карты дорогие. Для поделок лучше, чем SD нет - примеров море, разъемы доступны, документация есть.
|
![]() |
![]() |
![]() |
#12 | |
Member
Регистрация: 10.11.2010
Возраст: 38
Сообщений: 83
Вес репутации: 123/32 ![]() ![]() |
![]() Цитата:
Код:
void MMC_CRC(unsigned char c) { unsigned char i; for (i = 0; i < 8; i++) { crc <<= 1; // в глобальной переменной накапливается crc7. инициализация 0x00 if (c & 0x80) crc ^= 0x09; if (crc & 0x80) crc ^= 0x09; c <<= 1; } } Код:
/* Name : CRC-16 CCITT Poly : 0x1021 x^16 + x^12 + x^5 + 1 Init : 0xFFFF Revert: false XorOut: 0x0000 Check : 0x29B1 ("123456789") MaxLen: 4095 байт (32767 бит) - обнаружение одинарных, двойных, тройных и всех нечетных ошибок */ unsigned short Crc16(unsigned char *pcBlock, unsigned short len) { unsigned short crc = 0xFFFF; unsigned char i; while (len--) { crc ^= *pcBlock++ << 8; for (i = 0; i < 8; i++) crc = crc & 0x8000 ? (crc << 1) ^ 0x1021 : crc << 1; } return crc; } Последний раз редактировалось bis_spb; 04.04.2012 в 23:11. Причина: добаввление CRC16 |
|
![]() |
![]() |
![]() |
#13 |
Senior Member
Регистрация: 25.02.2007
Адрес: Херсон
Сообщений: 3,642
Вес репутации: 1983/99 ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() |
![]()
На дату полезно смотреть, сообщение от 23.06.2008, 15:58.
|
![]() |
![]() |
![]() |
#14 |
Member
Регистрация: 10.11.2010
Возраст: 38
Сообщений: 83
Вес репутации: 123/32 ![]() ![]() |
![]()
Пусть будет...
Меня вот интересует, как правильно подать команду CMD42? 1. CMD16 - установка размера блока равным размеру структуры данных для команды CMD42. 2. СMD42, операнд к команде равен нулю (согласно документации). 3. CMD24, команда передачи блока, содержащего структуру данных команды. В документации написано, что нужно передавать CRC16, а где его передавать, что-то не пойму. В конце блока? И можно ли при выключенном CRC (CMD59) вместо него передавать 0xFF или вообще ничего не передавать? Последний раз редактировалось bis_spb; 05.04.2012 в 18:55. |
![]() |
![]() |
![]() |
#16 | |
Member
Регистрация: 10.11.2010
Возраст: 38
Сообщений: 83
Вес репутации: 123/32 ![]() ![]() |
![]() Цитата:
|
|
![]() |
![]() |
![]() |
#17 |
Super Moderator
Регистрация: 19.03.2007
Адрес: Львов
Возраст: 44
Сообщений: 3,334
Вес репутации: 2341/100 ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() |
![]()
FAT sub-types: FAT12, FAT16 and FAT32
|
![]() |
![]() |
![]() |
#18 |
Senior Member
Регистрация: 05.04.2008
Адрес: Israel
Возраст: 45
Сообщений: 1,542
Вес репутации: 2283/77 ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() |
![]() |
![]() |
![]() |
![]() |
#19 |
Member
Регистрация: 10.11.2010
Возраст: 38
Сообщений: 83
Вес репутации: 123/32 ![]() ![]() |
![]() |
![]() |
![]() |
![]() |
#20 | |
Member
Регистрация: 10.11.2010
Возраст: 38
Сообщений: 83
Вес репутации: 123/32 ![]() ![]() |
![]()
Я ранее писал:
Цитата:
1. Сначала устанавливаем размер блока: SendMMCCmd(SET_BLOCKLEN, PWDS_LEN+4); Где PWDS_LEN - длина пароля в байтах. 2. SendMMCCmd(CMD42,0); // тип ответа - R1 3. Сразу после отправки начала команды, отправляем Старт токен (0xFE) и за ним структуру с параметрами команды: Код:
typedef union { unsigned char byte[PWDS_LEN+4]; struct _pole { struct _mode_bits { unsigned char SET_PWD:1; unsigned char CLR_PWD:1; unsigned char LOCK_UNLOCK:1; unsigned char ERASE:1; unsigned char :4; }mode_bits; unsigned char PWD_LEN; unsigned char PASSW[PWDS_LEN]; unsigned int CRC16; // можно заменить 0xFFFF для SPI-режима, т.к. по дефолту для него CRC16 выключено. }pole; }DATA_CMD42; 5. если отличается, то это DATA_RESPONSE и нужно получить комбинацию DATA_ACCEPTED. 6. В конце дожидаемся окончания сигнала BUSY. (Пока карта занята, в конце передачи DATA_RESPONSE карта выдает 0x00) 7. как только изменился, команда передана полностью. 8. Запрашиваем регистр статуса: response = SendMMCCmd(SEND_STATUS,0); 9. Проверяем, заблокировалась ли карта. Последний раз редактировалось bis_spb; 09.04.2012 в 22:48. |
|
![]() |
![]() |
![]() |
#21 |
Junior Member
Регистрация: 16.11.2012
Возраст: 30
Сообщений: 10
Вес репутации: 100/24 ![]() ![]() |
![]()
Здравствуйте, у меня возникла следующая проблема при работе с micro SD картой (может кто с такой сталкивался подскажите как быть):
карта проходит инициализацию, отвечает как положено на cmd0 - 01, при посылке acmd41 переходит с 01 на 00, на установку размера буфера отвечает 00. Пытаюсь читать нулевой сектор и вот тут начинаются проблемы: Ответ r1=0x00 на cmd17 приходит, получаю даже FE, но вместо значений о-го сектора получаю что-то не то а именно: 03 FF FF F0 00 ....00 (и так до адреса 1с4) 87 EF BF 0F C0 40 41 9A 00...00 (до адреса 1FE) 20 8E. т.е. они вроде как на своем месте но не те, читаю карту через winhex, вижу нормальный нулевой сектор а именно: в начале нули до адреса 1BE далее 02 08 00 06 1F DF BF 85 00 00 00 7B 07 3B и так далее нули, а в конце сигнатура. Посмотрел структуру FAT, выходит адрес загрузочной записи раздела (PRB) - 133 сектор (00 00 00 85). Смотрю через WinHex этот сектор там тоже все в порядке полно данных в конце сигнатура, пытаюсь его прочитать в программе получаю данные, но они опять не те: 03 FF FF F6 4E 00 20 80 38 48 7E 02 00 00 01 00 00 00 00 01 E3 40 а в winhex смотрю: EB 3C 90 4D 53 44 4F 53 35 2E 30 00 02 40 06 00 02 00 02, Т.Е. всё в порядке. карта kingston 2 GB. Приведу текст программы. //определение команд и сигнала CS #define GO_IDLE_STATE 0 #define SEND_OP_COND 1 #define SEND_IF_COND 8 #define SEND_CSD 9 #define STOP_TRANSMISSION 12 #define SEND_STATUS 13 #define SET_BLOCK_LEN 16 #define READ_SINGLE_BLOCK 17 #define READ_MULTIPLE_BLOCKS 18 #define WRITE_SINGLE_BLOCK 24 #define WRITE_MULTIPLE_BLOCKS 25 #define ERASE_BLOCK_START_ADDR 32 #define ERASE_BLOCK_END_ADDR 33 #define ERASE_SELECTED_BLOCKS 38 #define SD_SEND_OP_COND 41 //ACMD #define APP_CMD 55 #define READ_OCR 58 #define CRC_ON_OFF 59 #define ON 1 #define OFF 0 #define SD_CS_ASSERT PORTCbits.RC2=0; #define SD_CS_DEASSERT PORTCbits.RC2=1; //сама инициализация unsigned char SD_init(void) { unsigned char response, SD_version; unsigned int retry=0 ; int i=0; for(i=0;i<10;i++) spi(0xff); //80 clock pulses spent before sending the first command SD_CS_ASSERT; do { response = SD_sendCommand(GO_IDLE_STATE, 0); //send 'reset & go idle' command retry++; if(retry>0x20) return 1; //time out, card not detected } while(response != 0x01); SD_CS_DEASSERT; spi (0xff); spi (0xff); retry = 0; SD_version = 2; //default set to SD compliance with ver2.x; //this may change after checking the next command do { response = SD_sendCommand(SEND_IF_COND,0x000001AA); //Check power supply status, mendatory for SDHC card retry++; if(retry>0xfe) { SD_version = 1; cardType = 1; break; } //time out }while(response != 0x01); retry = 0; do { response = SD_sendCommand(APP_CMD,0); //CMD55, must be sent before sending any ACMD command response = SD_sendCommand(SD_SEND_OP_COND,0x40000000); //ACMD41 retry++; if(retry>0xfe) { return 2; //time out, card initialization failed } }while(response != 0x00); retry = 0; SDHC_flag = 0; if (SD_version == 2) { do { response = SD_sendCommand(READ_OCR,0); retry++; if(retry>0xfe) { cardType = 0; break; } //time out }while(response != 0x00); if(SDHC_flag == 1) cardType = 2; else cardType = 3; } for(i=0;i<100;i++) Delay10TCY(); response=SD_sendCommand(CRC_ON_OFF, OFF); //disable CRC; deafault - CRC disabled in SPI mode response=SD_sendCommand(SET_BLOCK_LEN, 512); //set block size to 512; default size is 512 response=SD_readSingleBlock(0x00000000); return 0; //successful return } //функция посылки команды unsigned char SD_sendCommand(unsigned char cmd, unsigned long arg) { unsigned char response, retry=0, status,i1,i2,i3; //SD card accepts byte address while SDHC accepts block address in multiples of 512 //so, if it's SD card we need to convert block address into corresponding byte address by //multipying it with 512. which is equivalent to shifting it left 9 times //following 'if' loop does that if(SDHC_flag == 0) if(cmd == READ_SINGLE_BLOCK || cmd == READ_MULTIPLE_BLOCKS || cmd == WRITE_SINGLE_BLOCK || cmd == WRITE_MULTIPLE_BLOCKS || cmd == ERASE_BLOCK_START_ADDR|| cmd == ERASE_BLOCK_END_ADDR ) { arg = arg << 9; } SD_CS_ASSERT; spi(cmd | 0x40); //send command, first two bits always '01' spi(arg>>24); spi(arg>>16); spi(arg>>8); spi(arg); if(cmd == SEND_IF_COND) //it is compulsory to send correct CRC for CMD8 (CRC=0x87) & CMD0 (CRC=0x95) spi(0x87); //for remaining commands, CRC is ignored in SPI mode else spi(0x95); while((response = spi(0xff)) == 0xff) //wait response if(retry++ > 0xfe) break; //time out error if(response == 0x00 && cmd == 58) //checking response of CMD58 { status = spi(0xff) & 0x40; //first byte of the OCR register (bit 31:24) if(status == 0x40) SDHC_flag = 1; //we need it to verify SDHC card else SDHC_flag = 0; i1=spi(0xff); //remaining 3 bytes of the OCR register are ignored here i2=spi(0xff); //one can use these bytes to check power supply limits of SD i3=spi(0xff); i3+=0; } status=spi(0xff); //extra 8 CLK SD_CS_DEASSERT; return response; //return state } //чтение блока данных (читаю в 2 буффера по 256) unsigned char SD_readSingleBlock(unsigned long startBlock) { unsigned char response; int i, retry=0; for(i=0;i<10;i++) { SD_CS_ASSERT; response = SD_sendCommand(READ_SINGLE_BLOCK, startBlock); //read a Block command if(response == 0x00) {SD_CS_DEASSERT; break;} //check for SD status: 0x00 - OK (No flags set) } SD_CS_ASSERT; retry = 0; while(spi(0xff) != 0xfe) //wait for start block token 0xfe (0x11111110) if(retry++ > 0xfffe){SD_CS_DEASSERT; return 1;} //return if time-out for(i=0; i<512 ![]() { if(i>=256) buffer2[i-256] = spi(0xff); else buffer1[i] = spi(0xff); i++; } retry=0; spi(0xff); //receive incoming CRC (16-bit), CRC is ignored here spi(0xff); spi(0xff); //extra 8 clock pulses SD_CS_DEASSERT; return 0; } |
![]() |
![]() |
![]() |
Метки |
mmc, spi |
Здесь присутствуют: 1 (пользователей: 0 , гостей: 1) | |
Опции темы | |
Опции просмотра | |
|
|
![]() |
||||
Тема | Автор | Раздел | Ответов | Последнее сообщение |
Надо вводить много русского текста для символьного LCD. | DL36 | Продукция MICROCHIP | 43 | 08.06.2010 12:14 |
Сопряжение двух устройств и конвертер команд? | Tolin | Продукция MICROCHIP | 3 | 07.07.2008 15:35 |
Обработка команд с UART pic16f628a | djdiablo | Продукция MICROCHIP | 11 | 14.11.2007 15:42 |
dsPIC30 система команд | kolka | Продукция MICROCHIP | 4 | 02.11.2007 19:00 |
Подружим PIC и SIEMENS c помощью АТ команд ! | west329 | Продукция MICROCHIP | 5 | 05.09.2007 21:30 |