worklog: SDMMC (2), без STM32Cube и SPL.

Jul 30, 2017 09:13



Part table:
00 82 03 00 0C FE FF FF 00 20 00 00 00 04 B7 03
Bootsector: 00002000
00002000 EB 00 90 20 20 20 20 20 20 20 20 00 02 40 92 04 ... ..@..
00002010 02 00 00 00 00 F8 00 00 3F 00 FF 00 00 20 00 00 ........?.... ..
00002020 00 04 B7 03 B7 1D 00 00 00 00 00 00 02 00 00 00 ................
00002030 01 00 06 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
00002040 80 00 29 31 62 32 32 4E 4F 20 4E 41 4D 45 20 20 ..)1b22NO NAME
00002050 20 20 46 41 54 33 32 20 20 20 00 00 00 00 00 00 FAT32 ......
00002060 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
00002070 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
00002080 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
00002090 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
000020A0 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
000020B0 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
000020C0 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
000020D0 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
000020E0 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
000020F0 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
00002100 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
00002110 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
00002120 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
00002130 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
00002140 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
00002150 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
00002160 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
00002170 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
00002180 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
00002190 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
000021A0 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
000021B0 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
000021C0 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
000021D0 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
000021E0 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
000021F0 00 00 00 00 00 00 00 00 00 00 00 00 00 00 55 AA ..............U.
Done

В общем, кое-как уже получается читать карточку. Наблюдаю множество странных вещей, типа когда в if() сравнивается два байта, ожидаемый и принятый, при этом в отладчике я вижу, что они равны -- но всё равно срабатывает ветка else{}, словно бы равенство не выполняется. Или другое: две функции идут одна за другой, если они встречаются просто в коде main() - выполняются нормально, а если их вынести в отдельную функцию-обёртку, то в момент вызова второй из этой пары проц виснет, на моменте обращения к библиотечной функции SCB_InvalidateDCache(). Магический обряд с барьерами памяти помог разрешить ситуацию.

Вот эта хреновня:


4-битная 48МГц шина SD работает по плоскому 14-проводниковому шлейфу. Половина проводников - "земля": на каждый скоростной сигнал (CK, CMD, D0,D1,D2,D3) есть свой возвратный провод, на питание свой; плюс отдельно CardDetect, WriteProtection и управление ключиком питания. Где-то на форумах попадалось авторитетное высказывание, что так делать нельзя - мол, проводники нужно делать как можно короче, иначе не будет работать вообще. Но работает... возможно, проблемы обнаружатся с какими-нибудь старинными карточками (у меня в распоряжении только несколько разных SDHC), у которых слабосильный шинный драйвер, но в таком случае можно будет просто снизить частоту.

В задаче требуется заливать прошивку в ПЛИС с карточки и/или набортного чипа QuadSPI Flash (и, ессно, иметь возможность переливать файлы туда-сюда); чтобы ещё всё это с компа виделось как USB Mass Storage. Совсем офигенски будет соорудить FTP-сервер, но это надо очень много копать. И чтобы чужого говнокода было по минимуму (свой - можно).

P.S. любопытно что блок SDMMC имеет опцию отключения сигнала CK в паузах между передачей команд и данных. Если эту опцию не использовать, то тактовый сигнал фигачит постоянно. Очень полезная мелочь в плане снижения побочных излучений.

радио

Previous post Next post
Up