ReadMe
Манифест
Электроника
Программное обеспечение:
ЖКИ
VLSI
Разные мелочи
Интерфейсы накопителей
Файловые системы
Элементы пользовательского интерфейса
Модули режимов
Координаторы
Отладочный координатор
Пользовательский интерфейс
Фотографии
 
==> Orfey2

Электрическая принципиальная схема

Открыть схему в отдельном окне

Мелкие замечания

Неиспользуемые выводы SD, согласно документации, должны быть подключены к Uп. Но я их никуда не подключал - всё работает. Теоретически, SD карту можно заменить на MMC, но я этого не проверял.

На схеме для экономии места не показаны подключения VS1001 к "земле".

Темно-красным цветом показаны соединения с портом C процессора ATmega.

Микросхема 74ahct08 имеет в своём составе четыре элемента И. Входы двух неиспользуемых элементов подключены к "земле". На схеме также не показано питание этой микросхемы. Серия ahct подразумевает работу только с питанием 5 в, однако при этом верхний предел частоты лежит в районе сотен МГц. Но так как в нашем случае предельная частота не превышает десятка МГц, микросхема любезно согласилась на питание 3.5 в. Хотя можно попробовать найти и более правильный элемент.

Финальная схема (которая представлена здесь) была нарисована примерно через полгода после сборки плейера, поэтому ошибки в ней вероятны. Если есть сомнения - сравнивайте с фотографиями. Следует помнить, что в паре мест печатная плата, выложенная на сайте, отличается от фотографий - это результат исправления ошибок.

Здесь не показаны схемы подключения аккумуляторов питания, а также стабилизатора питания +5 в (он построен на ШИМ-стабилизаторе LM2575T-5, почти по типовой схеме), необходимого для работы жесткого диска. Их реализация мне не совсем нравится, да и нет в них ничего особенного или интересного.

Питание и подсветка

Ядро плейера использует напряжение питания 3.5 в. Эта странная цифра была выбрана из не совсем верных, покрытых историческим мраком, соображений, которые описаны в разделе, посвященном интерфейсу IDE. Если будете повторять конструкцию - лучше используйте 3.3 в. Резистор 200к в обвязке lp2951 задаёт уровнь стабилизации.

Выбирая напряжение питания следует помнить, что внутренний тактовый генератор ATmega (по крайней мере у проверенных мной ATmega8 и ATmega32) перестаёт работать при снижении питания до уровня 3,0 в, хотя документацией гарантируется работа кристала для более низких уровней (При использовании внешнего тактирования ? Или только у кристаллов с суффиксом "L" ? Похоже, что-то я пропустил в документации...).

3.5 в поддерживает low-drop стабилизатор lp2951. Он нормально удерживает нагрузку, если на его входе есть хотя бы 3.7 в. Верхний порог определяется рассеиваемой мощностью и документацией на lp2951, но он довольно высокий. Во всяком случае, 5-8 вольт - вполне хорошо.

Однако обратите внимание на схему питания подсветки LCD. На каждой ветке из двух светодиодов падает чуть больше 3 в. Токи светодиодов (неизвестной марки) выбраны около 20-30 ма. Так как токи задаются резисторами, падение напряжения на которых невелико (около 1.5 в), ток будет сильно зависеть от напряжения питания. Я расчитывал на напряжение +5 в и даже небольшое отклонение на вольт вверх или вниз будет существенно влиять на подсветку - либо она будет тусклой либо возможен пробой светодиодов.

Уровень в +5 в выбран просто потому, что стабильный и мощный источник этого напряжения есть в плейере - он используется для заряда аккумуляторов и питания жесткого диска, если, конечно, таковой используется.

Так же обратите внимание на не очень умную схему управления светодиодами - транзистор кт502 со стабилитроном в базовой цепи. Логичнее было бы коммутировать питание между "общим" и светодиодами, второй вывод которых был бы постоянно подключен к +5 в. Но я об этом не подумал сразу и был вынужден усложнять схему управления. Напряжение стабилитрона напрямую связано с уровнем питания: оно должно быть примерно на 1.5 в меньше напряжения питания подсветки.

ATmega32

Тут никаких сложностей нет: тактирование внутреннее, 8 МГц, brown-out-детектор отключен, сброс происходит по сигналу стабилизатора питания.

Интерфейс rs232 используется для отладки и изменения firmware (в дальнейшем может быть использован и для взаимодействия с док-станцией), преобразователей уровня не имеет (при взаимодействии с компьютером во время отладки используются внешние преобразователи), резистор в 10 к нужен для удержания уровня "1" на входе интерфейса при отсутствии источника внешнего управления.

