Форум Микро-Чип
Поиск и заказ электронных компонентов
 

Вернуться   Форум Микро-Чип > Общетехнические вопросы

Общетехнические вопросы Общие вопросы аналоговой и цифровой электроники.

Ответ
 
Опции темы Опции просмотра
Старый 22.06.2008, 00:25   #1
DenisG
Senior Member
 
Регистрация: 08.12.2007
Возраст: 37
Сообщений: 172
Вес репутации: 185/43
DenisG has a spectacular aura aboutDenisG has a spectacular aura about
По умолчанию Коды команд SD/MMC

Изучаю теорию по работе с картами памяти.
Все понятно кроме одного
Где можно посмтреть полный список кодов команд?
А то в манулах типа вот этого
http://elm-chan.org/docs/mmc/mmc_e.html
все ясно и красиво - ну пишут CMD0 и тп - а кодов самих нету
Посмотрел пару исходников из ссылок конфы - там коды некоторых команд есть. Но хочется узнать из первоисточника полный список с кодами
Подскажете где пошукать

ЗЫ на гугле и яндексе ищу - но нахожу манулы без кодов

Последний раз редактировалось DenisG; 23.06.2008 в 09:18.
DenisG вне форума   Ответить с цитированием
Старый 22.06.2008, 02:56   #2
Petr
Senior Member
 
Аватар для Petr
 
Регистрация: 25.02.2007
Возраст: 47
Сообщений: 1,734
Вес репутации: 3438/95
Petr has a reputation beyond reputePetr has a reputation beyond reputePetr has a reputation beyond reputePetr has a reputation beyond reputePetr has a reputation beyond reputePetr has a reputation beyond reputePetr has a reputation beyond reputePetr has a reputation beyond reputePetr has a reputation beyond reputePetr has a reputation beyond reputePetr has a reputation beyond repute
По умолчанию Ответ: Коды команд SD/MMC

Цитата:
Сообщение от DenisG Посмотреть сообщение
Изучаю теорию по работе с картами памяти.
Все понятно кроме одного
Где можно посмтреть полный список кодов команд?
А то в манулах типа вот этого
http://elm-chan.org/docs/mmc/mmc_e.html
все ясно и красиво - ну пишут CMD0 и тп - а кодов самих нету
Посмотрел пару исходинков из ссылок конфы - там коды некоторых команд есть. Но хочется узнать из первоисточника полный список с кодами
Подскажете где пошукать

ЗЫ на гугле и яндексе ищу - но нахожу манулы без кодов
Код:
/** 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
Petr вне форума   Ответить с цитированием
Старый 23.06.2008, 09:15   #3
DenisG
Senior Member
 
Регистрация: 08.12.2007
Возраст: 37
Сообщений: 172
Вес репутации: 185/43
DenisG has a spectacular aura aboutDenisG has a spectacular aura about
По умолчанию Ответ: Коды команд SD/MMC

спасибо
DenisG вне форума   Ответить с цитированием
Старый 23.06.2008, 15:32   #4
hammer
Senior Member
 
Аватар для hammer
 
Регистрация: 28.03.2007
Адрес: Almaty
Возраст: 33
Сообщений: 365
Вес репутации: 194/47
hammer has a spectacular aura abouthammer has a spectacular aura about
По умолчанию Ответ: Коды команд SD/MMC

Можно я тоже спасибо скажу? =)
Как раз доделываю картридер =)
__________________
Бывает, проснешься как птица –
Крылатой пружиной на взводе.
И хочется жить и трудиться!..
Но к завтраку это проходит...
hammer вне форума   Ответить с цитированием
Старый 23.06.2008, 15:49   #5
killer258
Senior Member
 
Аватар для killer258
 
Регистрация: 30.12.2007
Адрес: Череповец
Возраст: 48
Сообщений: 1,206
Вес репутации: 588/57
killer258 is a name known to allkiller258 is a name known to allkiller258 is a name known to allkiller258 is a name known to allkiller258 is a name known to allkiller258 is a name known to all
Отправить сообщение для killer258 с помощью ICQ
По умолчанию Ответ: Коды команд SD/MMC

может, кому для мемористиков попадалось то же самое?
мне нигде не удавалось.
вернее, один раз всё же нащёл, но вместо кодов команд стояли ХХ и ХХХХ
Можно было бы конечно , подобрать методом перебора, но уж больно нудно..

Последний раз редактировалось killer258; 23.06.2008 в 16:31.
killer258 вне форума   Ответить с цитированием
Старый 23.06.2008, 16:34   #6
maagalex
Senior Member
 
Аватар для maagalex
 
Регистрация: 25.02.2007
Адрес: &Alex==Israel.BatYam
Возраст: 42
Сообщений: 4,274
Вес репутации: 2351/109
maagalex has a reputation beyond reputemaagalex has a reputation beyond reputemaagalex has a reputation beyond reputemaagalex has a reputation beyond reputemaagalex has a reputation beyond reputemaagalex has a reputation beyond reputemaagalex has a reputation beyond reputemaagalex has a reputation beyond reputemaagalex has a reputation beyond reputemaagalex has a reputation beyond reputemaagalex has a reputation beyond repute
Отправить сообщение для maagalex с помощью ICQ Отправить сообщение для maagalex с помощью MSN Отправить сообщение для maagalex с помощью Skype™
По умолчанию Ответ: Коды команд SD/MMC

а..как работать с ними в полноскоростном режиме-а не SPI?
maagalex вне форума   Ответить с цитированием
Старый 23.06.2008, 16:58   #7
killer258
Senior Member
 
Аватар для killer258
 
Регистрация: 30.12.2007
Адрес: Череповец
Возраст: 48
Сообщений: 1,206
Вес репутации: 588/57
killer258 is a name known to allkiller258 is a name known to allkiller258 is a name known to allkiller258 is a name known to allkiller258 is a name known to allkiller258 is a name known to all
Отправить сообщение для killer258 с помощью ICQ
По умолчанию Ответ: Коды команд SD/MMC

а никак
потому что в этом случае нужно считать контрольную сумму команды,а её алгоритма не знает никто
этот алгоритм, похоже, скрывается от широких масс..
А преимущества полноскоростного режима несомненны.Но- недоступно
killer258 вне форума   Ответить с цитированием
Старый 11.01.2009, 18:52   #8
ALEXI37
Junior Member
 
Регистрация: 11.01.2009
Возраст: 30
Сообщений: 6
Вес репутации: 100/0
ALEXI37 will become famous soon enoughALEXI37 will become famous soon enough
По умолчанию Ответ: Коды команд SD/MMC

Приветствую вас! Люди добрые подскажите пожалуйста, посмотрел по этой ссылке http://elm-chan.org/docs/mmc/mmc_e.html распиновку карт. Вопрос в том, что есть ли возможность найти распин карты Memory Stic Pro Duo, и сделать типа переходника с карты Micro SD под слот Memory Stic Pro Duo. Или просто как то перепаять.Прошу простить если что то не так назвал или что то не так обьяснил.
Буду очень благодарен за любую подсказку.
ALEXI37 вне форума   Ответить с цитированием
Старый 17.01.2009, 13:41   #9
killer258
Senior Member
 
Аватар для killer258
 
Регистрация: 30.12.2007
Адрес: Череповец
Возраст: 48
Сообщений: 1,206
Вес репутации: 588/57
killer258 is a name known to allkiller258 is a name known to allkiller258 is a name known to allkiller258 is a name known to allkiller258 is a name known to allkiller258 is a name known to all
Отправить сообщение для killer258 с помощью ICQ
По умолчанию Ответ: Коды команд SD/MMC

Цитата:
Сообщение от ALEXI37 Посмотреть сообщение
Приветствую вас! Люди добрые подскажите пожалуйста, посмотрел по этой ссылке http://elm-chan.org/docs/mmc/mmc_e.html распиновку карт. Вопрос в том, что есть ли возможность найти распин карты Memory Stic Pro Duo, и сделать типа переходника с карты Micro SD под слот Memory Stic Pro Duo. Или просто как то перепаять.Прошу простить если что то не так назвал или что то не так обьяснил.
Буду очень благодарен за любую подсказку.
просто спаять переходник с MicroSD на MemoryStick не получится. Равзличие в командах и прочие мелочи..
killer258 вне форума   Ответить с цитированием
Старый 19.01.2009, 00:40   #10
ALEXI37
Junior Member
 
Регистрация: 11.01.2009
Возраст: 30
Сообщений: 6
Вес репутации: 100/0
ALEXI37 will become famous soon enoughALEXI37 will become famous soon enough
По умолчанию Ответ: Коды команд SD/MMC

Цитата:
Сообщение от killer258 Посмотреть сообщение
просто спаять переходник с MicroSD на MemoryStick не получится. Равзличие в командах и прочие мелочи..
Приветствую! Большое спасибо уважаемый за ответ!!!
А не могли бы вы что нибуть посоветовать? Есть ли вообще смысл заморачиваться? В такой технике не сильно силен, прошу простить за ранее за неграмотность.
За ранее благодарен!!!
ALEXI37 вне форума   Ответить с цитированием
Старый 19.01.2009, 08:27   #11
SSH
Banned
 
Регистрация: 27.02.2007
Адрес: Красноярск
Возраст: 48
Сообщений: 2,387
Вес репутации: 950/0
SSH is a splendid one to beholdSSH is a splendid one to beholdSSH is a splendid one to beholdSSH is a splendid one to beholdSSH is a splendid one to beholdSSH is a splendid one to beholdSSH is a splendid one to beholdSSH is a splendid one to behold
По умолчанию Ответ: Коды команд SD/MMC

IMHO нет смысла с Memory Stick париться, протокол закрытый, карты дорогие. Для поделок лучше, чем SD нет - примеров море, разъемы доступны, документация есть.
SSH вне форума   Ответить с цитированием
Старый 04.04.2012, 23:04   #12
bis_spb
Member
 
Регистрация: 10.11.2010
Возраст: 38
Сообщений: 83
Вес репутации: 123/31
bis_spb will become famous soon enoughbis_spb will become famous soon enough
По умолчанию Re: Ответ: Коды команд SD/MMC

Цитата:
Сообщение от killer258 Посмотреть сообщение
а никак
потому что в этом случае нужно считать контрольную сумму команды,а её алгоритма не знает никто
этот алгоритм, похоже, скрывается от широких масс..
А преимущества полноскоростного режима несомненны.Но- недоступно
CRC7:
Код:
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;
    }
}
И для некоторых команд еще нужно CRC16 CCITT (взято с Wiki):
Код:
/*
  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
bis_spb вне форума   Ответить с цитированием
Старый 05.04.2012, 09:28   #13
DL36
Senior Member
 
Регистрация: 25.02.2007
Адрес: Херсон
Сообщений: 3,642
Вес репутации: 1983/99
DL36 has a brilliant futureDL36 has a brilliant futureDL36 has a brilliant futureDL36 has a brilliant futureDL36 has a brilliant futureDL36 has a brilliant futureDL36 has a brilliant futureDL36 has a brilliant futureDL36 has a brilliant futureDL36 has a brilliant futureDL36 has a brilliant future
По умолчанию Re: Ответ: Коды команд SD/MMC

На дату полезно смотреть, сообщение от 23.06.2008, 15:58.
DL36 вне форума   Ответить с цитированием
Старый 05.04.2012, 18:41   #14
bis_spb
Member
 
Регистрация: 10.11.2010
Возраст: 38
Сообщений: 83
Вес репутации: 123/31
bis_spb will become famous soon enoughbis_spb will become famous soon enough
По умолчанию Re: Ответ: Коды команд SD/MMC

Цитата:
Сообщение от DL36 Посмотреть сообщение
На дату полезно смотреть, сообщение от 23.06.2008, 15:58.
Пусть будет...
Меня вот интересует, как правильно подать команду CMD42?

1. CMD16 - установка размера блока равным размеру структуры данных для команды CMD42.
2. СMD42, операнд к команде равен нулю (согласно документации).
3. CMD24, команда передачи блока, содержащего структуру данных команды.

В документации написано, что нужно передавать CRC16, а где его передавать, что-то не пойму. В конце блока? И можно ли при выключенном CRC (CMD59) вместо него передавать 0xFF или вообще ничего не передавать?

Последний раз редактировалось bis_spb; 05.04.2012 в 18:55.
bis_spb вне форума   Ответить с цитированием
Старый 05.04.2012, 20:36   #15
DL36
Senior Member
 
Регистрация: 25.02.2007
Адрес: Херсон
Сообщений: 3,642
Вес репутации: 1983/99
DL36 has a brilliant futureDL36 has a brilliant futureDL36 has a brilliant futureDL36 has a brilliant futureDL36 has a brilliant futureDL36 has a brilliant futureDL36 has a brilliant futureDL36 has a brilliant futureDL36 has a brilliant futureDL36 has a brilliant futureDL36 has a brilliant future
По умолчанию Re: Ответ: Коды команд SD/MMC

Я ж не возражаю, только, можно использовать готовую FatFs от Чана, хорошо написанную и заняться чем то более продуктивным.
DL36 вне форума   Ответить с цитированием
Старый 05.04.2012, 21:23   #16
bis_spb
Member
 
Регистрация: 10.11.2010
Возраст: 38
Сообщений: 83
Вес репутации: 123/31
bis_spb will become famous soon enoughbis_spb will become famous soon enough
По умолчанию Re: Ответ: Коды команд SD/MMC

Цитата:
Сообщение от DL36 Посмотреть сообщение
Я ж не возражаю, только, можно использовать готовую FatFs от Чана, хорошо написанную и заняться чем то более продуктивным.
Она вроде FAT16 и не все карты поддерживает.
bis_spb вне форума   Ответить с цитированием
Старый 05.04.2012, 21:26   #17
vitalka
Super Moderator
 
Аватар для vitalka
 
Регистрация: 19.03.2007
Адрес: Львов
Возраст: 44
Сообщений: 3,334
Вес репутации: 2341/99
vitalka has a reputation beyond reputevitalka has a reputation beyond reputevitalka has a reputation beyond reputevitalka has a reputation beyond reputevitalka has a reputation beyond reputevitalka has a reputation beyond reputevitalka has a reputation beyond reputevitalka has a reputation beyond reputevitalka has a reputation beyond reputevitalka has a reputation beyond reputevitalka has a reputation beyond repute
По умолчанию Re: Ответ: Коды команд SD/MMC

FAT sub-types: FAT12, FAT16 and FAT32
vitalka вне форума   Ответить с цитированием
Старый 09.04.2012, 16:51   #18
DimaS
Senior Member
 
Регистрация: 05.04.2008
Адрес: Israel
Возраст: 45
Сообщений: 1,537
Вес репутации: 2283/77
DimaS has a reputation beyond reputeDimaS has a reputation beyond reputeDimaS has a reputation beyond reputeDimaS has a reputation beyond reputeDimaS has a reputation beyond reputeDimaS has a reputation beyond reputeDimaS has a reputation beyond reputeDimaS has a reputation beyond reputeDimaS has a reputation beyond reputeDimaS has a reputation beyond reputeDimaS has a reputation beyond repute
По умолчанию Re: Ответ: Коды команд SD/MMC

Цитата:
Сообщение от bis_spb Посмотреть сообщение
Она вроде FAT16
И 16, и 12, и 32, и с длинными именами.

Цитата:
и не все карты поддерживает.
Может быть, но мне пока таких не попадалось.
DimaS вне форума   Ответить с цитированием
Старый 09.04.2012, 22:28   #19
bis_spb
Member
 
Регистрация: 10.11.2010
Возраст: 38
Сообщений: 83
Вес репутации: 123/31
bis_spb will become famous soon enoughbis_spb will become famous soon enough
По умолчанию Re: Ответ: Коды команд SD/MMC

Цитата:
Сообщение от DimaS Посмотреть сообщение
И 16, и 12, и 32, и с длинными именами.



Может быть, но мне пока таких не попадалось.

И SDHC поддерживает? Эх.. где она раньше была... А то пришлось самому наворачивать микрочиповскую.. На днях прикрутил блокировку-разблокировку (установку пороля).
bis_spb вне форума   Ответить с цитированием
Старый 09.04.2012, 22:38   #20
bis_spb
Member
 
Регистрация: 10.11.2010
Возраст: 38
Сообщений: 83
Вес репутации: 123/31
bis_spb will become famous soon enoughbis_spb will become famous soon enough
По умолчанию Re: Ответ: Коды команд SD/MMC

Я ранее писал:
Цитата:
Меня вот интересует, как правильно подать команду CMD42?

1. CMD16 - установка размера блока равным размеру структуры данных для команды CMD42.
2. СMD42, операнд к команде равен нулю (согласно документации).
3. CMD24, команда передачи блока, содержащего структуру данных команды.

В документации написано, что нужно передавать CRC16, а где его передавать, что-то не пойму. В конце блока? И можно ли при выключенном CRC (CMD59) вместо него передавать 0xFF или вообще ничего не передавать?
Оказалось все довольно просто.
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;
4. Ждем, пока карта шлет 0xFF
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.
bis_spb вне форума   Ответить с цитированием
Старый 16.11.2012, 16:24   #21
teksark
Junior Member
 
Регистрация: 16.11.2012
Возраст: 30
Сообщений: 10
Вес репутации: 100/24
teksark will become famous soon enoughteksark will become famous soon enough
По умолчанию Re: Коды команд SD/MMC

Здравствуйте, у меня возникла следующая проблема при работе с 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 //read 512 bytes
{
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;
}
teksark вне форума   Ответить с цитированием
Ответ

Метки
mmc, spi


Здесь присутствуют: 1 (пользователей: 0 , гостей: 1)
 
Опции темы
Опции просмотра

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.

Быстрый переход

Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Надо вводить много русского текста для символьного 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


Часовой пояс GMT +3, время: 00:03.


Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, Jelsoft Enterprises Ltd. Перевод: zCarot