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

 
 
> Ищу функции работы с SD картой, написанные для KEIL и SAM7
zheka
сообщение May 21 2010, 08:50
Сообщение #1


Гуру
******

Группа: Участник
Сообщений: 2 072
Регистрация: 14-01-06
Пользователь №: 13 164



Собираюсь использовать FatFS от Chan.
Как известно эта библиотека представляет собой функции FAT, а низкоуровневые операции с картой предлагает написать самим.
Все что я видел в интернете и на форуме - либо для IAR, либо для WinARM. Попытки подключить их в KEIL и адаптировать ни к чему не привели. Ошибки, которые возникают при компиляции никто внятно прокомментировать не смог.
Может быть кто делал проект на FatFS для KEIL ? Буду признателен.
Go to the top of the page
 
+Quote Post
2 страниц V   1 2 >  
Start new topic
Ответов (1 - 27)
aaarrr
сообщение May 21 2010, 09:03
Сообщение #2


Гуру
******

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



Цитата(zheka @ May 21 2010, 12:50) *
Ошибки, которые возникают при компиляции никто внятно прокомментировать не смог.

Нет, это вы не дали себе труда хоть немного разобраться. Боюсь, что даже с готовым решением будет то же самое.
Go to the top of the page
 
+Quote Post
zheka
сообщение May 21 2010, 09:17
Сообщение #3


Гуру
******

Группа: Участник
Сообщений: 2 072
Регистрация: 14-01-06
Пользователь №: 13 164



в проекте есть строка __ramfunc void timer0_c_irq_handler(void); ругается на __ramfunc. Что это я знаю, чем заменить это в KEIL - нигде информации не нашел.
Можете подсказать?
Go to the top of the page
 
+Quote Post
igorenja
сообщение May 21 2010, 09:24
Сообщение #4


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

Группа: Свой
Сообщений: 130
Регистрация: 8-08-08
Из: Новосибирск
Пользователь №: 39 488



Цитата(zheka @ May 21 2010, 16:17) *
в проекте есть строка __ramfunc void timer0_c_irq_handler(void); ругается на __ramfunc. Что это я знаю, чем заменить это в KEIL - нигде информации не нашел.
Можете подсказать?

вы свою ветку давно смотрели?
Go to the top of the page
 
+Quote Post
aaarrr
сообщение May 21 2010, 09:40
Сообщение #5


Гуру
******

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



Цитата(zheka @ May 21 2010, 13:17) *
в проекте есть строка __ramfunc void timer0_c_irq_handler(void); ругается на __ramfunc. Что это я знаю, чем заменить это в KEIL - нигде информации не нашел.
Можете подсказать?

Если знаете что это, то могу предложить два варианта замены:
1. #define __ramfunc /* Ничего, поживет и во флеши, нам проект пока собрать надо */
2. Перед timer0_c_irq_handler написать: #pragma arm section code = "ramfunc", после - #pragma arm section code
В области RAM scatter-файла добавить запись * (ramfunc)

Ну, минут 20 надо на чтение документации, не больше.

Цитата(igorenja @ May 21 2010, 13:24) *
вы свою ветку давно смотрели?

CARM давно упразднили.
Go to the top of the page
 
+Quote Post
igorenja
сообщение May 21 2010, 09:57
Сообщение #6


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

Группа: Свой
Сообщений: 130
Регистрация: 8-08-08
Из: Новосибирск
Пользователь №: 39 488



Цитата(aaarrr @ May 21 2010, 16:40) *
CARM давно упразднили.


Да... Я просто не читал что там biggrin.gif

Вот ещё:
Цитата
Take a look to the on-line file

C:\Keil\ARM\Hlp\RVI.CHM - Embedded Programs - Specific Memory Areas.

Example in:
C:\Keil\ARM\Examples\RAM_Function


взято отсюда
Go to the top of the page
 
+Quote Post
zheka
сообщение May 21 2010, 10:21
Сообщение #7


Гуру
******

Группа: Участник
Сообщений: 2 072
Регистрация: 14-01-06
Пользователь №: 13 164



Лады, сделал.
Ругается на __inline void AT91F_SSC_SetBaudrate (
Ругается так: "lib_AT91SAM7S64.h(52): error: #77-D: this declaration has no storage class or type specifier"

кто-то мне наоборот советовал inline заменить на __inline
Я сделал так же как с ramfunc. Компилируется. Но чем чревато отключение inline?

Вот только думаю, будет ли работать, когда доберусь до отладочной платы. Биботека MMC.c:
Код
static
void power_on (void)
{
    
//    PORTE &= ~0x80;                /* Socket power ON */
//    for (Timer1 = 3; Timer1; );    /* Wait for 30ms */
//    PORTB = 0b10110101;            /* Enable drivers */
//    DDRB  = 0b11000111;
//    SPCR = 0b01010000;            /* Initialize SPI port (Mode 0) */
//    SPSR = 0b00000001;
}


Скачал с этого форума. Автор утверждает, что код "на ходу".
Go to the top of the page
 
+Quote Post
aaarrr
сообщение May 21 2010, 10:42
Сообщение #8


Гуру
******

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



Цитата(zheka @ May 21 2010, 14:21) *
Ругается на __inline void AT91F_SSC_SetBaudrate (

Сдается мне, что с дефайнами в вашем проекте капитальный бардак.

P.S. Я бы советовал вообще выбросить всю lib_BLA-BLA-BLA вместе с ее безмозглым содержимым, но это на будущее.

Цитата(zheka @ May 21 2010, 14:21) *
Вот только думаю, будет ли работать, когда доберусь до отладочной платы.

На то он и код "с интернета", чтобы терзаться подобными сомнениями.
Go to the top of the page
 
+Quote Post
zheka
сообщение May 21 2010, 13:58
Сообщение #9


Гуру
******

Группа: Участник
Сообщений: 2 072
Регистрация: 14-01-06
Пользователь №: 13 164



а куда же без lib_bla-bla-bla? Без нее ругается.

в общем код - каша!
принес домой, все компилируется, подключаю библиотеку работы с LCD. Компилятор ругается на святая святых - stdio.h.
Go to the top of the page
 
+Quote Post
aaarrr
сообщение May 21 2010, 14:11
Сообщение #10


Гуру
******

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



Цитата(zheka @ May 21 2010, 17:58) *
а куда же без lib_bla-bla-bla? Без нее ругается.

Ее нехитрое содержимое лучше заменить на написанное руками и головой.

Цитата(zheka @ May 21 2010, 17:58) *
в общем код - каша!

Вот именно. И тут уже никто не поможет.
Go to the top of the page
 
+Quote Post
zheka
сообщение May 21 2010, 14:41
Сообщение #11


Гуру
******

Группа: Участник
Сообщений: 2 072
Регистрация: 14-01-06
Пользователь №: 13 164



Головой... это если с нуля самому.
А что делать если в отладочной плате olimex входы card_presence и card_write_protect это 15 и 25 пины, а в поставляемой производителем же библиотеке:
Код
  while(((m_pPio->PIO_PDSR) & BIT15)) { /*put your card present event here*/  }
  //WP - write protect
  while(((m_pPio->PIO_PDSR) & BIT16)) { /*put your write protect event here*/ }

имея исходные данные, в правильности которых уверен, было бы намного проще работать руками и думать головой.
Go to the top of the page
 
+Quote Post
aaarrr
сообщение May 21 2010, 15:34
Сообщение #12


Гуру
******

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



Цитата(zheka @ May 21 2010, 18:41) *
А что делать если в отладочной плате olimex...

Ответ очевиден: не брать исходные данные, в правильности которых не уверены. К неблагонадежному можно отнести 90+% кода, доступного бесплатно.
Go to the top of the page
 
+Quote Post
zheka
сообщение May 21 2010, 16:42
Сообщение #13


Гуру
******

Группа: Участник
Сообщений: 2 072
Регистрация: 14-01-06
Пользователь №: 13 164



Ошибку в olimex'совском примере исправил, предлагаемые функции запичи и чтения блоков работают. Но это не подходит для FatFS... Ковыряюсь дальше...

Так, решил еще раз штурмом взять пример c сайта elm.
Дошел вот до каких ошибок:
Код
#ifndef RTC_H_

#include <stdint.h>
#include <stdbool.h>

typedef struct {
    uint16_t year;    /* 1..4095 */
    uint8_t  month;    /* 1..12 */
    uint8_t  mday;    /* 1.. 31 */
    uint8_t  wday;    /* 0..6, Sunday = 0*/
    uint8_t  hour;    /* 0..23 */
    uint8_t  min;    /* 0..59 */
    uint8_t  sec;    /* 0..59 */
    uint8_t  dst;    /* 0 Winter, !=0 Summer */
} RTC_t;  //* ОШИБКА rtc.h(15): error:  #256: invalid redeclaration of type name "RTC_t" (declared at line 15)

int rtc_init(void);
bool rtc_gettime (RTC_t*);  // ОШИБКА rtc.h(18): error:  #147-D: declaration is incompatible with "bool rtc_gettime(RTC_t *)" (declared at line 18)
bool rtc_settime (const RTC_t*);     // ОШИБКА rtc.h(19): error:  #147-D: declaration is incompatible with "bool rtc_settime(const RTC_t *)" (declared at line 19)

#endif


Ну помогите же мне, я почти у цели!!

Сообщение отредактировал zheka - May 21 2010, 17:40
Go to the top of the page
 
+Quote Post
AHTOXA
сообщение May 21 2010, 18:51
Сообщение #14


фанат дивана
******

Группа: Свой
Сообщений: 3 387
Регистрация: 9-08-07
Из: Уфа
Пользователь №: 29 684



Цитата(zheka @ May 21 2010, 22:42) *
Дошел вот до каких ошибок:

"... Саня Дрозд дошел до буквы «И» в слове «передовую»." © Стругацкие, «Понедельник начинается в субботу».
Цитата
Ну помогите же мне, я почти у цели!!

Мне почему-то кажется, что если бы вы не тратили столько времени на написание вопрошающих постов, а просто сели и спокойно подумали, то уже давно бы во всём разобрались.


--------------------
Если бы я знал, что такое электричество...
Go to the top of the page
 
+Quote Post
ViKo
сообщение May 21 2010, 18:52
Сообщение #15


Универсальный солдатик
******

Группа: Модераторы
Сообщений: 8 634
Регистрация: 1-11-05
Из: Минск
Пользователь №: 10 362



Когда Вы пишете
Код
#ifndef RTC_H_

следующей строкой должно быть
Код
#define RTC_H_

чтобы содержимое данного файла не подключалось к проекту дважды
Go to the top of the page
 
+Quote Post
-=Женек=-
сообщение Jun 6 2010, 18:02
Сообщение #16


Знающий
****

Группа: Свой
Сообщений: 559
Регистрация: 6-09-06
Пользователь №: 20 131



Господа, а что нужно делать по окончании работы с картой при использовании этой библиотеки?
Не получается использовать эту библиотеку и что либо еще с SPI. Начал разбираться - у меня при вызове команды disk_initialize(0) появляется высокий уровень на MOSI и MISO. Причем наличие карты не обязательно. На CS низкий уровень и командой AT91C_BASE_PIOA->PIO_SODR=(1<<11); он не становится высоким.
Шайтан какой-то...

А ведь мне предстоит читать блок из файла и передавать его по SPI не отключая карту...
Go to the top of the page
 
+Quote Post
toweroff
сообщение Jun 9 2010, 16:15
Сообщение #17


Гуру
******

Группа: Свой
Сообщений: 2 957
Регистрация: 19-09-06
Из: Москва
Пользователь №: 20 514



Цитата(igorenja @ May 21 2010, 13:24) *
1. #define __ramfunc /* Ничего, поживет и во флеши, нам проект пока собрать надо */
2. Перед timer0_c_irq_handler написать: #pragma arm section code = "ramfunc", после - #pragma arm section code
В области RAM scatter-файла добавить запись * (ramfunc)

попробовал. Все компилится, функции в IRAM не размещаются...
Go to the top of the page
 
+Quote Post
Wano
сообщение Jun 17 2010, 09:52
Сообщение #18


Местный
***

Группа: Свой
Сообщений: 272
Регистрация: 3-06-06
Пользователь №: 17 737



Цитата(toweroff @ Jun 9 2010, 19:15) *
попробовал. Все компилится, функции в IRAM не размещаются...


Короче вывод такой(в кейле): сколько десятков раз на форуме про это спрашивали, так ничего путёвого и не сказали.
Походу выход один : Alt+F7 на файле, Code/Const в IRAM. Осилить премудрости scatter-а может и можно,но .... smile3046.gif
Go to the top of the page
 
+Quote Post
aaarrr
сообщение Jun 17 2010, 10:03
Сообщение #19


Гуру
******

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



Неправильный вывод. Много раз на форуме разъясняли, как пользоваться scatter'ом. Если что-то не получается, задайте конкретный вопрос и приложите свой скрипт и выдержки из кода.
А галочки оставьте халтурщикам.
Go to the top of the page
 
+Quote Post
Nikitoc
сообщение Jun 28 2010, 11:12
Сообщение #20


Местный
***

Группа: Validating
Сообщений: 207
Регистрация: 14-01-09
Из: Днепропетровск
Пользователь №: 43 367



To zheka: я "портировал" FatFs на at91sam7s256 месяца 3 назад. Это был экспериментальный проект. Со скачанным кодом я не разбирался, просто почитал описание основных процедур ну и добавил низкоуровневые ф-ции чтения-записи на SDшку. С 2Гб Kingston'ом все работало. Скорость там была, конечно, не ахти, но работало. Если хотите, могу скинуть Вам проектик в Keil'е. Там, конечно, неопрятно все, но при желании разобраться можно. Если, это интересно еще кому-нибудь, могу выложить архивчиком.

Сообщение отредактировал Nikitoc - Jun 28 2010, 11:12
Go to the top of the page
 
+Quote Post
sonycman
сообщение Jun 29 2010, 04:13
Сообщение #21


Любитель
*****

Группа: Свой
Сообщений: 1 864
Регистрация: 20-08-06
Из: Тольятти
Пользователь №: 19 695



Цитата(Nikitoc @ Jun 28 2010, 15:12) *
Скорость там была, конечно, не ахти, но работало.

А почему скорость "не ахти"?
В районе скольки КБ/сек?
FatFs вполне быстрая система, тем более на АРМе.
Go to the top of the page
 
+Quote Post
Nikitoc
сообщение Jun 29 2010, 07:46
Сообщение #22


Местный
***

Группа: Validating
Сообщений: 207
Регистрация: 14-01-09
Из: Днепропетровск
Пользователь №: 43 367



Цитата(sonycman @ Jun 29 2010, 07:13) *
А почему скорость "не ахти"?
В районе скольки КБ/сек?

Честно скажу - скорость не помню. Возможно, конечно, тестирование было не слишком объективным: я записывал через картридер файл, а во время тестирования ARM создавал на карточке еще один и копировал в него содержимое первого файла. Дело занимало несколько секунд, но я не помню размера файла-источника, чтобы даже примерно ответить, какая была скорость. Честно говоря, самому досадно. Когда понадобится применить это в каком-нибудь проекте придется заново разбираться cranky.gif
Помню, правда, что в значительной мере, скорость работы ограничивалась SD-картой (в частности, процессом чтения).
Go to the top of the page
 
+Quote Post
sonycman
сообщение Jun 29 2010, 10:05
Сообщение #23


Любитель
*****

Группа: Свой
Сообщений: 1 864
Регистрация: 20-08-06
Из: Тольятти
Пользователь №: 19 695



Хм, скорость чтения у SD карточек исчисляется мегабайтами в секунду.
Может быть, узким местом был интерфейс - например, SPI?
Go to the top of the page
 
+Quote Post
Nikitoc
сообщение Jun 29 2010, 10:41
Сообщение #24


Местный
***

Группа: Validating
Сообщений: 207
Регистрация: 14-01-09
Из: Днепропетровск
Пользователь №: 43 367



Цитата(sonycman @ Jun 29 2010, 13:05) *
Может быть, узким местом был интерфейс - например, SPI?

Возможно. Тактовая частота 25Мгц. Резисторы согласования (33 Ом) я не ставил. Наблюдалась такая странность: при потоковом чтении между считыванием секторов приходилось делать задержку ~100us (и это не ожидание 0xFE, а именно пауза без тактирования !). Иначе не читалось. Возможно это была особенность той карточки. При потоковой записи такого не наблюдалось.
Go to the top of the page
 
+Quote Post
sonycman
сообщение Jun 29 2010, 12:10
Сообщение #25


Любитель
*****

Группа: Свой
Сообщений: 1 864
Регистрация: 20-08-06
Из: Тольятти
Пользователь №: 19 695



Цитата(Nikitoc @ Jun 29 2010, 14:41) *
Возможно. Тактовая частота 25Мгц. Резисторы согласования (33 Ом) я не ставил. Наблюдалась такая странность: при потоковом чтении между считыванием секторов приходилось делать задержку ~100us (и это не ожидание 0xFE, а именно пауза без тактирования !). Иначе не читалось. Возможно это была особенность той карточки. При потоковой записи такого не наблюдалось.

Вполне возможно, что это нормально.
Карте надо время, чтобы подготовить данные.
Зато потом они идут практически сплошным потоком.

А в Вашем случае токен начала передачи 0xfe что, совсем отсутствовал без снятия клока?
Go to the top of the page
 
+Quote Post
Nikitoc
сообщение Jun 29 2010, 13:26
Сообщение #26


Местный
***

Группа: Validating
Сообщений: 207
Регистрация: 14-01-09
Из: Днепропетровск
Пользователь №: 43 367



Цитата(sonycman @ Jun 29 2010, 15:10) *
А в Вашем случае токен начала передачи 0xfe что, совсем отсутствовал без снятия клока?

Ну, точно не помню, конечно, но чтение зависало на первом же буфере (2048 байт) после первого или второго сектора, если не было паузы.
Цитата
Вполне возможно, что это нормально.
Карте надо время, чтобы подготовить данные.
Зато потом они идут практически сплошным потоком.

Это было бы классно, если бы можно было предугадать - когда нужна пауза, а когда нет.

Сообщение отредактировал Nikitoc - Jun 29 2010, 13:26
Go to the top of the page
 
+Quote Post
sonycman
сообщение Jun 29 2010, 18:00
Сообщение #27


Любитель
*****

Группа: Свой
Сообщений: 1 864
Регистрация: 20-08-06
Из: Тольятти
Пользователь №: 19 695



Цитата(Nikitoc @ Jun 29 2010, 17:26) *
Это было бы классно, если бы можно было предугадать - когда нужна пауза, а когда нет.

Согласно документации: Block Read Access Time 0.5 ms - 100 ms (max).

Алгоритм мультисекторного чтения простой:
1. Даём команду CMD18, через NCR (максимум 64 клока) получаем ответ.
2. Ждём токен 0xfe (он появится через 0.5 ms - 100 ms).
3. Читаем 512 байтный сектор.
4. переходим на п.2 пока не прочтём все сектора.
5. Прекращаем чтение командой CMD12.

Мне пришлось поработать всего с несколькими карточками, но проблем с тормозами не было - прямое мультисекторное чтение давало скорость в 1.4 мегабайта в сек. на 12 МГц (или 18 МГц - уже не помню) SPI.
Go to the top of the page
 
+Quote Post
Nikitoc
сообщение Jun 29 2010, 19:26
Сообщение #28


Местный
***

Группа: Validating
Сообщений: 207
Регистрация: 14-01-09
Из: Днепропетровск
Пользователь №: 43 367



Цитата(sonycman @ Jun 29 2010, 21:00) *
Согласно документации: Block Read Access Time 0.5 ms - 100 ms (max).
Алгоритм мультисекторного чтения простой:
1. Даём команду CMD18, через NCR (максимум 64 клока) получаем ответ.
2. Ждём токен 0xfe (он появится через 0.5 ms - 100 ms).
3. Читаем 512 байтный сектор.
4. переходим на п.2 пока не прочтём все сектора.
5. Прекращаем чтение командой CMD12.

Да я в общем-то так и делал, доходил до 4-го пункта без проблем, но если после него не прекращал тактирование на 100 мкс - дальше чтение не шло.
Go to the top of the page
 
+Quote Post

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

 


RSS Текстовая версия Сейчас: 20th July 2025 - 02:03
Рейтинг@Mail.ru


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