0 / 0 / 0
Регистрация: 07.02.2106
Сообщений: 270
|
|
1 | |
Помогите разобратся SD картами.09.11.2014, 13:35. Показов 8589. Ответов 17
Метки нет Все метки)
(
Начал знакомство с SPI и собственно с SD картами.
Почитал даташиты и спецификации на карты, вроде бы все понятно,мне показалось... Вообщем возникла пара вопросов: - Если циклически слать CMD0 ответ будет всегда одинаковый? (до инициализации карты) - Если на карту слать "ахинею" (FF, FF, FF, FF, FF, FF) вместо команд карта будет что ни будь отвечать? P.S. Может кто ни будь работал с TMS320С6455 ? и знает как натроить SPI без EDMA?)))))
0
|
|
09.11.2014, 13:35 | |
Ответы с готовыми решениями:
17
Помогите разобратся с #define Помогите разобратся с SWD протоколом Помогите разобратся с оптопарой и симистором. Помогите разобратся с указателями на структуры и массивы. USART в ATmega8515. Помогите разобратся |
1 / 1 / 0
Регистрация: 11.01.2013
Сообщений: 5,479
|
|
09.11.2014, 14:30 | 2 |
![]()
0
|
0 / 0 / 0
Регистрация: 07.02.2106
Сообщений: 270
|
|
09.11.2014, 22:29 | 3 |
О разобрался))))
Да на CMD0 приходит всегда 1 ответ, даже до инициализации. На "FF" карта никак не реагирует, что является отличным способом выдать тактирующую пачку. Вообщем в итоге сделал так(условные обозначения): send(CMD0) - 6 байт как и положено (40_00_00_00_00_95) send(0xFF) - Выроботка "пачки тактов" для подумать(обработки полученной команды). send(0xFF) - Выроботка "пачки тактов" для получения ответа(формат R1 -1 байт). 0xFF - 2 раза для получения 2-ух байтных ответов и т.д. Считываю данные с регистра приема. Контролировал процесс осцилом, все гуд) Теперь осталось поставить файловую систему)))))
0
|
1 / 1 / 0
Регистрация: 11.01.2013
Сообщений: 5,479
|
|
10.11.2014, 01:44 | 4 |
Для файловой системы пока рановато. Попробуйте пройти через всю инициализацию (причём не одной и той же карты, а разных типов).
Потом - попытайтесь прочитать сектор данных. Тогда, может быть, поймёте, о чём я говорил :-) Чёткий синхронный обмен (столько-то байт послать, столько-то получить в ответ) без повторных попыток и условных ветвлений в алгоритме - это возможно только с SPI-Ftosh, но не с SPI SD/MMC картой.
0
|
0 / 0 / 0
Регистрация: 07.02.2106
Сообщений: 270
|
|
13.11.2014, 11:32 | 5 |
Инициализация пройдена, организовано определение разных типов карт, индикация ошибок.
Но возникло несколько вопросов: 1) Почему то контроллер читает ответ позже чем отвечает флешка, приходится посылать просто пустые "FF" и естественно терять время. Почему так происходит? CMD0 и ответ R1 : http://s7.hostingkartinok.som/uptoods/thumbs/2014/11/333eb347b31659b4856489c0f451f203.png C N байтными и более ответами тоже самое, то есть N (размер байт ответа) + 5 раз приходится посылать "FF" , хотя судя по осциллограмме должно хватать N+1. 2) Как узнать диапазон доступных адресов блоков памяти? (английский не знаю и естественно очень тяжело читается даташит, и пока не наткнулся на такую инфу). 3) Можно ли как то узнать какие блоки заняты а какие свободны для записи не считывая всю флешку? (регистров подходящих не увидел в документации) 4) Также не удалось найти структура блока данных. Как я понял после CMD24 (запись 1 блока) жду ответа 0х00, и шлю данные(512 байт) + CRC7 но в 2 байтах (0x00##|0x01)? Подскажите пожалуйста или направьте в нужном направлении)
0
|
0 / 0 / 0
Регистрация: 18.03.2010
Сообщений: 2,230
|
|
13.11.2014, 15:10 | 6 |
есть вот такой проект, проверенный годами: http://itm-chan.org/fsw/ff/00index_e.html .
есть там такая ссылка: Downtood: FatFs sample projects for various platforms. в ней есть пример работы с сд/ммц картой, по которому можно свериться с тем, что наделал ты. ![]() ![]() ![]() ![]()
0
|
1 / 1 / 0
Регистрация: 11.01.2013
Сообщений: 5,479
|
|
13.11.2014, 18:25 | 7 |
![]() ![]()
0
|
0 / 0 / 0
Регистрация: 07.02.2106
Сообщений: 270
|
|
16.11.2014, 15:11 | 8 |
Уперся в очередной непонятный тупик(
Имеется 2 флешки: SD(2.X версии) и SDHC. Пишу 1 блок (512 байт) в разные адреса. SD нормально работает. SDHC пишет только в 0x0000, в остальные адреса ничего не записывает хотя в ответ шлет что все "ок" (0xE5 - данные приняты). Подскажите в чем может проблема? алгоритм записи: - иницилиазация - CMD24 (ответ "ок") - старт байт (0xFE) - data (512 байт) - ответ 0xE5 и линия в "0" ; - Жду когда линия поднимется в "1" и запись следующего сектора.
0
|
Oxford
|
|
16.11.2014, 15:17 | 9 |
Я выкладывал драйвер. Скачайте изучите.
|
0 / 0 / 0
Регистрация: 18.03.2010
Сообщений: 2,230
|
|
16.11.2014, 15:32 | 10 |
![]()
0
|
0 / 0 / 0
Регистрация: 07.02.2106
Сообщений: 270
|
|
16.11.2014, 15:46 | 11 |
![]() ![]() Ну одна то флешка норм пишется же, разницы в записи сектора размером 512 байт в спецификациях 2.X и 3.X не обнаружил, значит должно все писатся.
0
|
1 / 1 / 0
Регистрация: 11.01.2013
Сообщений: 5,479
|
|
16.11.2014, 16:28 | 12 |
У sdHC-карт адресация на низком уровне - поблочная. А у не-HC карт - побайтовая (хотя и выравненная на границу блока 512 байт). То есть для чтения одного и того же сектора из SD и SDHC адресный параметр для последней должен быть в 512 раз меньше.
0
|
0 / 0 / 0
Регистрация: 07.02.2106
Сообщений: 270
|
|
16.11.2014, 17:03 | 13 |
![]() Но в доках не нашел упоминания об этом Оо Единственное что и раньше видел: "писать и читать можно только секторами по 512 байт". Кстати с посылкой байт и получением ответа проблем не возникало, как Вы писали выше.
0
|
0 / 0 / 0
Регистрация: 07.02.2106
Сообщений: 270
|
|
18.11.2014, 15:33 | 14 |
Эх ну я и валенок, опять всплыл косяк который не могу осилить самостоятельно.
Вроде бы уже все прекрасно читается, пишется (по 1 блоку и мултиблочные операции). Естественно начал все прикручивать к практическому применению и все... В общем после записи или чтения (любой из операций) флешка перестает нормально отвечать на любые команды. На CMD0 вообще не реагирует, на прочие используемые команды выдает: SDHC - С1 3F SD - F0 4F Линия постоянно висит в "1" и с некоторым интервалом времени проскакивают указанные выше ответы. Пробовал в конце операция чтения/записи и CMD12 слать и STOP байт (FD) и их одновременно. Что это за ответы не понятно, так-как все форматы ответов должны начинаться с "0". ![]()
0
|
Oxford
|
|
18.11.2014, 15:59 | 15 |
найдете. здесь на форуме много чего есть учитесь искать.
|
1 / 1 / 0
Регистрация: 11.01.2013
Сообщений: 5,479
|
|
18.11.2014, 16:43 | 16 |
![]() <ul>После CMD17 (READ_SINGLE_BLOCK) <li>карта должна была ответить 0x00 (не обязательно сразу),</li><li>потом ответить 0xFE (опять-таки не сразу),</li><li>а после собственно чтения 512 байт данных надо было</li><li>прочитать ещё два байта CRC,</li><li>снять сигнал выборки CS,</li><li>после чего "добить" транзакцию посылкой одного байта 0xFF в карту.</li></ul>
0
|
0 / 0 / 0
Регистрация: 07.02.2106
Сообщений: 270
|
|
18.11.2014, 17:09 | 17 |
Вот допустим процедура чтения N секторов.
SD.iter - просто промежуточный подсчет шагов. while((*(int*)SPCR1&0x00000002)==0); Флаг готовности к чтению while((*(int*)SPCR1&0x00020000)==0); Флаг готовности к записи Код
void SD_CARD::RX_data (int adr, char num_data)//#WORCK# { char CMD_read[6]={0x00, 0x00, 0x00, 0x00, 0x00, 0x99}; //Шаблон команды для чтения. for(char i=5, ii=0; i>1 ;i--) // В шаблон добовляю адрес начального сектора чтения { CMD_read[i-1]=(adr>>8*ii); ii++; } CMD_read[0]= num_data>1 ? CMD18[0]:CMD17[0]; // Если секторов больше 1 то CMD18 SD.iter=0; for(char i=0; i<6; i++) SD_CARD::TX_ (CMD_read[i]); // отправляю команду чтения. SD_CARD::RX_(SD.card_tip>2 ? 2:1); // в зависимости от типа карты жду ответ . if(SD.get[0]!=0x00) // анализирую ответ SD_CARD::error_(); // функция анализа ошибки for(short i=num_data; i>0; i--) // Коли-во повторов зависит от кол-ва необходимых сектров { SD.iter=0; while(SD.temp!=0xFE) // жду старта посылки { *(int*)DXR1_SPI=0xFF; *(int*)DXR1_SPI=0xFF; while((*(int*)SPCR1&0x00000002)==0); SD.temp=*(int*)DRR1_SPI; while((*(int*)SPCR1&0x00020000)==0); SD.iter++; } for(short ii=513; ii>=0; ii--) //принимаю 512 байт + 2 байта CRC. { *(int*)DXR1_SPI=0xFF; while((*(int*)SPCR1&0x00000002)==0); SD.temp=*(int*)DRR1_SPI; SD.get[ii]=SD.temp; while((*(int*)SPCR1&0x00020000)==0); } } }
0
|
0 / 0 / 0
Регистрация: 07.02.2106
Сообщений: 270
|
|
18.11.2014, 17:31 | 18 |
![]() Есть интересные "ходы", обязательно запользую. Улыбнуло:
0
|
18.11.2014, 17:31 | |
Помогаю со студенческими работами здесь
18
STM32F407 помогите разобратся с тактированием/таймерами Помогите разобратся реестр ПоМогиТе разобратся Помогите разобратся с кодом. помогите разобратся с терминологией Помогите разобратся с ботами.. Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |