hd44780 0 21 июня, 2020 Опубликовано 21 июня, 2020 · Жалоба Привет всем Пытаюсь запустить SD карту на проце STM32F723. За основу взял кубовые примеры (мутный он, этот SDIO :D). Там ещё есть SDRAM, SSD1963, QSPI, USB HS - всё пашет без хала. Т.е. на хале сейчас только SDIO. Инит карты проходит с полпинка без проблем - тип карты, размер сектора, кол-во секторов, всё проходит идеально с полпинка. Пытаюсь читать сектор, ошибок не даёт, но читается какой-то мусор (всегда вроде одинаковый), fatFS естественно падает на взлёте (чего тут ещё ожидать-то). Если надо, могу выложить содержимое 0 сектора настоящего (с компа) и то, что сие SDIO прочитало. Но сигнатура 0x55AAв конце нормальная. Такое ощущение, что оно как-то не так или не туда читает. Читаю через DMA. Пытался читать polling-функциями - столкнулся с ошибками каких-то переполнений, то там, то сям. На ST-шных форумах нашёл, что, мол, поллинг часто не успевает, используйте DMA. Конкретно у меня Transcend 10 класса, 32 гига. Ещё советовали понижать частоту SD карты. Поставил 6 MHz, как там сказали - какие-то сектора начали читаться, но какие-то дают мусор. Кто-то подобрал к нему ключик? Спасибо. STM32F723-SDIO.zip Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Jury093 2 22 июня, 2020 Опубликовано 22 июня, 2020 · Жалоба 13 часов назад, hd44780 сказал: Но сигнатура 0x55AAв конце нормальная. Такое ощущение, что оно как-то не так или не туда читает. может есть смысл поменять msb<>lsb? "Последние два байта MBR должны содержать число 0xAA55" Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
hd44780 0 22 июня, 2020 Опубликовано 22 июня, 2020 · Жалоба 1 hour ago, Jury093 said: может есть смысл поменять msb<>lsb? "Последние два байта MBR должны содержать число 0xAA55" ну в смысле число 0xAA55, а байты 0x55 и 0xAA - здесь всё нормально, сравнивал даже с секторным дампом этой же карты на компе Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
pvo125 0 22 июня, 2020 Опубликовано 22 июня, 2020 · Жалоба Если включён кэш данных то нужно делать clean и invalidate кэша после чтения сектора dma в память. По моему при чтении с карты через, dma нужно в прерывания от dma или sdio в конце чтения вызывать cmsis функцию CleanDCache или что то похожее не помню точно как нащывается Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
hd44780 0 22 июня, 2020 Опубликовано 22 июня, 2020 · Жалоба Про кэши я в курсе, даже не включал их. Попробовал выключить принудительно - получил HardFault. ST-шники в своих примерах делают #if (ENABLE_SD_DMA_CACHE_MAINTENANCE == 1) /* the SCB_InvalidateDCache_by_Addr() requires a 32-Byte aligned address, adjust the address and the D-Cache size to invalidate accordingly. */ alignedAddr = (uint32_t)buff & ~0x1F; SCB_InvalidateDCache_by_Addr((uint32_t*)alignedAddr, count*BLOCKSIZE + ((uint32_t)buff - alignedAddr)); #endif Это оно по-моему и есть, у меня макроса нет и код этот игнорится Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
pvo125 0 22 июня, 2020 Опубликовано 22 июня, 2020 · Жалоба Можно не искать макрос а просто в месте где удобно в прерывания после чтения или в потоке но главное перед тем как будете проверять последние 2 байта считанного сектора через dma сделать анулирование кэша SCB_InvalidateCache иначе для процессора не видны новые записанные через dma в память данные сектора карты. Ядро видит старые данные в кэше. И его надо анулирование. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
hd44780 0 22 июня, 2020 Опубликовано 22 июня, 2020 · Жалоба Поставил себе ENABLE_SD_DMA_CACHE_MAINTENANCE = 1 изменений не увидел. Да и последние байты у бут-сектора 0x55 и 0xAA, они всегда в порядке были бред там в начале буфера. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться