Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: STM32 SDIO в режиме опроса без SPL + FatFs
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > ARM
Влад Р.
Всем доброго дня!

Пытаюсь соединить STM32F407 и SD-карту для работы с файловой системой посредством интерфейса SDIO.
Подключение стандартное. Detect пин на PH13. На всех пинах, кроме PC12 (SDIO_CK) включена встроенная подтяжка к питанию.

Работу с файловой системой должна взять на себя FatFs. С SDIO работаю вручную в 4-битном режиме (до инициализации в 1-битном).
Пробую записать файл: файловую систему библиотека определяет, файл создается, но информация в него не записывается.
Если сделать точку останова в функции записи блока (перед возвратом из функции), то информация все-таки записывается, но не более 1023 байт.
Размер блока - 512 байт. Если попытаться таким способом записать 1024 байта, то программа виснет на функции f_closе() и файл остается пустым.
Переделанный файл diskio.c в аттаче.

Запускаю так (main.c):
CODE
#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.gif
romas2010
Цитата(Влад Р. @ Oct 27 2015, 14:51) *
Всем доброго дня!

Пытаюсь соединить 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)и спецификация на карту и программулина на винду,которя посекторно оперирует с дисками и покажет вам,что вы там туда понаписалиНажмите для просмотра прикрепленного файла если есть вопросы то email vch47062@mail.ru
Genadi Zawidowski
Еще раз посоветую посмотреть как я сделал - работающий проект тут https://188.134.5.254/browser/hfreceiver/trunk/sdcard.c - недостающее рядом в hardware.c
romas2010
Всем доброго дня!!
Народ, делал ли кто нибудь подключение нескольких SD-карт на одну шину? Если да,то можно ли ногу CMD в контроллере SDIO STM32 сконфигурировать как OPEN_DRAIN (по типу I2C) или все-таки надо ставить внешний демультиплексор для "chip select"? ответы в стиле "возьми SSD+cortex A7" неприемлемы из-за технико-финансовых ограничений проекта...проект-типа многоканальный аудиорегистратор с хранением фраз в течении года
jcxz
Цитата(romas2010 @ Apr 23 2017, 14:26) *
SDIO STM32 сконфигурировать как OPEN_DRAIN (по типу I2C) или все-таки надо ставить внешний демультиплексор для "chip select"

Зачем? Повесить на SPI и CS-ов - вагон без всяких open drain.
romas2010
Цитата(jcxz @ Apr 24 2017, 16:13) *
Зачем? Повесить на SPI и CS-ов - вагон без всяких open drain.


Тоже склоняюсь к этому мнению....Хоть и некоторым образом некошерно,но надежно...спасибо
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.