Неиспользуемые выводы (B2 и D2) могут быть задействованы при расширении управляющего кода, например, для управления линиями CS IDE (это нужно в случае использования 48-битной адресации - т.е. накопителей с объёмом более 128 Гб).

Процессор общается с периферией плейера по двум шинам: аппаратной SPI и програмной IDE.

IDE/ATA

IDE - достаточно быстрая (16 почти параллельных бит), с точки зрения накопителя обмен происходит про протоколам PIO. Так как ATmega32 не имеет аппаратного контроллера IDE, этот интерфейс реализуется программно. При этом скорость ATmega32 такова, что использование сигнала IOReady не обязательно (здесь и в дальнейшем, относительно ATA, я руководствовался документом Working Draft T13 1410D "Information Technology AT Attachment with Packet Interface - 6 (ATA/ATAPI-6)") - получается что-то вроде PIO-0 или PIO-1.

Так как накопитель будет реагировать на состояние шины только в случае, если сигнал !IOW = 0, а пытаться выставить данные на неё только при !IOR = 0, часть линий данных IDE используется и для других целей.

Стандарт ATA требует, чтобы как host так и device понимали и допускали использование управляющих логических уровней 5 в и 3.3 в. Что касается понимания - здесь проблем нет. С допуском сложнее: SD-карта, LCD-дисплей и VLSI-декодер работают с уровнями и питанием не выше 3.6 в. Как следствие, питание центрального контроллера тоже выбрано 3.5 в. Однако известно, что сигналы на его входах не должны превышать напряжение питания более чем на 0.6 в, т.е. 3.5 в + 0.6 в = 4.1 в. Если же мощные буферные каскады IDE-накопителя будут выдавать уровень логической "1" вышего этого значения - это будет плохо. Возможно, процессор не сгорит, но сильно пострадает стабильность напряжения его питания.

4.1 в в качестве логической "1" часто давали старые TTL-микросхемы. Но с тех пор многое изменилось и крайне маловероятно, что плейеру доведётся работать с накопителем на TTL-логике. А используемая сейчас элементная база дает почти полный размах выходных уровней - 4.9 - 5.1 в - запросто.

С другой стороны, большинство накопителей сейчас сами используют низковольтовый интерфейс 3.3 в, особенно формфактора 2.5'' - ноутбучные.

Подопытный Fujitsu, например, выдает 3.3 в на всех линиях, кроме RESET, !PDIAG и !DASP. Значит, он будет нормально дружить с плейером. Что и подтверждено практикой.

С другой стороны, если основываясь на этой работе, вам захочется создать другую конструкцию, без элементов на 3.3 в, можно смело повысить напряжения питания ATmega32 и тогда он будет нормально работать со старыми накопителями с шиной 5в. Это проверено.

В общем, выбирая накопитель для плейера, убедитесь, что он выдает на шину данных уровни не выше выбранного вами питания ядра + 0.6 в. Чтобы это проверить, просто подайте напряжение питания и замкнув шину !IOR на "общий" пробегите вольтметром по линиям D0..D15. Где нибудь да найдётся логическая "1", по её уровню будет всё видно.

Многие линии интерфейса не задействованы в плейере. Например, RESET. Хотя документация требует аппаратного или програмного сброса накопителя в случае возникновения ошибок (иначе накопитель просто перестанет отзываться), я не стал этого делать экономя выводы процессора. Хотя если выбранный вами "винт" покрыт bad-блоками и продолжает ими покрываться в процессе работы, без сброса и соответствующей доработки програмной части жить будет сложно.

Другие линии являются либо выходами либо подтянуты к логической "1" внутри накопителя и, таким образом, их состояние сохраняется определённым.

Обмен по шине происходит при !IOW = 0 (накопитель ловит данные от процессора) или при !IOR = 0 (накопитель выставляет данные для процессора). Во время обмена процессором должен быть задан адрес на шинах A0..A2. Всё остальное время (!IOR = !IOW = 1) линии шины могут быть использованы произвольно, что широко используется в плейере.

SPI-шина

Это неторопливый последовательный интерфейс, похожий на rs232 и отличается от последнего тем, что имеет отдельную линию синхронизации и, следовательно, не обязан использовать различные заморочки вроде старт и стоп-бит, фиксированных скоростей передачи и прочих привязок к реальному времени. Кроме того, ATmega32 имеет весьма гибкий аппаратный контроллер SPI. Максимальная скорость обмена при его использовании составляет половину от тактовой частоты процессора и, следовательно, равна 4 Мбит/сек. Эта частота, в свою очередь, существенно ниже предельно допустимой для SD-карт, и чуть ниже, чем допускает VLSI-декодер. Данных относительно LCD-дисплея нет, как нет, впрочем, и проблем с ним.

Очередной бит вылавливается устройством назначения из линии MOSI в момент перехода линии SCK из "0" в "1", либо, если устройство хочет передать данные процессору, она выставляет их на линию MISO.

Биты кучкуются в байты, первым передаётся младший бит, биты отдельных байт ничем не разделяются. Устройства после сброса ожидают младший бит очередного байта. Срыв синхронизации приведёт к фатальным для шины последствиям. Однако на практике срывов синхронизации в Orfey'е не наблюдалось.

Для того, чтобы указать на устройство, с которым в данный момент желает общаться процессор, используются различные методы, зависящие от конкретного устройства. Как правило, для выбора устройства используются линии IDE-интерфейса. Их состояние может быть произвольным, когда по IDE-шине идёт обмен, однако это не мешает SPI-шине, так как в этот момент отсутствуют тактовые сигналы SCK.

SD-память

Развитие стандарта MMC, может использовать два протокола: 1) фирменный, закрытый и быстрый; 2) SPI.

Для того, чтобы указать карте, что обмен будет происходить по протоколу SPI, контроллер вынужден изобразить сложный танец на входе SD-карты с применением бубна. Линии сброса у карты нет, поэтому в случае глюков питания карта может уйти в сложно-неопределенное состояние, вывести из которого можно только обесточив ядро плейера секунд на 5.

Выбор карты (т.е. подключение к SPI) происходит по сигналу !CS = 0 (линия C3 у ATmega32, лапка 1 у SD-карты), однако чтобы этот вход начал работать, сразу после включения питания должна быть выполнена процедура инициализации карты. Желательно сделать это до использования IDE-интерфейса, если планируется использовать оба устройства (в моём случае такой режим не используются).

Так же нужно помнить, что протокол обмена для карт объёмом выше 2 Гб отличается от протокола менее ёмких подружек. Софт плейера тестировался для карт 128 Мб и 1 Гб. Замеченные непонятки подробно отражены в листинге, каких либо нестабильностей в работе карт не обнаружено.

Литература:

  • SD Memory Card Specifications || Simplified Version of: Part 1 || Physical Layer Specification || Version 1.01 || April 15 2001 - ну может быть там и найдётся что-то редкое.
  • SD Specifications || Part 1 || Physical Layer Simplified Specification || Version 2.00 || September 25, 2006 - начинать отсюда, самая главная глава - седьмая.
  • SD Specifications || Part 2 || SD Host Controller Simplified Specification || Version 2.00 || February 8, 2007 - можно не читать.
  • Atmel ATmega (ATmega16 / ATmega32) - MMC (Multi Media Card) Flash Memory Extension - простенько и со вкусом.
  • Atmel ATmega (ATmega16 / ATmega32) - SD (Secure Digital Card) Flash Memory Extension - продолжение и развитие предыдущего текста.
  • Применение ММС-карт в микроконтроллерных системах, Олег Пушкарёв, ж. "СОВРЕМЕННАЯ ЭЛЕКТРОНИКА", 2006, 1, 46...49, http://www.soel.ru/ - подробно и внятно. Но про MMC, а не SD.
  • Радио 2005, # 11, стр. 26, С. Дмитриев, Сотовый телефон - "электронная книга" - тоже про MMC и не только.

LCD и клавиатура

LCD-дисплей использует только входящий поток данных SPI, возвращать данные он не умеет. Для подключения к SPI используется сигнал !CS (B4 у ATmega, лапка 5 LCD), однако есть также сигнал D/C (C4 у ATmega32 и 4 лапка LCD) - он выбирает, куда происходит запись: в видеопамять или в управляющие регистры.

Регистров у LCD много, но, как мне кажется, у моего экземпляра (он не оригинальный финский) не все работают. Однако, на всякий случай, в управляющем коде реализована полная процедура инициализации.

Дисплей имеет линию сброса, которой управляет ATmega32 (B2 у ATmega и 8 у LCD), а также выход для конденсатора умножителя (лапка 7).

Одновременно, линия выбора LCD используется и для выбора клавиатуры. Когда выбран дисплей (!CS = 0), при нажатии клавиш логические "0" передается в соответствующие биты регистра A процессора. На входе регистра в это время включаются внутренние PullUp-резисторы. Так как клавиатура является устройством сугубо асинхронным и игнорирует сигнал SCK, чтобы не вызвать конфликта с IDE-шиной, клавиши снабжены диодами (я использовал д9, ... ну просто у меня их ОЧЕНЬ много. Можно использовать какие нибудь другие) (NB: диоды и кнопки расположены вне платы ядра), а !CS = 0 выставляется во время неактивности магистрали IDE.

Литература:

  • Радио 2005, # 11, стр. 26, С. Дмитриев, Сотовый телефон - "электронная книга".
  • Библиотека serdisplib для управления ЖКИ.
  • Был ещё сайт http://mp3vkarmane.nm.ru/ - там была хорошая статья про нокиевский дисплей, но, похоже, сайт скончался.
  • PCD8544: 48 в 84 pixels matrix LCD controller/driver || 1999 Apr 12 || Product specification.

PS Почему не дисплей от Melt ? А лапок у них слишком много.

VLSI-декодер

VS1001 использует две SPI-шины. Почему так сложно - не знаю. Может быть это ограничение аппаратуры контроллера, на котором он построен (но документация на базовый контроллер закрыта, так что это только домыслы), а может быть это была гениальная задумка: чтобы поток данных файла поступал прямо в декодер от накопителя не смешиваясь с потоком управления, поступающим от контроллера.

Однако даже в схемах примеров от разработчика эти шины снаружи просто спараллеливаются. Первая из них называется SCI (Serial Control Interface), вторая - SDI (Serial Data Interface). По управляющей шине передаются параметры настройки, причем некоторые из них можно читать (эта шина двунаправленная), по второй - декодируемые данные (только одно направление), а также ряд тестовых команд (кстати, в русском переводе-статье пропущена одна строчка, из-за чего получается так, что тестовые команды подаются на SCI. Это ошибка - смотрите оригинал !).

Некоторой проблемой является то, что шина SDI не имеет сигнала Select и отключить её от общей шины SPI можно только блокировав сигнал синхронизации. Для этого используется схема на двух элементах И. Первый элемент подключает VLSI к общей шине SPI (C7 у ATmega32), второй позволяет выбирает одну из двух входных шин: SDI или SCI (C6 у ATmega32). Заметьте: сигналы выбора прямые, а не инверсные, как у LCD и SD !

Сигнал DREQ является асинхронным и заводится на отдельный вход ATmega32. Он указывает на состояние внутреннего буфера данных шины SDI, причем имеет некоторый запас как по недостатку данных так и по переполнению: VLSI будет некоторое время продолжать работать даже если данные не поступают при DREQ = 1 и, в то же время, данные не будут потеряны если процессор передаст несколько байт уже при DREQ = 0.

BSYNC в моей схеме просто подключен к логической "1". По замыслу разработчиков он должен восстанавливать синхронизацию байт на SPI, но, согласно документации, может быть и константой. Я не обнаружил каких-либо проблем в этом случае.

RESET для VS1001 вырабатывается ATmega'ой и используется также для сброса LCD. Чтобы избежать ненужных щелчков при включении питания, эта линия через резистор 10к подтянута к "земле" (вообще-то предпочтительнее использовать 100к, но, вероятно, у меня его не нашлось). Таким образом, её состояние остаётся определённым даже до того, как управляющий код ATmega начнёт свою работу.

Аналоговая часть VS1001 просто срисована с фирменной документации. Резисторы 10 ом должны снижать риск гибели декодера в результате воздействия статического электричества и рекомендуются документацией. Понятно, что они будут увеличивать выходное сопротивление УНЧ, но на практике проблем отмечено не было (тем более с наушниками-вкладышами). Если же плейер будет использоваться со стационарным УНЧ и колонками, эти резисторы, имея ничтожное сопротивление, просто не будут заметны на фоне входного сопротивления следующего аудио-модуля.

В единственном, собранном мной, экземпляре плейера используется версия декодера "k" (т.е. полное название микросхемы VS1001k), при этом были обнаружены следующие странности:

  • Иногда, при использовании быстрой перемотки SM_FFWD на файлах с низким битрейтом (около 32кбит/с), декодер сбивается и начинает воспроизводить звук с явными искажениями, при этом в регистре счёта времени DECODE_TIME отсчёт начинается с нуля.
  • При выполнении программного сброса сразу после аппаратного, примерно каждый второй раз (особенно, если до этого декодер уже что-то воспроизводил, но питание надолго не отключалось), выскакивает ошибка # 2 (DREQ не упал в "0" через 5 мкс после задания SM_RESET = "1"). Это не очень мешает практическому использованию и проявляется только при включении плейера.

Вместо традиционного "литература" в этом разделе я лишь напомню, что помимо Datasheet к VS1001 имеется ещё весьма нелишний фирменный Application Notes.

Владимир