|
stm32f373 + flash(at25df081) + fatFs |
|
|
|
Mar 3 2016, 16:40
|
Группа: Участник
Сообщений: 13
Регистрация: 17-02-16
Пользователь №: 90 493

|
Цитата(hd44780 @ Mar 3 2016, 16:39)  Ну надо смотреть, что именно не нравится create_chain .. Хз. На SD-картах и USB флэшках я такого не видел. Вылетает в первом return 0, после того как в цикле побегает. Код ncl = scl; /* Start cluster */ for (;;) { ncl++; /* Next cluster */ if (ncl >= fs->n_fatent) { /* Wrap around */ ncl = 2; if (ncl > scl) return 0; /* No free cluster */ } cs = get_fat(fs, ncl); /* Get the cluster status */ if (cs == 0) break; /* Found a free cluster */ if (cs == 0xFFFFFFFF || cs == 1)/* An error occurred */ return cs; if (ncl == scl) return 0; /* No free cluster */ }
|
|
|
|
|
Mar 3 2016, 17:24
|

Профессионал
    
Группа: Свой
Сообщений: 1 202
Регистрация: 26-08-05
Из: Донецк, ДНР
Пользователь №: 7 980

|
Поглядел Ваш код diskio.c (работа отпустила  ) flash.readArray(realSector, count * 512, buff); flash.writeData(realSector + i * 256, sizeof(temp), temp); 1-й аргумент функций - что это? Выше Вы писали, что тестировали прослойку. Вы тестировали функции diskio.c?
--------------------
Чтобы возить такого пассажира, необходим лимузин другого класса. (с) Мария Эдуарда
|
|
|
|
|
Mar 3 2016, 17:46
|
Группа: Участник
Сообщений: 13
Регистрация: 17-02-16
Пользователь №: 90 493

|
Цитата(hd44780 @ Mar 3 2016, 20:24)  Поглядел Ваш код diskio.c (работа отпустила  ) flash.readArray(realSector, count * 512, buff); flash.writeData(realSector + i * 256, sizeof(temp), temp); 1-й аргумент функций - что это? Выше Вы писали, что тестировали прослойку. Вы тестировали функции diskio.c? Да, их тестировал disk_read(),disk_write() Это адрес начальный, откуда читать/писать
|
|
|
|
|
Mar 3 2016, 18:23
|
Участник

Группа: Участник
Сообщений: 63
Регистрация: 25-11-11
Пользователь №: 68 515

|
Цитата(vasilijvs @ Feb 17 2016, 17:15)  Добрый день, прошу помочь всех знатоков. ........ fResult = f_mount(&fatFs, "0", 1) ну как я вот подошел к этому 1) в Яндексе набираем "FAT32 MBR" "FAT32 boot record" "FAt32 описание"...изучаем структуры boot record, partition table и собственно самой FAT 2) форматируем в Windows флэшку,скачиваем программу посекторного чтения http://electronix.ru/forum/index.php?act=a...st&id=97074 (пост http://electronix.ru/forum/index.php?showt...1337) копируем на флэшку файлы,смотрим программой что куда записалось,анализируем цепочку FAT,в общем исследуем,что делает Windows с флэшкой 3) Пишем низкоуровневый драйвер,публикующий функции посекторного чтения-записи,читаем даташиты на микросхемы памяти,sd-card и прочее..кстати для эмуляции можно использовать ОЗУ микроконтроллера,сектора там организовать 4) ну и далее пристегиваем товарища Чэна(или Чана) ,если не удалось или лень,пишем свое детище на основе нюансов,изученных в п.2...так же поймете,как форматировать на любой размер Сложного ничего нет,надо просто включить мозг..
Сообщение отредактировал romas2010 - Mar 3 2016, 18:27
|
|
|
|
|
Mar 3 2016, 20:41
|
Группа: Участник
Сообщений: 13
Регистрация: 17-02-16
Пользователь №: 90 493

|
Цитата(romas2010 @ Mar 3 2016, 21:23)  ну как я вот подошел к этому 1) в Яндексе набираем "FAT32 MBR" "FAT32 boot record" "FAt32 описание"...изучаем структуры boot record, partition table и собственно самой FAT 2) форматируем в Windows флэшку,скачиваем программу посекторного чтения http://electronix.ru/forum/index.php?act=a...st&id=97074 (пост http://electronix.ru/forum/index.php?showt...1337) копируем на флэшку файлы,смотрим программой что куда записалось,анализируем цепочку FAT,в общем исследуем,что делает Windows с флэшкой 3) Пишем низкоуровневый драйвер,публикующий функции посекторного чтения-записи,читаем даташиты на микросхемы памяти,sd-card и прочее..кстати для эмуляции можно использовать ОЗУ микроконтроллера,сектора там организовать 4) ну и далее пристегиваем товарища Чэна(или Чана) ,если не удалось или лень,пишем свое детище на основе нюансов,изученных в п.2...так же поймете,как форматировать на любой размер Сложного ничего нет,надо просто включить мозг.. Да в том и дело, что всё уже проанализировал. Читается/пишется всё как надо. С f_mount вопрос решился, файл создается,а вот данные туда записать не получается
Сообщение отредактировал vasilijvs - Mar 3 2016, 20:42
|
|
|
|
|
Mar 4 2016, 08:11
|
Группа: Участник
Сообщений: 13
Регистрация: 17-02-16
Пользователь №: 90 493

|
Цитата(skripach @ Mar 4 2016, 02:04)  Вангую, запись блока затирает лишнее помимо того что нужно записать. Вот как все происходит. Чтение 3584 байт, которые после нужных нам 512. Стирание 4096. Запись оставшихся 3584 с начального адреса + 512. Код void Flash::eraseBlock512(uint32_t address) { uint8_t source[7 * 512]; readArray(address + 512, sizeof(source), source); eraseBlock(address, Block4k); uint8_t temp[256]; for(int i = 0; i < 14; ++i) { for(int j = 0; j < sizeof(temp); ++j) { temp[j] = source[i * 256 + j]; } writeData(address + 512 + i * 256, sizeof(temp), temp); } }
|
|
|
|
|
Mar 4 2016, 12:32
|
Группа: Участник
Сообщений: 13
Регистрация: 17-02-16
Пользователь №: 90 493

|
Цитата(aaarrr @ Mar 4 2016, 15:21)  А почему после, если 512 байт могут быть в середине блока 4k? Потому что указывается адрес стираемого блока, значит они начальные 512. А то что после,перезаписывается.
Сообщение отредактировал vasilijvs - Mar 4 2016, 12:34
|
|
|
|
|
Mar 10 2016, 14:15
|
Группа: Участник
Сообщений: 13
Регистрация: 17-02-16
Пользователь №: 90 493

|
Цитата(aaarrr @ Mar 4 2016, 15:44)  Нельзя просто взять и назначить начало блока 4k с какого попало адреса. Он должен быть выравнен по границе 4k. Спасибо большое! Всё заработало. Действительно проблема была в выравнивании границ стирания.
|
|
|
|
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|