Перейти к содержанию
    

STM32H743ZI + AT45DB161D

Всем доброго времени суток!

Раньше использовал LPC1778 + AT45DB161D. В Keil 4.5xx была библиотека FS_CM3.lib. С помощью нее можно было на флешке создавать файлы и работать с ними, как на жестком диске.

Было очень удобно.

Волею судеб перешел на STM32. В частности, использую проц.STM32H743ZI. Познакомился к HAL )).

К процу опять подключил внешнюю flash память - AT45DB161D.

Поставил IDE - Keil 5.24.

Изучил примеры, которые можно подкачать прямо из IDE.

Во всех примерах используется внешняя карта памяти. А при попытке использовать SPI память получаю следующую ошибку от компилятора:

"Initial Current ::File System:Drive is not enabled in FS_Config.c"

На сайте кейла есть мануал: https://www.keil.com/pack/doc/mw/FileSystem/html/fs_create_app.html

Если делать по нему, то по какой-то печали у меня не создается файл "RTE_Device.h". А при компиляции возникает та же ошибка.

Пробовал подобную манипуляцию с процом серии STM32F. В этом случае файл "RTE_Device.h" создается, но компиляция опять дает ошибку "Initial Current ::File System:Drive is not enabled in FS_Config.c"

Странно, в мануале есть явный намек на использование SPI флэши "AT45DB642D". 

Если кто сталкивался, подскажите пожалуйста где собака зарыта!

 

 

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

1 час назад, Metallist64 сказал:

 "Initial Current ::File System:Drive is not enabled in FS_Config.c"

На сайте кейла есть мануал: https://www.keil.com/pack/doc/mw/FileSystem/html/fs_create_app.html

Так там же явно написано

Цитата

If the Initial Current Drive is not configured correctly, the project will not build. The File System Component will flag this with an error message:

C:\Keil_v5\ARM\PACK\Keil\MDK-Middleware\7.0.0\FileSystem\Include\fs_config.h(178): error: #35:

#error directive: "Initial Current ::File System:Drive is not enabled"

#error "Initial Current ::File System:Drive is not enabled"

 

В это время, глядя на fs_config.h, видим

/* Check if initial drive is enabled */
#if ((FS_INITIAL_CDRIVE == 0) && (NOR0_ENABLE  == 0)) || \
    ((FS_INITIAL_CDRIVE == 1) && (NOR1_ENABLE  == 0)) || \
    ((FS_INITIAL_CDRIVE == 2) && (MC0_ENABLE   == 0)) || \
    ((FS_INITIAL_CDRIVE == 3) && (MC1_ENABLE   == 0)) || \
    ((FS_INITIAL_CDRIVE == 4) && (NAND0_ENABLE == 0)) || \
    ((FS_INITIAL_CDRIVE == 5) && (NAND1_ENABLE == 0)) || \
    ((FS_INITIAL_CDRIVE == 6) && (RAM0_ENABLE  == 0)) || \
    ((FS_INITIAL_CDRIVE == 7) && (USB0_ENABLE  == 0)) || \
    ((FS_INITIAL_CDRIVE == 8) && (USB1_ENABLE  == 0))
  #error "Initial Current ::File System:Drive is not enabled in FS_Config.c"
#endif

что говорит о том, что эти самые настройки каким-то образом не экспортировались при создании проекта.

Вам двигаться в этом направлении - разбираться, почему так: собрать же проект с нуля без всяких кодогенераторов/калокубов предлагать, видимо, не стоит.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Спасибо за подсказку. Собрал проект с нуля. 

Действительно, кое-что изменилось. При компиляции теперь появляется ошибка:

 

 

.\Objects\1.axf: Error: L6218E: Undefined symbol Driver_SPI0 (referred from at45db641e.o).

Перерыл весь проект, в RTE вроде все драйвера подключены. 

Проект выложить не могу. Он весит почти 100 Мб.

Не совсем понятное, что такое Driver_SPI0, в файлах эта сущность вроде есть, а факту нет )).

Проясните пожалуйста ситуацию.

 

 

 

 

 

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

21 hours ago, x893 said:

Загрузите на bitbucket/github и опубликуйте ссылку.

Здравствуйте, загрузил проект. 

git clone https://[email protected]/Metallist_64/flash.git

