Jump to content

    
hd44780

SDIO на STM32F723

Recommended Posts

Привет всем

Пытаюсь запустить 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

Share this post


Link to post
Share on other sites
13 часов назад, hd44780 сказал:

Но сигнатура 0x55AAв конце нормальная. Такое ощущение, что оно как-то не так или не туда читает.

может есть смысл поменять msb<>lsb?

"Последние два байта MBR должны содержать число 0xAA55"

Share this post


Link to post
Share on other sites
1 hour ago, Jury093 said:

может есть смысл поменять msb<>lsb?

"Последние два байта MBR должны содержать число 0xAA55"

ну в смысле число 0xAA55, а байты 0x55 и 0xAA - здесь всё нормально, сравнивал даже с секторным дампом этой же карты на компе

Share this post


Link to post
Share on other sites

Если включён кэш данных то нужно делать clean и invalidate  кэша после чтения сектора dma в память.  По моему при чтении с карты через, dma нужно в прерывания от dma или sdio в конце чтения вызывать cmsis функцию CleanDCache или что то похожее не помню точно как нащывается

Share this post


Link to post
Share on other sites

Про кэши я в курсе, даже не включал их. Попробовал выключить принудительно - получил 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

Это оно по-моему и есть, у меня макроса нет и код этот игнорится

Share this post


Link to post
Share on other sites

Можно не искать макрос а просто в месте где удобно в прерывания после чтения или в потоке но главное перед тем как будете проверять последние 2 байта считанного сектора через dma сделать анулирование кэша SCB_InvalidateCache  иначе для процессора не видны новые записанные через dma в память данные сектора карты. Ядро видит старые данные в кэше. И его надо анулирование. 

 

Share this post


Link to post
Share on other sites

Поставил себе  ENABLE_SD_DMA_CACHE_MAINTENANCE = 1 изменений не увидел. Да и последние байты у бут-сектора 0x55 и 0xAA, они всегда в порядке были

бред там в начале буфера.

Share this post


Link to post
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.