Пытаюсь соединить 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;
}
}
#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;
}
}
Буду благодарен за любую помощь!
