Микроконтроллер SD-карта

У меня есть проект с Arduino или Teensy, где мне нужно постоянно читать байты из двоичного файла "байт" buf=file.read() с SD-карты и сделай вывод с манипуляцией порта (PORTD = buf,... или же PORTD = file.read() внутри петли) с некоторой стабильной частотой.

Я прочитал, что из-за задержки SD-карты file.read() Команда не будет выполняться каждый раз в одно и то же время, поэтому выходная частота не будет стабильной. Происходит ли эта задержка, когда я открываю файл, прочитанный до конца с помощью цикла, а затем закрываю файл?

Если это так, другое решение состоит в том, чтобы считывать с SD-карты 512 байтов каждый и сохранять их в массив buf с помощью структуры в соответствии с этим. Проблема в том, что каждый раз, когда я читаю 512 байт, мне приходится ждать, пока они придут, плюс задержка чтения SD-карты. Можно ли создать два буферных массива по 512 байт каждый -> заполнить первый -> начать манипулирование портом с первым массивом внутри прерывания таймера с частотой 10 или 20 кГц или более, чтобы выход всегда имел стабильную частоту в то время как в другом цикле я пытаюсь заполнить другой массив? Я имею в виду, можно ли прерватьfile.read(buf, size of(512))Команда без вопросов?

Если так, как я могу справиться с гладкой скоростью передачи данных и иметь стабильную частоту?

Я считаю, что такая же проблема возникает с микроконтроллером аудиоплееров. где они воспроизводят файлы WAV с SD-карты. Пожалуйста, помогите мне. Заранее спасибо!

1 ответ

Я еще не написал код, поэтому, чтобы быть ясным, скажем, у меня есть 3,6 с встроенным модулем SD-карты с доступными 204800 байтами SRAM для буферов, что означает, что я могу использовать 400 буферов по 512 байтов для каждый блок считывается с SD-карты.

Затем я делаю прерывание по таймеру, которое работает (например, на частоте 50 кГц), и выдвигаю одновременно до 8 контактов (любой из PORTS может использоваться с манипуляцией PORT) байт за байтом. Между тем, возможно ли считывать новые блоки с SD-карты в доступное время, оставшееся вне прерывания, которое выполняет манипулирование портами, чтобы всегда были доступны доступные байты и не ожидали SD-карту?

В нескольких словах, когда команда чтения начинается через некоторое время, она будет прервана функцией прерывания по таймеру, чтобы вытолкнуть байт и затем вернуться туда, где она была. Это возможно? Я думаю, что микрофонные аудиоплееры используют эту логику с двумя буферами, один выталкивается (значения ЦАП), а другой снова заполняется до того, как первый завершается. Вот почему 44,4 кГц является максимальным 8-битным воспроизведением wav, поэтому ни один из буферов не теряется из-за нарушения выходной частоты. Спасибо!

Другие вопросы по тегам