Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: FatFS + LPC2148 + KEIL
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > ARM
MaxEngee
Добрый день
Хочу освоить работу с FAT16/32 для SD.

Пробовал RTL Flash File System от Keil - показалась полным г...ом
Мучал пример, все вроде как работает, но через раз. С директориями не работает.

Хочу портировать fatFS на SSP1 LPC2148, работаю в KEIL.
Нашел порт fatFS на SSP1 LPC2148 для IAR, думал переделать, но уж очень много гемора и не совместимостей (название регистров, битовый поля, да и с синтаксис не нравиться)

Может у кого есть или где видел порт именно для keil
Vladimir_T
uCOS-FS может подойти...
prottoss
Цитата(MaxEngee @ Dec 12 2008, 17:39) *
Хочу портировать fatFS на SSP1 LPC2148, работаю в KEIL. Нашел порт fatFS на SSP1 LPC2148 для IAR, думал переделать, но уж очень много гемора и не совместимостей (название регистров, битовый поля, да и с синтаксис не нравиться)
Может у кого есть или где видел порт именно для keil
Какой порт??? FatFS, если имеется ввиду файловая система от ChaN, написана на чистейшем Си. Ни какого порта не надо. Единственное, нужно написать операции записи-чтения секторов для используемого носителя... Задача относительно простая.
sonycman
А хоть одна из доступных файловых систем поддерживает длинные имена?
А то что-то стрёмно наблюдать список файлов в формате 8.3...
Сергей Борщ
Цитата(sonycman @ Dec 13 2008, 16:56) *
А хоть одна из доступных файловых систем поддерживает длинные имена?
Там какая-то борьбическая борьба с микрософтом. Вроде как длинные имена поверх FAT запатентованы и микрософт хочет за них денюжку. Но это обрывки моих воспоминаний - где-то читал в интернете. Может у того же Чана.

P.S. Ага, точно у него:
Цитата
Long file name
There is an extended feature to handle long file name (LFN) up to 255 characters in addition to 8.3 format file name on the FAT file system. To support this feature, 512 byte string buffer for file name and Unicode - Local code mutual conversion table which occupies 256KB is required. Therefore memory consumption of code and work area will be increased drastically. The FatFs module currently does not support this feature. The LFN on the FAT file system is a patent of Microsoft. When use it on the commercial products, you have to be licensed.
sonycman
Цитата
and Unicode - Local code mutual conversion table which occupies 256KB is required.

А-а-а! angry.gif
Держите меня семеро - 256 килобайт только для поддержки длинных имён???
OMFG!
Без ARM9 соваться нечего... придётся пока распрощаться с этой затеей sad.gif
Qwertty
Цитата(sonycman @ Dec 13 2008, 23:34) *
А-а-а! angry.gif
Держите меня семеро - 256 килобайт только для поддержки длинных имён???
OMFG!
Без ARM9 соваться нечего... придётся пока распрощаться с этой затеей sad.gif

Зачем 256 килобайт знает только сам Чан. А остальные пользуются LFN даже на мегах с 2Кб ОЗУ и 32 флеши. Правда Read only.
zltigo
Цитата(Qwertty @ Dec 14 2008, 04:39) *
А остальные пользуются LFN даже на мегах с 2Кб ОЗУ и 32 флеши.

Прелестно, только вот как у них там, например, с такими именами "文件系统描述"
sonycman
Цитата(Qwertty @ Dec 14 2008, 05:39) *
Зачем 256 килобайт знает только сам Чан. А остальные пользуются LFN даже на мегах с 2Кб ОЗУ и 32 флеши. Правда Read only.

В смысле, это с поддержкой только кириллицы и латиницы?
А можно пример подобной реализации?
bigarmer
You can try the uC/FS from Micruim, it supports IAR and Keil MDK compiler!
Qwertty
Цитата(sonycman @ Dec 14 2008, 13:28) *
В смысле, это с поддержкой только кириллицы и латиницы?
А можно пример подобной реализации?

http://delanet.ru/content/view/438/46/
Исходники внизу страницы. Я глубоко не вникал, но там однозначно обрабатываются цепочки LFN.
Вот тут - http://www.robs-projects.com/filelib.html еще библиотека. Эта вроде даже писать умеет.
sonycman
Цитата(bigarmer @ Dec 14 2008, 18:48) *
You can try the uC/FS from Micruim, it supports IAR and Keil MDK compiler!

But where to get it`s sources?

Цитата(Qwertty @ Dec 14 2008, 19:35) *
http://delanet.ru/content/view/438/46/
Исходники внизу страницы. Я глубоко не вникал, но там однозначно обрабатываются цепочки LFN.
Вот тут - http://www.robs-projects.com/filelib.html еще библиотека. Эта вроде даже писать умеет.

Ого, спасибо. Интересные странички. Буду изучать smile.gif

ЗЫ:Вообще хотелось бы сделать так: ARM с MMC картой, при подключении к ПК - mass storage device (или свой софт на HID) для записи на диск. Всё остальное время - самостоятельное устройство с произвольным доступом к диску...
bigarmer
to sonycman,

Please refer to,
http://www.micrium.com/nxp/LPC21xx.html#fsports
MaxEngee
Всем большое спасибо за ценные советы smile.gif


Цитата(prottoss @ Dec 13 2008, 16:14) *
Какой порт??? FatFS, если имеется ввиду файловая система от ChaN, написана на чистейшем Си. Ни какого порта не надо. Единственное, нужно написать операции записи-чтения секторов для используемого носителя... Задача относительно простая.


На сколько я знаю портирование чего либо - переписывание низкоуровневых функций, работающих с конкретным железом + переопределние типов (если надо) + мелкие исправления синтаксиса

В FAtFS требуется переписать:
disk_ioctl
disk_write
disk_read
disk_status
disk_initialize

В ff004b IAR.zip - mmc.c и mmc_ll_SPI1.c - не считаю что это просто.

К тому же я обратился сюда в надежде что есть готовый порт и мне не потребуется несколько дней тратить (как повезет) на переработку
Все спасибо за внимание


Да особое спасибо bigarmer-у за пустую ссылку http://www.micrium.com/nxp/LPC21xx.html#fsports
Kompot
Цитата(sonycman @ Dec 14 2008, 20:51) *
But where to get it`s sources?
Ого, спасибо. Интересные странички. Буду изучать smile.gif

ЗЫ:Вообще хотелось бы сделать так: ARM с MMC картой, при подключении к ПК - mass storage device (или свой софт на HID) для записи на диск. Всё остальное время - самостоятельное устройство с произвольным доступом к диску...



Дык все уже украдено до нас...

http://www.sparkfun.com/commerce/product_i...roducts_id=8627

Как раз то, что Вам хотелось. Работает. С исходниками.
bigarmer
You need to register for downloading the source code.
MaxEngee
Может кто скажет почему кейл ругаеться на определение типа (iar - ok):

/* Boolean type */
typedef enum { FALSE = 0, TRUE } BOOL;


fatFS\integer.h(27): error: #40: expected an identifier
fatFS\integer.h(27): error: #40: expected an identifier
aaarrr
Цитата(MaxEngee @ Dec 15 2008, 13:06) *
Может кто скажет почему кейл ругаеться на определение типа (iar - ok):

Потому что TRUE и/или FALSE где-то уже заданы через #define.
MaxEngee
на счет TRUE и/или FALSE #define - точно!!! Спасибо

Может знаете что за функция в IAR - SYS_GetFpclk()??? И что она возвращает?
Сергей Борщ
Цитата(MaxEngee @ Dec 15 2008, 12:26) *
Может знаете что за функция в IAR - SYS_GetFpclk()??? И что она возвращает?
Даю 99.99%, что в ИАРе такой функции нет. Скорее всего что-то из сторонних библиотек для LPC. А поиск по файлам исходников ничего не дает? Судя по названию - возвращает частоту, на которую настроен pclk в LPC.
MaxEngee
07.gif
Блин
точно, извеняюсь, поспешил с вопросом.
Действительно есть еще одна библиотечка с общими определениями и настройками.
sonycman
Цитата(Kompot @ Dec 15 2008, 14:05) *
Дык все уже украдено до нас...

http://www.sparkfun.com/commerce/product_i...roducts_id=8627

Как раз то, что Вам хотелось. Работает. С исходниками.

Спасибо! beer.gif

Цитата(bigarmer @ Dec 15 2008, 14:05) *
You need to register for downloading the source code.

There are no downloads under "µC/FS ports" available... even if logged in... crying.gif
MaxEngee
Всем спасибо за посильную помощь.

Сделал все сам. В ИАРе конечно намного лучше с битовыми полями работать:
//1 while(!SSPSR_bit.RNE); IAR
while(!(SSPSR & 0x4)); KEYL
или
//1 PINSEL1_bit.P0_17 = PINSEL1_bit.P0_18 = PINSEL1_bit.P0_19 = 2;
PINSEL1 |= 2<<2;
PINSEL1 |= 2<<4;
PINSEL1 |= 2<<6;

Может можно хедеры ИАРа в кейле использовать?

Несколько различий компиляторов:
11111111111111111111111111111
#define KHZ *1000l
int freq=15KHZ; //для иара - 15 000

Кейл воспринимает только через пробел
int freq=15KHZ; //для кейла - 15
int freq=15 KHZ; //для кейла - 15 000

222222222222222222222222222222222
На следующую запись Кейл ругаеться
208 for (Int32U Busy = 0, i = Twr; i && (Busy != 0xFF); --i)

fatFS\mmc.c(208): error: #254: type name is not allowed
fatFS\mmc.c(208): error: #65: expected a ";"
fatFS\mmc.c(208): error: #20: identifier "Busy" is undefined

Переправил на
Int32U Busy;
for (Busy = 0, i = Twr; i && (Busy != 0xFF); --i)
Hermes
А это сможет работать в IAR на lpc2478 ???
Сергей Борщ
Цитата(MaxEngee @ Dec 16 2008, 12:56) *
//1 while(!SSPSR_bit.RNE); IAR
while(!(SSPSR & 0x4)); KEYL
Раскритикую нафиг. "Магические цифры" вроде этой 0x4 - великое зло. Наверняка у кейла в заголовочном файле есть описание бита RNE. Или как #define RNE (1<<4) или как #define RNE 4.
В таком случае эта запись должна выглядить либо while(!(SSPSR & RNE)) либо while(!(SSPSR & (1 < RNE))). Иначе уже через пару дней вы полезете копать user manual чтобы понять, какой же бит эта четверка означает.
Цитата(MaxEngee @ Dec 16 2008, 12:56) *
//1 PINSEL1_bit.P0_17 = PINSEL1_bit.P0_18 = PINSEL1_bit.P0_19 = 2;
PINSEL1 |= 2<<2;
PINSEL1 |= 2<<4;
PINSEL1 |= 2<<6;
PINSEL1 объявлен как volatile. Оба этих варианта приводят к совершенно лишним чтениям PINSEL1, а первая еще и к наложению масок (один из минусов объявления регистров как битовых структур). PINSEL1 |= (2<<1*2) | (2<<2*2) | (2<<3*2); Или сразу вынести в глобальную инициализацию и прописать сразу весь регистр через '=' (в ущерб модульности).
Цитата(MaxEngee @ Dec 16 2008, 12:56) *
Может можно хедеры ИАРа в кейле использовать?
Можно, но полагаю у кейла заголовочные файлы не хуже.
Цитата(MaxEngee @ Dec 16 2008, 12:56) *
#define KHZ *1000l
int freq=15KHZ; //для иара - 15 000

Кейл воспринимает только через пробел
int freq=15KHZ; //для кейла - 15
int freq=15 KHZ; //для кейла - 15 000
Очень, очень странно. 15KHZ - единый токен, подстановки быть не должно. Оба должны были выдать ошибку. gcc поступает правильно:
Цитата
invalid suffix "KHZ" on integer constant
Цитата(MaxEngee @ Dec 16 2008, 12:56) *
На следующую запись Кейл ругаеться
208 for (Int32U Busy = 0, i = Twr; i && (Busy != 0xFF); --i)
Это С99, возможно Кейл поддерживает только С89. Ненаказуемо.
aaarrr
Цитата(Сергей Борщ @ Dec 16 2008, 14:49) *
Это С99, возможно Кейл поддерживает только С89. Ненаказуемо.

Keil частично поддерживает C99. Впрочем, все документировано.
Hermes
Меня походу проигнорировали...
это сможет работать на lpc-2478 ?
кто-нить может поделиться исходниками ? - буду очень признателен!
Сергей Борщ
Цитата(Hermes @ Dec 16 2008, 19:58) *
Меня походу проигнорировали...
Или просто не знают ответ.
Цитата(Hermes @ Dec 16 2008, 19:58) *
это сможет работать на lpc-2478 ?
За это время можно было просмотреть исходник на предмет используемой периферии, открыть два юзер мануала и сравнить описание этой периферии.
MaxEngee
Цитата(Hermes @ Dec 16 2008, 15:41) *
А это сможет работать в IAR на lpc2478 ???


Слабо понятно что значит "это".
Если вы имеете ввиду портированный FatFS - ff004b IAR.zip, и сможет ли он работать на lpc2478 --> Ответ НЕТ, Так как в ff004b IAR.zip низкоуровневые функции написаны для модуля SSP LPC2148.

Цитата(Сергей Борщ @ Dec 16 2008, 15:49) *
Можно, но полагаю у кейла заголовочные файлы не хуже.

По поводу хедеров в Кейле. Там только определенны адреса регистров(что очень не удобно):
/***********************************************************************/
/* This file is part of the uVision/ARM development tools */
/* Copyright KEIL ELEKTRONIK GmbH 2002-2005 */
/***********************************************************************/
/* */
/* LPC214X.H: Header file for Philips LPC2141/42/44/46/48 */
/* */
/***********************************************************************/

#ifndef __LPC214x_H
#define __LPC214x_H

/* Vectored Interrupt Controller (VIC) */
#define VICIRQStatus (*((volatile unsigned long *) 0xFFFFF000))
#define VICFIQStatus (*((volatile unsigned long *) 0xFFFFF004))
#define VICRawIntr (*((volatile unsigned long *) 0xFFFFF008))
#define VICIntSelect (*((volatile unsigned long *) 0xFFFFF00C))
#define VICIntEnable (*((volatile unsigned long *) 0xFFFFF010))
#define VICIntEnClr (*((volatile unsigned long *) 0xFFFFF014))
Hermes
Цитата(Сергей Борщ @ Dec 17 2008, 00:07) *
Или просто не знают ответ. За это время можно было просмотреть исходник на предмет используемой периферии, открыть два юзер мануала и сравнить описание этой периферии.

Т.е. просто переопределить адреса регистров?
простите за возможно глупые вопросы...
sonycman
Цитата(Hermes @ Dec 17 2008, 17:25) *
Т.е. просто переопределить адреса регистров?
простите за возможно глупые вопросы...

Переписать функции по работе с периферией. Возможно, просто переопределить регистры, а может и полностью переписать - зависит от отличий в железе...
Hermes
сегодня вечером попробую переопределить регистры... будем надеяться прокатит... если что буду еще спрашивать.... я пока что новичок....
Спасибо за ваши ответы!
Сергей Борщ
Цитата(Hermes @ Dec 17 2008, 15:25) *
Т.е. просто переопределить адреса регистров?
Адреса прописаны в заголовочном файле. Если модуль периферии один и тот же, то адреса переопределятся автоматически. А вот если модули разные, то надо будет переписать все функции, использующие эти модули. Поскольку в FatFS все функции работы с периферией отделены от собственно файловой системы в отдельные файлы, найти их несложно после чтения документации.
Ivan Kuznetzov
Всем привет! Нашел тут проект с ФатФс для Keil + GNU компилятор (проект под LPC2148). Попробывал его переделать под родной кейловский компилятор, инлайны заменил на __inline, вроде все скомпилилось, в дебаггере смотрю (окно VIC) - прерывания от Таймера0 и УАРТ регистрируются, но в уарт ничего не пишет. Стартап файл создал новый с помощью граф. редактора (все по Тревору) - вроде все норм, но в терминале прога ничего не пишет...
Сергей Борщ
Цитата(Ivan Kuznetzov @ Jul 27 2009, 15:10) *
в дебаггере смотрю (окно VIC)
Закройте это окно. Чтение регистров VIC дебаггером с точки зрения ядра - то же самое, что и чтение процессором. А чтение некоторых регистров VIC приводит к изменению их содержимого (например, VICVectAddr). Подробнее - в описании VIC.
Ivan Kuznetzov
Походу дело в функции IrqEnable(); коорая в случае GCC компилятора объявлена в asmfunc.s файле как:
Код
.equ SWI_IRQ_EN,    1

IrqEnable:
    SWI    SWI_IRQ_EN
    BX    LR


Вставляю это в свой проект - не пашет ... crying.gif
aaarrr
Цитата(Ivan Kuznetzov @ Jul 27 2009, 17:55) *
Вставляю это в свой проект - не пашет ... crying.gif

Теперь задайте себе вопрос, есть ли в проекте обработка SWI, и если есть, обрабатывается ли должным образом такой запрос на включение прерываний.

P.S. Если процессор находится в привилегированном режиме, можно просто воспользоваться intrinsic-функцией __enable_irq().
Ivan Kuznetzov
Все равно не робит... видимо есть еще какие-то различия в asmfunc.s и startup.s у проекта с кейловским компилятором... Прилагаю рабочий проект для связки Keil + GNU компилятор (Sourcery G++) Мож кто посмотрит разницу, пожалуйста, а? crying.gif
aaarrr
Цитата(Ivan Kuznetzov @ Jul 27 2009, 19:24) *
Все равно не робит...

Дык а сделали то что? Или нужно угадать по рабочему проекту для GCC, почему он не работает у Вас под RV?
Ivan Kuznetzov
Цитата(aaarrr @ Jul 27 2009, 20:39) *
Дык а сделали то что? Или нужно угадать по рабочему проекту для GCC, почему он не работает у Вас под RV?

Прпробывал вместо IrqEnable() вписать __enable_irq(). Прерывания от Uart0 и Timer0 в VIC регистрируются - а в терминале по-прежнему ничего нету...
SPACUM
Переделываю для LPC2478 на Кроссстудии, похоже все ассемблерные программы работают криво. Надо их полностью переписывать.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.