реклама на сайте
подробности

 
 
> Проблема форматирования MMC карты
srg_co
сообщение Apr 14 2008, 11:26
Сообщение #1


Частый гость
**

Группа: Свой
Сообщений: 131
Регистрация: 22-03-05
Из: Краснодар
Пользователь №: 3 600



Уважаемые коллеги ! Нужны Ваши рекомендации (помощь)!
Исходные данные: Keil ARM 3.20 + RL-FlashFS 3.21 + MCB2130 + MMC Transcend 512Mb + тестовый пример из Keil\ARM\Boards\Keil\MCB2140\RL\FlashFS – тестирование операций с Flash картами: чтение, запись, удаление форматирование и т.д. Проблема заключается в том, что операция форматирования нормально не выполняется, при попытке отформатировать, секунд через 10 обращение к карте прекращается и программа вешается. После перезапуска показывает содержимое карты:
File System Directory...
яяяяяяяя.яяя <DIR> 31.15.2107 31:58
<DIR> 31.15.2107 31:63
0 File(s) 0 bytes
2 Dir(s) 512.794.624 bytes free.

При просмотре карты через обычный карт-ридер – карта пустая. Исходный код примера и параметры проекта не менял (за исключение типа процессора с 2148 на 2138). Пытался понижать скорость SSP порта с помощью SSPCPSR – безрезультатно. Остальные операции выполняются нормально. Других Flash карт у меня нет. С чем может быть связана проблема форматирования карты ?
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов (1 - 9)
srg_co
сообщение Apr 17 2008, 19:52
Сообщение #2


Частый гость
**

Группа: Свой
Сообщений: 131
Регистрация: 22-03-05
Из: Краснодар
Пользователь №: 3 600



Исследование проблемы показало следующее: программа вываливается в DAbt_Handler при выполнении библиотечной функции mmc_write_block при выполнении команды LDRB R0,[R6,R4] по адресу 0х00007Е0С (http://www.keil.com/support/docs/3080.htm) выполнение строк:
/* Send also a 16-bit CRC. */
spi_send (0xFF);
spi_send (0xFF);
не происходит. Судя по содержимому R6 = 0x4c49454b – значение действительно бредовое, в плане адреса во всяком случае. Может у кого есть мысли по этому поводу ?

ЗЫ. В приложенном файле исходный код функции и дизассемблера.

Сообщение отредактировал srg_co - Apr 17 2008, 19:54
Эскизы прикрепленных изображений
Прикрепленное изображение
 

Прикрепленные файлы
Прикрепленный файл  quest.txt ( 3.45 килобайт ) Кол-во скачиваний: 114
 
Go to the top of the page
 
+Quote Post
aaarrr
сообщение Apr 17 2008, 20:23
Сообщение #3


Гуру
******

Группа: Свой
Сообщений: 10 713
Регистрация: 11-12-04
Пользователь №: 1 448



Нет, ломается здесь: spi_send(buf[index]);
Проверьте корректность установки параметра *buf при вызове mmc_write_block.
Go to the top of the page
 
+Quote Post
srg_co
сообщение Apr 17 2008, 21:05
Сообщение #4


Частый гость
**

Группа: Свой
Сообщений: 131
Регистрация: 22-03-05
Из: Краснодар
Пользователь №: 3 600



Но почему тогда операция записи 1965 секторов проходит нормально, а на последнем 1966 падает !?
Go to the top of the page
 
+Quote Post
aaarrr
сообщение Apr 17 2008, 21:11
Сообщение #5


Гуру
******

Группа: Свой
Сообщений: 10 713
Регистрация: 11-12-04
Пользователь №: 1 448



Кто же знает?

Сохраните в процедуре mmc_write_block параметр buf в какой-нибудь глобальной переменной сразу же после входа. Если после вылета в Data Abort значение переменной будет правильным, значит виноваты либо mmc_command или spi_send (что маловероятно), либо R6 портится каким-то прерыванием.
Go to the top of the page
 
+Quote Post
srg_co
сообщение Apr 18 2008, 16:19
Сообщение #6


Частый гость
**

Группа: Свой
Сообщений: 131
Регистрация: 22-03-05
Из: Краснодар
Пользователь №: 3 600



При входе mmc_write_block значение buf = 0х40000648 (похоже на правду) при сваливании 0x4C49454B (значение R6)
Go to the top of the page
 
+Quote Post
aaarrr
сообщение Apr 18 2008, 17:12
Сообщение #7


Гуру
******

Группа: Свой
Сообщений: 10 713
Регистрация: 11-12-04
Пользователь №: 1 448



Странно... Тогда остались те варианты, что я перечислил. Если сбой происходит всегда в одном и том же месте, добавьте программную ловушку и пройдитесь отладчиком.
Go to the top of the page
 
+Quote Post
srg_co
сообщение Apr 18 2008, 19:25
Сообщение #8


Частый гость
**

Группа: Свой
Сообщений: 131
Регистрация: 22-03-05
Из: Краснодар
Пользователь №: 3 600



Победил ! Проблема была не в библиотеке, а в вызове функции fformat()
В примере было так:

if (label == NULL) {
label = "KEIL";
}
printf ("\nFormat Flash Memory Card? [Y/N]\n");
retv = getkey();
if (retv == 'y' || retv == 'Y') {
/* Format the Card with Label "KEIL". "*/
if (fformat (label) == 0) {
printf ("Memory Card Formatted.\n");
printf ("Card Label is %s\n",label);
}
else {
printf ("Formatting failed.\n");
}
}

а должно быть так: fformat( "M:" )

Спасибо aaarrr за участие beer.gif
Go to the top of the page
 
+Quote Post
aaarrr
сообщение Apr 18 2008, 19:41
Сообщение #9


Гуру
******

Группа: Свой
Сообщений: 10 713
Регистрация: 11-12-04
Пользователь №: 1 448



Блин. Я и буковки-то смотрел, только слово KEIL составить не смог. Но каким образом он в R6 оказался?
Go to the top of the page
 
+Quote Post
srg_co
сообщение Apr 18 2008, 20:15
Сообщение #10


Частый гость
**

Группа: Свой
Сообщений: 131
Регистрация: 22-03-05
Из: Краснодар
Пользователь №: 3 600



Видимо из-за неправильно определения типа носителя. Еще там идет вызов fat_format (const char *label) из fformat (label) а параметр const char *label передается во write_label и является как раз меткой диска 05.gif
Go to the top of the page
 
+Quote Post

Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 21st July 2025 - 22:24
Рейтинг@Mail.ru


Страница сгенерированна за 0.01417 секунд с 7
ELECTRONIX ©2004-2016