Arduino + SD + FAT16
- Василий
- Модератор
- Сообщения: 9441
- Зарегистрирован: Чт мар 06, 2008 9:03 am
- Имя: Василий Васильчиков
- Откуда: Северо-западное Болото
- Благодарил (а): 344 раза
- Поблагодарили: 458 раз
- Контактная информация:
Arduino + SD + FAT16
Коллеги, для одной из своих задумок пишу читалку файлов с SD карточки отформатированной в FAT16.
Так как полноценные библиотеки для чтения SD и FAT достаточно объемные, я реализовал лишь некоторые необходимые функции.
По SD картам
1. Инициализация SD по SPI
2. Минимальный обмен позволяющий читать одиночные сектора по 512 байт (пока только для старых карт)
По FAT16
1. Чтение необходимой информации для поиска файлов в корневой директории
2. Поиск файла в корневой директории по имени
3. Чтение найденного файла блоками по 512 байт
Заточено под Arduino Pro Mini.
Ограничения - только FAT16, файлы только 8.3, файлы размещаются только в корневом каталоге (512 штук максимум)
Размер кода вместе с достаточно объемным отладочным выводом - порядка 4.5 килобайт. После уборки мусора и оптимизации будет меньше.
В общем вопрос - выкладывать код?
Использовано:
1. Arduino Pro mini - Atmega 328 5V 16MHz
2. Разъем для SD карты.
3. Карта Transcend 2GB (старая, это важно чуть ниже расскажу почему)
Подключение:
Выводы карточки в режме SPI Соответственно соединяем
выводы Ардуино - карточка (у меня разъем)
5V - VCC (через понижалку в 3.3V)
GND - GND
11 - MOSI
12 - MISO
13 - SCK
9 - CS (можно поменять, смотреть #define CS_PIN )
Распаковываем скетч. Компилим, загружаем
Основная функция 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); и последовательно менять в сторону увеличения.
Так как полноценные библиотеки для чтения 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 Соответственно соединяем
выводы Ардуино - карточка (у меня разъем)
5V - VCC (через понижалку в 3.3V)
GND - GND
11 - MOSI
12 - MISO
13 - SCK
9 - CS (можно поменять, смотреть #define CS_PIN )
Распаковываем скетч. Компилим, загружаем
Основная функция 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); и последовательно менять в сторону увеличения.
In der Grosse Familie nicht der клювом клац-клац!
--------------------------------------------------------------------------
Не натягивайте сову на глобус!
--------------------------------------------------------------------------
Не натягивайте сову на глобус!
-
- Сообщения: 1430
- Зарегистрирован: Вс фев 19, 2012 7:18 am
- Имя: Фарид
- Откуда: Узбекистан Ташкент
- Поблагодарили: 1 раз
- Контактная информация:
Re: Arduino + SD + FAT16
Код выкладывать.Ведь готовый почти звуковой декодер)))))
Есть вопрос, а какой формат файлов на SD?
Есть вопрос, а какой формат файлов на SD?
-
- Сообщения: 286
- Зарегистрирован: Сб июн 06, 2015 3:26 pm
- Благодарил (а): 26 раз
- Поблагодарили: 10 раз
Re: Arduino + SD + FAT16
Код и схему обязательно выкладывать!
Есть вопрос: сколько код чтения занимает в % от доступного на atmega328?
Есть вопрос: сколько код чтения занимает в % от доступного на atmega328?
- Василий
- Модератор
- Сообщения: 9441
- Зарегистрирован: Чт мар 06, 2008 9:03 am
- Имя: Василий Васильчиков
- Откуда: Северо-западное Болото
- Благодарил (а): 344 раза
- Поблагодарили: 458 раз
- Контактная информация:
Re: Arduino + SD + FAT16
Ok. Причешу, откомментирую и выложу
Вместе со всей текстовой ботвой и "лишними" функциями сейчас код в районе 7% занимает.
Вместе со всей текстовой ботвой и "лишними" функциями сейчас код в районе 7% занимает.
In der Grosse Familie nicht der клювом клац-клац!
--------------------------------------------------------------------------
Не натягивайте сову на глобус!
--------------------------------------------------------------------------
Не натягивайте сову на глобус!
- И.К.С.
- Сообщения: 3895
- Зарегистрирован: Пн мар 17, 2008 9:57 am
- Имя: Ĩ.Ĉ.Š. мӧҗҥҩ ҧрѻҫҭҩ мӥҫҭҿӄѣ Ӥ.Ҟ.Ҫ іљі Ҝѻӊҫҭѩңҭӥԋъ
- Откуда: У.Г.Ж.Д. 13 верста( U.M.M.R.R 13 km)
- Благодарил (а): 203 раза
- Поблагодарили: 130 раз
- Контактная информация:
- Василий
- Модератор
- Сообщения: 9441
- Зарегистрирован: Чт мар 06, 2008 9:03 am
- Имя: Василий Васильчиков
- Откуда: Северо-западное Болото
- Благодарил (а): 344 раза
- Поблагодарили: 458 раз
- Контактная информация:
Re: Arduino + SD + FAT16
Очень такое заявление, мягко говоря ни на чем не основанное
Тут будет лишь читалка файла с SD карты. Никто не мешает читать 2, 3 или 6 файлов. Весь вопрос лишь в скорости обмена МК с карточкой.
Федюнь был вообще-то был прав. Я делаю именно звуковой декодер. И декодер по сути двухканальный. Планирую звуки двигателя воспроизводить через модуль VS1053, а допзвуки через DFPlayer.
In der Grosse Familie nicht der клювом клац-клац!
--------------------------------------------------------------------------
Не натягивайте сову на глобус!
--------------------------------------------------------------------------
Не натягивайте сову на глобус!
- Василий
- Модератор
- Сообщения: 9441
- Зарегистрирован: Чт мар 06, 2008 9:03 am
- Имя: Василий Васильчиков
- Откуда: Северо-западное Болото
- Благодарил (а): 344 раза
- Поблагодарили: 458 раз
- Контактная информация:
Re: Arduino + SD + FAT16
Да ладно тебе.. Не всем же интересно и нужно знать чего там внутри
Кстати, а вот у ЕСУ звук действительно многоканальный может быть? В смысле куча выходов на которые можно повесить кучу динамиков и из каждого будет свой звук воспроизводиться? Или просто микс из разных источников и вывод в одну говорилку?
In der Grosse Familie nicht der клювом клац-клац!
--------------------------------------------------------------------------
Не натягивайте сову на глобус!
--------------------------------------------------------------------------
Не натягивайте сову на глобус!
-
- Сообщения: 1430
- Зарегистрирован: Вс фев 19, 2012 7:18 am
- Имя: Фарид
- Откуда: Узбекистан Ташкент
- Поблагодарили: 1 раз
- Контактная информация:
Re: Arduino + SD + FAT16
Вывод как в одну говорилку так и в несколько поддерживается.Декодеры звуковые могут быть как одноканальные так и многоканальные.Не надо спорить,хотя в споре рождается истина.Звук в декодере можно выводить разными способами,кому как захочется.В основном зависит от скорости обработки и качества воспроизведения.
-
- Сообщения: 121
- Зарегистрирован: Пн мар 28, 2016 12:03 pm
- Благодарил (а): 25 раз
- Поблагодарили: 11 раз
- Контактная информация: