srg_co
Apr 14 2008, 11:26
Уважаемые коллеги ! Нужны Ваши рекомендации (помощь)!
Исходные данные: 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 карт у меня нет. С чем может быть связана проблема форматирования карты ?
srg_co
Apr 17 2008, 19:52
Исследование проблемы показало следующее: программа вываливается в 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 – значение действительно бредовое, в плане адреса во всяком случае. Может у кого есть мысли по этому поводу ?
ЗЫ. В приложенном файле исходный код функции и дизассемблера.
aaarrr
Apr 17 2008, 20:23
Нет, ломается здесь: spi_send(buf[index]);
Проверьте корректность установки параметра *buf при вызове mmc_write_block.
srg_co
Apr 17 2008, 21:05
Но почему тогда операция записи 1965 секторов проходит нормально, а на последнем 1966 падает !?
aaarrr
Apr 17 2008, 21:11
Кто же знает?
Сохраните в процедуре mmc_write_block параметр buf в какой-нибудь глобальной переменной сразу же после входа. Если после вылета в Data Abort значение переменной будет правильным, значит виноваты либо mmc_command или spi_send (что маловероятно), либо R6 портится каким-то прерыванием.
srg_co
Apr 18 2008, 16:19
При входе mmc_write_block значение buf = 0х40000648 (похоже на правду) при сваливании 0x4C49454B (значение R6)
aaarrr
Apr 18 2008, 17:12
Странно... Тогда остались те варианты, что я перечислил. Если сбой происходит всегда в одном и том же месте, добавьте программную ловушку и пройдитесь отладчиком.
srg_co
Apr 18 2008, 19:25
Победил ! Проблема была не в библиотеке, а в вызове функции 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 за участие
aaarrr
Apr 18 2008, 19:41
Блин. Я и буковки-то смотрел, только слово KEIL составить не смог. Но каким образом он в R6 оказался?
srg_co
Apr 18 2008, 20:15
Видимо из-за неправильно определения типа носителя. Еще там идет вызов fat_format (const char *label) из fformat (label) а параметр const char *label передается во write_label и является как раз меткой диска
Для просмотра полной версии этой страницы, пожалуйста,
пройдите по ссылке.