@jebo Если HAL'овский вариант функционирует, можно посмотреть там пошагово под отладчиком, какие регистры участвуют.
@aveal Я пытался смотреть по программе (что там командами включают) и переделать на CMSIS, но у меня не получилось. Думал тут кто-нибудь на опыте подскажет.
Попробую сделать как вы сказали, раз никто с таким не сталкивался.
Доброго времени суток. Пробовал разобраться с записью данных на microSD карту с stm32. У меня плата с установленным слотом microSD (проц - stm32f407zgt6). Брал исходник с этого же сайта. Но почему-то не работает. Пытался смотреть под отладчиком и вижу что в if не заходит, потому что возвращается значение FR_EXIST, вместо FR_OK. Карта форматирована в fat32 и там ничего нет, кроме system volume. Подскажите в чем может быть дело?
@jebo Доброго, а внутри f_mount() что происходит? Она FR_EXIST вообще по спецификации не должна возвращать, если там ST не накрутили что-то свое конечно.
@aveal, там черт ногу сломит. Я не понимаю что они там делают. В большей части функции значение - FR_EXIST. Потом там что-то типа форсированного маунта и возвращается значение - FR_DISK_ERR. Но когда я возвращаюсь в main, то значение res показывает - FR_EXIST. На флешке пусто, но оно и понятно.
А в принципе запись/чтение нормально функционируют? Если без fat_fs через SD_write() записать пару секторов и потом через SD_read() считать данные - будут совпадать с записанными?
И если с этим все ок, то чуть модифицировать, чтобы точное значение res узнать:
res = f_mount(&fileSystem, SDPath, 1); if(res == FR_OK) { uint8_t path[13] = "testfile.txt"; path[12] = '\0'; res = f_open(&testFile, (char*)path, FA_WRITE | FA_CREATE_ALWAYS); res = f_write(&testFile, testBuffer, 16, &testBytes); res = f_close(&testFile); }
В целом, похоже что find_volume() выдает FR_DISK_ERR, а это возвращает нас к первой мысли, что в принципе с чтением и записью что-то не так...
@aveal , только начал разбираться с microSD. Сейчас вкурю что такое sd_write, sd_read, испытаю и по результатам отпишусь.
unsigned char buff[4096]; unsigned char buff1[4096]; DRESULT tmp1=0, tmp2=0; int l, n=0; for(l=0;l<4096;l++, n++) { if(n==256) n=0; buff[l]=n; } tmp1=SD_write(SDPath, buff, 0x0, 1); tmp2=SD_read(SDPath, buff1, 0x0, 1);
Смотрел лог. анализатором. Если только SD_write SD_read, то на ножках Clk, D0/Cmd, D1, D2 - ничего нет.Если запустить функцию f_mount, то есть Clk и D0/Cmd, но D1, D2 - пусто.Пытался отлаживать SD_write и видел что возвращает "HAL_SD_ERROR_BUSY".
Ошибся(
Вот так правильно:
Ошибка была с моей стороны и едва ли вы могли ее предугадать. Я сразу подсоединил логический анализатор чтобы смотреть сигналы и с прошлого проекта не убрал подтяжку к земле с каналов. Почему-то засаживало только канал D0, при этом Cmd и Clk почему-то было видно. Иначе бы я раньше догадался.
Я убрал подтяжку и сразу все заработало.
Извиняюсь что потратил ваше время, Aveal. 😟
Помогите пожалуйста .
Создаю проект но все время проблема . Не видятся функции в майне обьявленные в других файлах..
Инклюды указал и на заголовки и в заголовка... функции экстерн... но все равно не видит ... причем странно некоторые видит а некоторые нет хотя все однотипно...
в свойствах проекта пути указал. русских букв в путях нет.
В чем моя ошибка?
https://drive.google.com/file/d/12oJHp8TfdL8DN2PnlyA0DCXRDutlgw7x/view?usp=sharing
и почему две верхнии ошибки относятся к маке , а нижняя обособленна ... хотя тип ошибки один и тот-же
@romanio2023 Приветствую!
В настройках проекта надо добавить папки:
Это основное, ну и плюс я поменял пути на относительные:
И hi2c1 там 2 раза объявлено, extern можно добавить.