Протокол обмена с усилителем. Физический уровень: UART 57600, 8 бит данных, 1 стоп-бит, без контроля чётности. Уровень пакетов: Обмен идёт пакетами. Общий формат пакета: полная длина пакета — один байт; тип пакета — один байт; данные; CRC-16 – два байта. Подробности. Длина пакета может быть 5 — 64 байтов (включая CRC), пакеты с некорректной длиной отбрасываются. Тип пакета: 0x00 – команда (высылается только компьютером), 0x01 – ответ на команду (высылается только усилителем), 0x02 – уведомление от усилителя. Данные — просто данные. Минимальный размер — 1 байт, максимальный — 60 байт. CRC-16 – двухбайтовая контрольная сумма для пакета, младший байт идёт первым. Полином для рассчёта — 0xA001, начальное значение — 0xFFFF. Пакеты с некорректным CRC отбрасываются. Описание команд Идентификация. Данная команда служит для проверки того, что мы действительно имеем дело с усилителем для Редгерры. Надо послать: 1 байт, значение 0x00 Ответ от усилителя: 8 байт: Байты Размер Данные 0 1 0x00 – повтор команды 1 1 0x6A - сигнатура 2-3 2 V – два байта версии прошивки, старшим байтом вперед 4-7 4 S – 4 байта серийного номера, старшим байтом вперед Запрос напряжений. Команда запрашивает текущие напряжения и предельно допустимые значения. Надо послать: 1 байт, значение 0x01 Ответ усилителя: 9 байт Байты Размер Данные 0 1 0x01 – повтор команды 1 1 Максимально-допустимое напряжение дежурного БП, когда он выключен. 2 1 Минимально-допустимое напряжение дежурного БП, когда он включен. 3 1 Текущее напряжение дежурного БП. 4 1 Максимальное напряжение дежурного БП, когда он включен. 5 1 Максимально-допустимое напряжение основного БП, когда он выключен. 6 1 Минимально-допустимое напряжение основного БП, когда он включен. 7 1 Текущее напряжение основного БП. 8 1 Максимальное напряжение основного БП, когда он включен. Все значения идёт в отсчётах АЦП. Nацп.деж. = 12.331236 * Uдеж Nацп.осн. = 9.663142 * Uосн Запрос температур. Команда запрашивает текущие температуры, предельно значения и опорные температуры для управления кулерами. Надо послать: 1 байт, значение 0x02 Ответ усилителя: 8 байт Байты Размер Данные 0 1 0x02 – повтор команды 1 1 Температура выпрямителя главного БП 2 1 Температура микросхемы главного БП 3 1 Температура выходного каскада 4 1 Температура аварийного отключения 5 1 Температура включения кулеров 6 1 Температура выключения кулеров допустимые 7 1 Температура, выше которой кулеры крутятся на полные обороты Температуры идут в градусах. Запрос параметров кулеров. Команда запрашивает разнообразные параметры, связанные с работой кулеров. Надо послать: 1 байт, значение 0x03 Ответ усилителя: 13 байт Байты Размер Данные 0 1 0x03 – повтор команды 1 1 0x00, если ШИМ кулеров выключены, не 0x00 – если включены 2 1 Целевой процент оборотов кулеров (от оборотов, измеренных во время включения усилителя). Значения процента – от 0 (кулеры выключатся) до 255 – 100%. 3 1 Уровень ШИМ для переднего кулера (0 – 255) 4 1 Уровень ШИМ заднего кулера (0 – 255) 5 1 Обороты переднего кулера, удерживаемые обратной связью 6 1 Обороты заднего кулера, удерживаемые обратной связью 7 1 Текущие обороты переднего кулера 8 1 Текущие обороты заднего кулера 9 1 Минимальные обороты переднего кулера (во время теста при переходе из дежурного в основной режим) 10 1 Минимальные обороты заднего кулера 11 1 Максимальные обороты переднего кулера во время теста 12 1 Максимальные обороты заднего кулера 1 отсчёт = 30Об/мин Переход из дежурного режима в основной (включение). Команда заставляет усилитель перейти из дежурного режима в основной Надо послать: 1 байт, значение 0x04 Ответ усилителя: 2 байта. Ответ приходит до завершения процесса включения! Байты Размер Данные 0 1 0x04 – повтор команды 1 1 0x00 — начато включение усилителя, не 0x00 – усилитель уже и так включён В случае, если начато включение усилителя он прекращает обрабатывать любые запросы до завершения включения! О ходе процесса включения высылаются уведомления. Переход из основного режима в дежурный (выключение). Команда заставляет усилитель перейти из основного режима в дежурный Надо послать: 1 байт, значение 0x05 Ответ усилителя: 2 байта. Ответ приходит до завершения процесса выключения! Байты Размер Данные 0 1 0x05 – повтор команды 1 1 0x00 — начато выключение усилителя, не 0x00 – усилитель уже и так выключен В случае, если начато выключение усилителя он прекращает обрабатывать любые запросы до завершения включения! По завершении выключения высылается уведомление. Определение действия при подключении наушников Команда определяет, как следует поступать при подключении/отключении наушников. Надо послать: 2 байта Байты Размер Данные 0 1 0x06 – код команды 1 1 0x00 — не выключать основной усилитель при подключении наушников, не 0x00 – выключать основной усилитель при подключении наушников и включать при отключении Ответ усилителя: 1 байт Байты Размер 0 1 Данные 0x06 – повтор команды После выполнения этой команды немедленно производится проверка состояния наушников и изменение состояния основного усилителя в соответствии с ним. Так, если наушники подключены и раньше был режим «выключать», а теперь «не выключать», то усилитель немедленно включится. Установка тембра Команда устанавливает тембр. Шаг установки - 2Дб Надо послать: 3 байта Байты Размер Данные 0 1 0x07 – код команды 1 1 0x00 — регулируем басы, не 0x00 – регулируем верха 2 1 От 0x00 до 0x0E в соответстии с таблицей ниже. При некорректном значении усилитель ничего не сделает и вернет сообщение об ошибке. Коды тембров Тембр Код -14Дб 0x00 -12Дб 0x01 -10Дб 0x02 -8Дб 0x03 -6Дб 0x04 -4Дб 0x05 -2Дб 0x06 0Дб 0x07 2Дб 0x08 4Дб 0x09 6Дб 0x0A 8Дб 0x0B 10Дб 0x0C 12Дб 0x0D 14Дб 0x0E Ответ усилителя: 2 байта Байты Размер Данные 0 1 0x07 – повтор команды 1 1 0x00 – тембр успешно установлен, не 0x00 – некорректное значение тембра Установка громкости Команда устанавливает громкость. Шаг регулировки минимальное значение 0 (-78.75Дб), максимальное — 63 (0дб). Надо послать: 2 байта Байты Размер Данные — 1.25Дб, 0 1 0x08 – код команды 1 1 Значение громкости. При некорректном значении усилитель вернёт ошибку Ответ усилителя: 2 байта Байты Размер Данные 0 1 0x08 – повтор команды 1 1 0x00 – громкость успешно установлена, не 0x00 – некорректное значение Выбор входных каналов Команда выбирает входные каналы усилителя. Надо послать: 2 байта Байты Размер Данные 0 1 0x09 – код команды 1 1 Каналы: 0x00 – входы подключены напрямую, 0x01 – левый и правый входы обменяны местами 0x02 – входы опущены в землю При некорректном значении усилитель вернёт ошибку Ответ усилителя: 2 байта Байты Размер Данные 0 1 0x09 – повтор команды 1 1 0x00 – входы успешно выбраны, не 0x00 – некорректный номер входа Тонкомпенсация Команда включает/выключает тонкомпенсацию. Надо послать: 2 байта Байты Размер Данные 0 1 0x0A – код команды 1 1 0x00 — выключить тонкомпенсацию, не 0x00 – включить тонкомпенсацию Ответ усилителя: 1 байт Байты Размер 0 1 Данные 0x0A – повтор команды Установка уровня предусиления Команда устанавливает уровень предусиления. Шаг установки — 3.75Дб Надо послать: 2 байта Байты Размер Данные 0 1 0x0B – код команды 1 1 От 0x00 до 0x03 в соответстии с таблицей ниже. При некорректном значении усилитель ничего не сделает и вернет сообщение об ошибке. Коды предусиления Предусиление Код 0Дб 0x00 3.75Дб 0x01 7.5Дб 0x02 11.25Дб 0x03 Ответ усилителя: 2 байта Байты Размер Данные 0 1 0x0B – повтор команды 1 1 0x00 – предусиление успешно установлено, не 0x00 – некорректное значение предусиления Установка уровня ослабления в каналах Команда устанавливает уровень ослабления для выходных каналов. Служит для регулировки баланса и соотношения громкости наушников и колонок. Шаг регулировки ослабления — 1.25Дб. Коду 0x00 соответствует отсутствие ослабления, коду 0x1F — максимальное ослабление (-38.75Дб). Надо послать: 3 байта Байты Размер Данные 0 1 0x0C – код команды 1 1 Флаги выбранных каналов (описаны ниже в таблице). Если ни один из каналов не выбран, усилитель возвращает ошибку. 2 1 Значение ослабления. При некорректном значении усилитель возвращает ошибку Для задания уровня ослабления для нескольких каналов одновременно следует объединить флаги целевых каналов операцией побитовое ИЛИ. Значение Канал 0x01 Левый канал основного тракта 0x02 Правый канал основного тракта 0x04 Левый канал усилителя для наушников 0x08 Правый канал усилителя для наушников Ответ усилителя: 2 байта Байты Размер Данные 0 1 0x0С – повтор команды 1 1 0x00 – ослабление успешно установлено, не 0x00 – ошибка Запрос количества перемещений профилей Команда запрашивает количество перемещений профилей, т.е. фактически — количество ошибок записи профилей. Надо послать: 1 байт Байты Размер 0 1 Данные 0x0D – код команды Ответ усилителя: 5 байт Байты Размер Данные 0 1 0x0D – повтор команды 1-4 4 uint32 с количеством перемещений профилей младшим байтом вперед Запрос параметров профиля Команда запрашивает параметры профиля с заданным номером. Надо послать: 2 байта Байты Размер Данные 0 1 0x0E – код команды 1 1 Номер запрашиваемого профиля от 0 до 3. В случае, если номер профиля некорректен будет возвращена ошибка. Ответ усилителя: 10 байт Байты Размер Данные 0 1 0x0E – повтор команды 1 1 0x00 если профиль успешно прочитан, не 0x00 в случае ошибки. Если произошла ошибка, то последующие байты бессмысленны. 2-9 8 Профиль, как он хранится в EEPROM, но без CRC Автоматическое выключение Команда включает/выключает автоматическое выключение усилителя при отсутствии пингов от управляющей программы. В случае, если автоотключение включено, усилитель выключится через 60 секунд после последнего пинга. Надо послать: 2 байта Байты Размер Данные 0 1 0x0F – код команды 1 1 0x00 — выключить автоотключение, не 0x00 – включить автоотключение Ответ усилителя: 1 байт Байты Размер 0 1 Данные 0x0F – повтор команды Запрос текущего профиля Команда запрашивает номер использующегося в настоящий момент профиля Надо послать: 1 байт Байты Размер 0 1 Данные 0x10 – код команды Ответ усилителя: 2 байта Байты Размер Данные 0 1 0x10 – повтор команды 1 1 Номер использующегося профиля от 0 до 3 Установка текущего профиля Команда устанавливает в качестве текущего профиль с переданным номером. Все настройки усилителя читаются из этого профиля, последующие команды изменения настроек (такие, как изменение громкости и т.п.) будут приводить к записи в этот профиль. Надо послать: 2 байта Байты Размер Данные 0 1 0x11 – код команды 1 1 Номер профиля от 0 до 3 Ответ усилителя: 2 байта Байты Размер Данные 0 1 0x11 – повтор команды 1 1 0x00 — в случае успешной установки профиля, не 0x00 в случае ошибки Запрос количества сбросов от WDT Команда запрашивает количество сбросов, произошедших по команде WDT, т.е., фактически количество зависаний Надо послать: 1 байт Байты Размер 0 1 Данные 0x12 – код команды Ответ усилителя: 5 байт Байты Размер Данные 0 1 0x12 – повтор команды 1-4 4 uint32 с количеством сбросов от WDT младшим байтом вперед Запрос состояния усилителя Команда запрашивает текущее состояние усилителя, полезна при запуске управляющей программы. Надо послать: 1 байт Байты Размер 0 1 Данные 0x13 – код команды Ответ усилителя: 3 байта Байты Размер Данные 0 1 0x13 – повтор команды 1 1 0x00 – если усилитель в дежурном режиме, не 0x00 – если в основном 2 1 0x00 – если наушники не подключены, не 0x00 – если подключены Описание сообщений Изменение состояния наушников Сообщение указывает на то, что состояние наушников изменилось. Приходит: 3 байта данных: Байты Размер Данные 0 1 0x00 – сообщение о состоянии наушников 1 1 0x00 — наушники отключены, не 0x00 – наушники подключены 2 1 0x00 – основной усилитель не будет выключен (включён), не 0x00 – основной усилитель будет выключен (включён) Уведомление о процессе запуска усилителя Уведомление высылается несколько раз в процессе перехода из дежурного режима в основной, указывая на стадию этого процесса. Приходит: 2 байта данных: Байты Размер Данные 0 1 0x01 – уведомление о процессе запуска 1 1 0x00 – успешно включен основной блок питания и выходной каскад, дежурный блок питания выключен. 0x01 – прошёл этап тестирования кулеров на минимальных оборотах 0x02 – прошёл этап тестирования кулеров на максимальных оборотах, кулеры исправны, процесс запуска завершён Уведомление о процессе выключения усилителя Уведомление высылается по завершению перехода из основного режима в дежурный. Приходит: 1 байт данных: Байты Размер 0 1 Данные 0x02 – уведомление о завершении выключения Уведомление об ошибке чтения профиля Высылается если при чтении профиля не совпала CRC. Профиль будет инициализирован начальными значениями и будет предпринята попытка его записать. Приходит: 2 байта данных: Байты Размер Данные 0 1 0x03 – уведомление об ошибке чтения профиля 1 1 Номер ошибочного профиля от 0 до 3 Уведомление об ошибке записи профиля Высылается, если при попытке записать профиль произошла ошибка, которая была успешно исправлена за счёт перемешения профиля. Приходит: 2 байта данных: Байты Размер Данные 0 1 0x04 – уведомление об ошибке записи профиля 1 1 Номер ошибочного профиля от 0 до 3 Уведомление о неизвестной команде Высылается, если успешно принята команда (CRC совпала) с неизвестным кодом. Приходит: 2 байта данных: Байты Размер Данные 0 1 0x05 – уведомление о неизвестной команде 1 1 Код команды Уведомление о некорректной длине команды Высылается, если успешно принята команда с известным кодом, но размер принятых данных не совпадает с ожидаемым. Приходит: 3 байта данных: Байты Размер Данные 0 1 0x06 – уведомление о некорректной длине команды 1 1 Код принятой команды 2 1 Длина принятых данных Уведомление о включении с кнопки Высылается, когда начинается включение усилителя по кнопке управления. В процессе включения приходят уведомления, характерные для обычного перехода из дежурного в основной режим. Приходит: 1 байт данных: Байты Размер 0 1 Данные 0x07 – уведомление о включении с кнопки Уведомление о выключении с кнопки Высылается, когда начинается выключение усилителя по кнопке управления. В процессе включения приходят уведомления, характерные для обычного перехода из основного в дежурный режим. Приходит: 1 байт данных: Байты Размер 0 1 Данные 0x08 – уведомление о выключении с кнопки Уведомление об изменении громкости с кнопки Высылается, когда выполняется изменение громкости по кнопке управления. Приходит: 2 байт данных: Байты Размер Данные 0 1 0x09 – изменение громкости с кнопки 0 2 Новое значение громкости Уведомление о сбросе от сторожевого таймера Высылается, когда сторожевой таймер выводит устройство из зависания, выполняя его сброс. Приходит: 1 байт данных: Байты Размер 0 1 Данные 0x0A – сброс по WDT Аварийное отключение Высылается при входе усилителя в режим аварийного отключения (некорректные напряжения, температуры, отказ кулеров, некорректное поведение прошивки и т.д.). Уведомление бесконечно повторяется, выйти из аварийного отключения можно только сбросив усилитель кнопкой. Приходит: 2 байта данных: Байты Размер 0 1 Данные 0xFF – уведомление о аварийном отключении Формат хранения профиля в EEPROM Профиль хранится с начала страницы EEPROM для того, чтобы избежать лишних перезаписей страниц Размер: 10 байт (3 страницы) Байты Данные 0 Флаги, задающие различные параметры. Описание флагов смотри ниже, а также в profile.h прошивки 1 Тембры (применяются если работают динамики). В 7:4 – тембр ВЧ, в 3:0 – тембр НЧ 2 Тембры, применяемые в случае, если работают только наушники 3 Предусиление и громкость. В 7:6 – предусиление, в 5:0 – громкость 4 Уровень ослабления левого канала динамиков 5 Уровень ослабления правого канала динамиков 6 Уровень ослабления левого канала наушников 7 Уровень ослабления правого канала наушников 8 Младший байт CRC-16 9 Старший байт CRC-16 Параметры CRC-16 аналогичны тем, что используются при формировании пакетов. Флаги: Бит Значение 0 Если бит в 1, то основной усилитель надо выключать при подключении наушников 1 Если бит в 1, то при прекращении пингов от управляющей программы усилитель автоматически выключится через заданное время 2 Старший бит поля выбора входных каналов 3 И младший 4 Если бит в 1, то тонкомпенсация включена 5 6 7 Заголовки в начале EEPROM Структура, описывающая параметры одного профиля: Байты Размер Данные 0 1 uint8_t — базовый адрес соответствующего профиля (в номерах страниц! Адрес в байтах равен этому, умноженному на 4) Собственно заголовок Байты Размер Данные 0 1 Описатель профиля, загружаемого при включении от компа 1 1 Описатель профиля, загружаемого при включении с кнопки 2 1 Описатель доп. профиля 1 3 1 Описатель доп. профиля 2 4-7 4 Счётчик ошибок записи профилей 8-11 4 Счётчик срабатываний сторожевого таймера 12-13 2 CRC-16 по всему заголовку младшим байтом вперед По адресам 16-500 (0x10-0x1F4) могут плавать профили. По умолчанию адреса профилей: Номер Адрес (в номерах страниц!) 1 4 (0x04) 2 7 (0x07) 3 10 (0x0A) 4 13 (0x0D)