Среда Keil5.24. Возможно придется подгрузить паки. Но, скорее всего, среда сама знает, что нужно. Если что-то не срастется, могу сказать какие паки устанавливал.

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Написано же зеленым по белому

    #define DRIVER_SPI_NUM     #
    Replace symbol # with any integer to customize the number of SPI driver
    (i.e. Driver_SPI#) used to communicate with Flash device.
    Default setting is 0.


Добавте в Option for Target -> C/C++

Define:

DRIVER_SPI_NUM=1

и будет счастье (особенно при наличии исходников).

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

17 hours ago, x893 said:

и будет счастье (особенно при наличии исходников).

 

Большое спасибо за помощь!

Насколько я понял, DRIVER_SPI_NUM=1 указывает номер SPI интерфейса. Т.е. для SPI интерфейса №4 надо указать DRIVER_SPI_NUM=4. 

Компиляция проходит успешно. Но дальше опять ступор.

if (finit ("F0:") == fsOK)

Здесь все хорошо, драйвер инициализируется.

	if (fcheck ("F0:") == fsAccessDenied )
	{
		while(0);
	}

А далее  fcheck("F0:") возвращает ошибку fsAccessDenied. Что означает "Resource access denied". В документе, такого состояния не должно возвращаться.

http://www.keil.com/pack/doc/MW/FileSystem/html/group__utility__routines.html

Немного копнув нашел драйвере AT45DB641E.c Есть следующие функции:
 

static int32_t Initialize (ARM_Flash_SignalEvent_t cb_event) 

static bool SendCommand (uint8_t cmd, uint32_t addr, const uint8_t *data, uint32_t size) 

static int32_t ReadData (uint32_t addr, void *data, uint32_t cnt)
...

При отладке успешно вызывается функция Initialize(). 

Но остальные функции не вызываются.  

Подскажите пожалуйста, куда можно копнуть?

P.S. Подключил библиотеку для отладки FS_Dbg_lfn_cm3.lib. В файле FS_Debug.c отметил все пункты Errors+API. Но ничего не происходит. В функции fcheck()  и finit() зайти не получается , они просто выполняются и происходит переход к следующей строке. 

Кто знаком с подобной ситуацией, подскажите пожалуйста как это должно работать?

 

 

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Отладчик в руки и копать. Ещё есть метод пристального вглядывания, но он медленнее.

Я вообще всё это увидел после git clone с bitbucket. 15 минут заняло Driver_SPI0.

Остальное ну ещё часа два максимум. Там же ничего (НИЧЕГО Карл) секретного нет.

Все буквы в наличии. Хотя даже если бы и lib были - тоже ничего страшного.

IDA есть, OZONE и т.п.

Был бы H7 и AT45 можно было бы за Вас кнопки подавить, но не судьба.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

1 hour ago, x893 said:

Отладчик в руки и копать.

Там же ничего (НИЧЕГО Карл) секретного нет.

Стараюсь, копаю...

Как бы мне в этот fcheck ()  зайти и посмотреть что внутри происходит. Понять, откуда так сказать, ноги растут.  А ту сразу бац и fsAccessDenied.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Уважаемые знатоки, может у кого есть проект для Keil 5 с поддержкой SPI - флэшек ?

Никак не могу заставить обращаться драйвер к AT45DB641E.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

10 hours ago, Metallist64 said:

Стараюсь, копаю...

Как бы мне в этот fcheck ()  зайти и посмотреть что внутри происходит. Понять, откуда так сказать, ноги растут.  А ту сразу бац и fsAccessDenied.

Нажать правую кнопку и выбрать Go To Definitions. Или в отладчике F11

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Так и делаю. После нажатия F11 переходит к следующей строке, в функцию не заходит. Это видимо библиотечная функция, внутренности закрыты. 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Всем привет!

Потихоньку продвигаюсь в решении вопроса.

Для нормальной работы необходимо выполнить запуск следующих функций.

  

stat = finit ("F0:");
stat = fmount ("F0:");
stat =  fcheck("F0:");

Но теперь возникла загвоздка с форматированием.

stat = fformat("F0:","");

Форматирование завершается через 3 сек. С ошибкой fsMediaError (0x09).

Нормальное время ChipErease для AT45DB161D ~ 30 sec.

Фокус заключается в том, что команда на форматирование отправляется.
И начинаются попытки чтения статусного регистра.
Но затем попытки чтения статуса прекращаются. И выдается ошибка fsMediaError. 
Может таймер какой-то срабатывает?

 

P.S. При снижении частоты SPI (~ 100кГц). функция fcheck() возвращает ошибку: 0x08 (fsDriverError)

Буду признателен за любую информацию по данным вопросам.

 

Изменено пользователем Metallist64

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Всем привет!

Достиг определенного успеха в работе с EFS.

Оказалось, для AT45DB161D лучше использовать шаблон от AT45DB642D.с

А так пришлось поправить функцию ReadData (); Нужно было посылать 4 пустых байта, а не два.
В даташите есть такой момент: 

To perform a continuous read from the standard DataFlash page
size (528 bytes), an opcode of E8H must be clocked into the device followed by three address
bytes (which comprise the 24-bit page and byte address sequence) and 4 don’t care bytes.



В шаблоне AT45DB642D.с этот нюанс учтен.

А format("F0:","") нормально пока не заработал. 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...