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

STM32 SDIO в режиме опроса без SPL + FatFs

Всем доброго дня!

 

Пытаюсь соединить STM32F407 и SD-карту для работы с файловой системой посредством интерфейса SDIO.

Подключение стандартное. Detect пин на PH13. На всех пинах, кроме PC12 (SDIO_CK) включена встроенная подтяжка к питанию.

 

Работу с файловой системой должна взять на себя FatFs. С SDIO работаю вручную в 4-битном режиме (до инициализации в 1-битном).

Пробую записать файл: файловую систему библиотека определяет, файл создается, но информация в него не записывается.

Если сделать точку останова в функции записи блока (перед возвратом из функции), то информация все-таки записывается, но не более 1023 байт.

Размер блока - 512 байт. Если попытаться таким способом записать 1024 байта, то программа виснет на функции f_closе() и файл остается пустым.

Переделанный файл diskio.c в аттаче.

 

Запускаю так (main.c):

#include "stm32f4xx.h"
#include "main.h"
#include "ff.h"
#include "ffconf.h"

static inline void Init_All(void);

char buf[1024];

int main()
{
 for (int i = 0; i < 1024;) {
   buf[i++] = '1';
   buf[i++] = '2';
   buf[i++] = '3';
   buf[i++] = '4';
 }

 Init_All();

 FATFS FATFS_Obj;
 FIL file;
 UINT nWritten;
 volatile FRESULT res;

 res = f_mount(&FATFS_Obj, "0:", 1);

 res = f_open(&file, "Имя файла.txt", FA_CREATE_ALWAYS | FA_WRITE);

 res = f_write(&file, buf, 1023, &nWritten);

 res = f_close(&file);

 res = f_mount(NULL, "0:", 1);

 for (;;) {
   Background();
 }
}

static inline void Init_All(void)
{
 SysTick_Config(SystemCoreClock / 1000);
}

inline void Background(void)
{
 return;
}

void SysTick_Handler(void)
{
 extern void disk_timerproc(void);
 static uint8_t tick10 = 0;
 if (++tick10 == 10) {
   disk_timerproc();
   tick10 = 0;
 }
}

 

Буду благодарен за любую помощь! :rolleyes:

diskio.zip

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


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

Всем доброго дня!

 

Пытаюсь соединить STM32F407 и SD-карту для работы с файловой системой посредством интерфейса SDIO.

Подключение стандартное. Detect пин на PH13. На всех пинах, кроме PC12 (SDIO_CK) включена встроенная подтяжка к питанию.

 

Работу с файловой системой должна взять на себя FatFs. С SDIO работаю вручную в 4-битном режиме (до инициализации в 1-битном).

Пробую записать файл: файловую систему библиотека определяет, файл создается, но информация в него не записывается.

Если сделать точку останова в функции записи блока (перед возвратом из функции), то информация все-таки записывается, но не более 1023 байт.

Размер блока - 512 байт. Если попытаться таким способом записать 1024 байта, то программа виснет на функции f_closе() и файл остается пустым.

Переделанный файл diskio.c в аттаче.

 

Я посмотрел ваш код в аттаче. могу сказать следующее-вы просто запихнули данные в карту,а ведь надо карте еще и запрограммировать данные,поэтому нужно еще читать статус карты(cmd13 если мне память не изменяет)...более того,согласно описанию спецификации на карту,перед всеми операциями необходимо дождаться,пока карта не встанет в режим "transition state"

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

и еще нюанс-используйте DMA,причем не советую,а рекомендую это сделать. У STM несколько своеобразная периферия(касаемо не только SDIO),и когда я отлаживал пошагово свой проект,у меня постоянно было то rxoverrun,то txunderrun error.Аж до психов порой доходило..Сел,разобрался,пристегнул DMA,проблема исчезла...здесь у меня в аттаче немного проекта (keil 4.73)и спецификация на карту и программулина на винду,которя посекторно оперирует с дисками и покажет вам,что вы там туда понаписалиV6.ZIP если есть вопросы то email [email protected]

 

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


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

Еще раз посоветую посмотреть как я сделал - работающий проект тут https://188.134.5.254/browser/hfreceiver/trunk/sdcard.c - недостающее рядом в hardware.c

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


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

Всем доброго дня!!

Народ, делал ли кто нибудь подключение нескольких SD-карт на одну шину? Если да,то можно ли ногу CMD в контроллере SDIO STM32 сконфигурировать как OPEN_DRAIN (по типу I2C) или все-таки надо ставить внешний демультиплексор для "chip select"? ответы в стиле "возьми SSD+cortex A7" неприемлемы из-за технико-финансовых ограничений проекта...проект-типа многоканальный аудиорегистратор с хранением фраз в течении года

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


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

SDIO STM32 сконфигурировать как OPEN_DRAIN (по типу I2C) или все-таки надо ставить внешний демультиплексор для "chip select"

Зачем? Повесить на SPI и CS-ов - вагон без всяких open drain.

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


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

Зачем? Повесить на SPI и CS-ов - вагон без всяких open drain.

 

Тоже склоняюсь к этому мнению....Хоть и некоторым образом некошерно,но надежно...спасибо

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


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

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

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

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

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

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

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

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

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

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