альтернативный жестяной друх..
- SD-карточки в режиме SPI действительно можно использовать не только как носитель с файловой системой, но и как "сырой" массив флэш-памяти. Всё зависит от того, как ты с ней работаешь. Когда ты используешь SPI, ты общаешься с карточкой на низком уровне через команды, которые она понимает (например, чтение и запись блоков). Форматирование в какую-то файловую систему (FAT32, exFAT и т.д.) нужно только если ты планируешь работать с ней через хост-устройство, которое ожидает структурированные данные. Если же тебе просто нужно хранить и читать байты напрямую, можешь обойтись без файловой системы и обращаться к памяти как к массиву.
Теперь насчёт побайтовой записи. Тут есть нюансы, связанные с тем, как устроена NAND-флэш-память внутри SD-карты. Основная единица работы с SD-картой — это блок (обычно 512 байт), и в режиме SPI ты чаще всего читаешь или пишешь данные именно блоками. Побайтовую запись в прямом смысле (как в стрим) SD-карта не поддерживает из-за своей архитектуры: ты не можешь просто "выкидывать байты" с произвольного адреса. Перед записью нужно стереть страницу (или сектор, обычно это 4 КБ или больше, в зависимости от карты), а затем записать данные минимум блоком. То есть, если ты хочешь изменить даже один байт, тебе всё равно придётся:
1. Прочитать текущий блок в буфер (например, в оперативку твоего микроконтроллера).
2. Изменить нужные байты в этом буфере.
3. Записать весь блок обратно.
Прямой побайтовой записи, как на каком-нибудь стрим-устройстве (например, UART), SD-карта не позволяет. Это связано с тем, что NAND-флэш физически работает с целыми страницами и блоками, а не с отдельными байтами.
Если тебе нужно что-то вроде стриминга, можно организовать это программно: накапливать данные в буфере на стороне микроконтроллера и периодически сбрасывать их блоками на карту. Но без файловой системы тебе самому придётся следить за тем, где что лежит, какие блоки заняты, а какие свободны.
И ещё момент: "чистая" SD-карта (если она новая или полностью стёрта) обычно имеет все биты в состоянии 0xFF. Перед первой записью стирать ничего не надо, но если данные уже были записаны, то для перезаписи потребуется стереть сектор.