Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: MicroSD не выходит из режима Idle State
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > Все остальные микроконтроллеры
Olga_
Добрый день!

Пытаюсь по интерфейсу SPI связать microSD карту и TMS320f2812. Для этого использую порт McBSP в режиме SPI-0. Частоту передачи настроила на 300кГц (проверяла осциллографом).
Проект программы прикреплен к записи (CodeComposerStudio 6.1).

Алгоритм программы следующий:

1) Отправляю 0xFF 80 clock cycles при CS в высоком уровне.
2) Перевожу CS в низкий уровень.
3) Отправляю GO_IDLE_STATE (CMD0) с нулевым аргументом и CRC=0x95.
Ответ: 0x01 -> Idle State.
4) Отправляю 0xFF 8 clock cycles.
5) Отправляю SEND_IF_COND (CMD8) с нулевым аргументом и CRC=0x87.
Ответ: 0x05 –> карта версии v1.
4) Отправляю 0xFF 8 clock cycles.
7) Отправляю READ_OCR (CMD58) с нулевым аргументом и CRC=0xFF.
Ответ: 0x01; OCR=0xFF -> напряжение в норме.
8) Отправляю 0xFF 8 clock cycles.
9) Отправляю APP_CMD (CMD55) с нулевым аргументом и CRC=0xFF.
Ответ: 0x01.
10) Отправляю 0xFF 8 clock cycles.
11) Отправляю SD_SEND_OP_COND (ACMD41) с нулевым аргументом и CRC=0xFF.
Ответ: 0x05 или 0x01. MicroSD карта никогда не выходит из режима Idle State

Пыталась решить проблему:
1) Отправляла 0xFF 8 clock cycles между командами при CS в высоком уровне.
2) Включала распознавание CRC при помощи команды 0x59. Ответ был 0x01 (что говорит о том, что команда распознана), однако при отправлении последующей команды с неверным CRC ответ остается преждним, как если бы команды 0х59 не было. Ожидаемой ошибки 0x09 не возникает.

Подскажите пожалуйста, что я делаю не так.
(много форумов уже просмотрено, документации изучено, но решить проблему не удается)
Спасибо!


Genadi Zawidowski
Ловите кусок из моего проекта. Работа по SPI во второй части sdcard.c в архиве. Я тоже начинал с тексасовского примера - он вполне рабочий. С другого примера, не с Вашего... С более старой версии, похоже.
Olga_
Цитата(Genadi Zawidowski @ Dec 28 2015, 13:02) *
Ловите кусок из моего проекта. Работа по SPI во второй части sdcard.c в архиве. Я тоже начинал с тексасовского примера - он вполне рабочий. С другого примера, не с Вашего... С более старой версии, похоже.


Огромное спасибо! Попробую применить часть Вашего проекта.
Olga_
Цитата(Genadi Zawidowski @ Dec 28 2015, 13:02) *
Ловите кусок из моего проекта. Работа по SPI во второй части sdcard.c в архиве. Я тоже начинал с тексасовского примера - он вполне рабочий. С другого примера, не с Вашего... С более старой версии, похоже.

Я посмотрела Ваш проект.
Еще раз спасибо за помощь, но ,к сожалению, этот проект не мне не помог т.к. некоторые функции отсутствуют, а те, которые есть, не дали мне полного представления о работе программы: откуда какие функции вызываются и когда..
Не могли бы Вы дать некоторые пояснения?
Спасибо!
GetSmart
Карточки могут зависать в режиме Idle из-за неподключенной земли. Паразитно питаясь через SCK и CS. Иногда со странностями, иногда нормально отвечая на команды.
Olga_
Цитата(GetSmart @ Dec 28 2015, 17:06) *
Карточки могут зависать в режиме Idle из-за неподключенной земли. Паразитно питаясь через SCK и CS. Иногда со странностями, иногда нормально отвечая на команды.


Здравствуйте!
Земля подключена - проверяла.

Вот схема подключения microSD карты:

doom13
Цитата(Olga_ @ Dec 28 2015, 12:46) *
5) Отправляю SEND_IF_COND (CMD8) с нулевым аргументом и CRC=0x87.
Ответ: 0x05 –> карта версии v1.

Это означает - карта версии 2.00 или выше. Ссори, всё правильно.
Olga_
Цитата(GetSmart @ Dec 28 2015, 17:06) *
Карточки могут зависать в режиме Idle из-за неподключенной земли. Паразитно питаясь через SCK и CS. Иногда со странностями, иногда нормально отвечая на команды.


Спасибо огромное! Заработало!
В слоте SD карты действительно "отошла" земля.
Genadi Zawidowski
Цитата(Olga_ @ Dec 28 2015, 16:53) *
Я посмотрела Ваш проект.
Еще раз спасибо за помощь, но ,к сожалению, этот проект не мне не помог т.к. некоторые функции отсутствуют, а те, которые есть, не дали мне полного представления о работе программы: откуда какие функции вызываются и когда..
Не могли бы Вы дать некоторые пояснения?
Спасибо!


Ну раз всё уже ясно, скажу коротко - sd_initialize() вызывается для инициализации, а потом файловая система Чена вызывает по мере необходимости интерфейсные функции:

DWORD get_fattime (void);
DRESULT disk_ioctl (
BYTE drv, /* Physical drive nmuber (0..) */
BYTE ctrl, /* Control code */
void *buff /* Buffer to send/receive control data */
);
DRESULT disk_write (
BYTE drv, /* Physical drive nmuber (0..) */
const BYTE *buff, /* Data to be written */
DWORD sector, /* Sector address (LBA) */
UINT count /* Number of sectors to write */
);
DRESULT disk_read (
BYTE drv, /* Physical drive nmuber (0..) */
BYTE *buff, /* Data buffer to store read data */
DWORD sector, /* Sector address (LBA) */
UINT count /* Number of sectors to read */
);
DSTATUS disk_status (
BYTE drv /* Physical drive nmuber (0..) */
);
DSTATUS disk_initialize (
BYTE drv /* Physical drive nmuber (0..) */
);
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.