Страница 1 из 3

Arduino + SD + FAT16

Добавлено: Вс май 28, 2017 4:39 pm
Василий
Коллеги, для одной из своих задумок пишу читалку файлов с SD карточки отформатированной в FAT16.
Так как полноценные библиотеки для чтения SD и FAT достаточно объемные, я реализовал лишь некоторые необходимые функции.

По SD картам
1. Инициализация SD по SPI
2. Минимальный обмен позволяющий читать одиночные сектора по 512 байт (пока только для старых карт)

По FAT16
1. Чтение необходимой информации для поиска файлов в корневой директории
2. Поиск файла в корневой директории по имени
3. Чтение найденного файла блоками по 512 байт

Заточено под Arduino Pro Mini.

Ограничения - только FAT16, файлы только 8.3, файлы размещаются только в корневом каталоге (512 штук максимум)

Размер кода вместе с достаточно объемным отладочным выводом - порядка 4.5 килобайт. После уборки мусора и оптимизации будет меньше.

В общем вопрос - выкладывать код?
UPDATE:UPDATE:UPDATE:UPDATE:UPDATE:UPDATE:UPDATE:UPDATE:UPDATE:UPDATE:UPDATE
Часть первая, подключение и чтение блоков.
Использовано:
1. Arduino Pro mini - Atmega 328 5V 16MHz
2. Разъем для SD карты.
3. Карта Transcend 2GB (старая, это важно чуть ниже расскажу почему)

Подключение:
Выводы карточки в режме SPI
4.jpg
Соответственно соединяем
выводы Ардуино - карточка (у меня разъем)
5V - VCC (через понижалку в 3.3V)
GND - GND
11 - MOSI
12 - MISO
13 - SCK
9 - CS (можно поменять, смотреть #define CS_PIN )
DHSDReader.rar
(2.35 КБ) 533 скачивания
Распаковываем скетч. Компилим, загружаем :)
Основная функция SDRead. Читает по одному 512 байтному блоку за раз, в заранее объявленный буфер (512 байт длиной! :) ).

Теперь про "старые"/"новые" карты. Дело в том, что на т.н. старых картах, до 2GB включительно, адресация блоков (по 512 байт) отличается от адресации на новых. На новых картах, блок адресуется просто по номеру. То есть 0 это нулевой блок, 1 первый и так далее. На старых, блоки адресуются по первому байту 512 байтного блока (i*0x200). Т.е. 0 блок - адрес 0, 1 блок - 0x200 (то есть адрес начала блока), 2 блок 0x400 и так далее.

Соответственно в SDRead нужно скармливать адреса в зависимости от типа карты.
Если в функции убрать комментарии, то при каждом чтении блока, в компорт будет выводиться содержимое считанного блока.

На указанной конфигурации, получена скорость чтения блоков (последовательно 2048 блоков, 4887400 микросекунд), что составляет примерно 1706 kbps.

В случае если сразу не заводится, имеет смысл поменять значение делителя SPI на самый маленький:
SPI.setClockDivider(SPI_CLOCK_DIV128); и последовательно менять в сторону увеличения.

Re: Arduino + SD + FAT16

Добавлено: Пн май 29, 2017 5:53 am
Федюнь
Код выкладывать.Ведь готовый почти звуковой декодер)))))
Есть вопрос, а какой формат файлов на SD?

Re: Arduino + SD + FAT16

Добавлено: Пн май 29, 2017 12:40 pm
shalex
Код и схему обязательно выкладывать! :)

Есть вопрос: сколько код чтения занимает в % от доступного на atmega328?

Re: Arduino + SD + FAT16

Добавлено: Пн май 29, 2017 1:09 pm
Василий
Ok. Причешу, откомментирую и выложу :)

Вместе со всей текстовой ботвой и "лишними" функциями сейчас код в районе 7% занимает.

Re: Arduino + SD + FAT16

Добавлено: Чт июн 01, 2017 4:24 pm
BR95009
Для декодера нужен многоканальный звук. А тут одноканальный.

Re: Arduino + SD + FAT16

Добавлено: Чт июн 01, 2017 6:59 pm
И.К.С.
BR95009 писал(а):
Чт июн 01, 2017 4:24 pm
Для декодера нужен многоканальный звук. А тут одноканальный.
смешно пошутил.
Ничего что это разные подсистемы ввода-вывода?

Изображение

Re: Arduino + SD + FAT16

Добавлено: Чт июн 01, 2017 7:08 pm
Василий
BR95009 писал(а):
Чт июн 01, 2017 4:24 pm
Для декодера нужен многоканальный звук. А тут одноканальный.
Очень такое заявление, мягко говоря ни на чем не основанное :)

Тут будет лишь читалка файла с SD карты. Никто не мешает читать 2, 3 или 6 файлов. Весь вопрос лишь в скорости обмена МК с карточкой.

Федюнь был вообще-то был прав. Я делаю именно звуковой декодер. И декодер по сути двухканальный. Планирую звуки двигателя воспроизводить через модуль VS1053, а допзвуки через DFPlayer.

Re: Arduino + SD + FAT16

Добавлено: Чт июн 01, 2017 7:11 pm
Василий
И.К.С. писал(а):
Чт июн 01, 2017 6:59 pm
смешно пошутил.
Ничего что это разные подсистемы ввода-вывода?
Да ладно тебе.. Не всем же интересно и нужно знать чего там внутри :)

Кстати, а вот у ЕСУ звук действительно многоканальный может быть? В смысле куча выходов на которые можно повесить кучу динамиков и из каждого будет свой звук воспроизводиться? Или просто микс из разных источников и вывод в одну говорилку?

Re: Arduino + SD + FAT16

Добавлено: Пт июн 02, 2017 5:16 am
Федюнь
Вывод как в одну говорилку так и в несколько поддерживается.Декодеры звуковые могут быть как одноканальные так и многоканальные.Не надо спорить,хотя в споре рождается истина.Звук в декодере можно выводить разными способами,кому как захочется.В основном зависит от скорости обработки и качества воспроизведения.

Re: Arduino + SD + FAT16

Добавлено: Вс июн 04, 2017 12:47 pm
BR95009
Василий писал(а):
Чт июн 01, 2017 7:08 pm
Тут будет лишь читалка файла с SD карты. Никто не мешает читать 2, 3 или 6 файлов. Весь вопрос лишь в скорости обмена МК с карточкой.
А как воспроизвести одновременно эти 6 файлов? Вот вопрос.