April 24th, 2021

worklog: когда все остальные варианты отброшены, остаётся единственно верный

Пытаюсь вспомнить, как я когда-то включил кодек CS4202 - микросхема довольно древняя, но для моих задач вполне адекватная (и у меня есть некоторое количество чипов в запасе).

Цифровой интерфейс (AC'97) устроен весьма просто, но есть две закавыки:
1) синхронизирующий строб надо взводить на последнем бите из кадра и сбрасывать на пятнадцатом;
2) выдавать биты данных надо по восходящему фронту такта, а считывать - по падающему.

Однако, я совершенно забыл VHDL и никак не могу сообразить, как организовать такую штуку: один процесс ("контроллер") взводит флаг, а другой ("исполнитель") смотрит на его состояние и сбрасывает после отработки. Не придумал ничего лучше, чем завести RS-триггер, подключив к входу S процесс-контроллер, а исполнителя - ко входу R и к выходу Q. То есть, контроллер выдаёт импульс взведения - настолько короткий, насколько это вообще возможно (фактически, "иголку") и на выходе триггера появляется активный флажок. Когда исполнитель улавливает это изменение, он кое-что там у себя делает в регистрах, затем выдаёт аналогичную "иголку" уже на вход S, сбрасывая флаг. Вроде должно работать, но неужели нет способа получше?

А ещё оказалось, что тот экземпляр кодека, который я запаял на плату, наполовину издох: цифровая шина-то у него работает, но вот ни утилиты, ни аналоговая часть не включаются: GPIO не реагирует на команды, а на выходе опорника всего 35мВ (должно было 2.4В, плюс-минус). И чип греется как-то уж очень подозрительно. Всё прозвонил, под микроскопом ещё раз осмотрел, промыл-посушил -- пофигу. Сдул микросхему, поставил другую: и вот они, 2.4 вольта! GPIO подёргал, однако, на выходе ЦАПа всё равно тишина.

Даже после того, как я почитал в мануале, что после сброса там выставлены заглушки (mute) по всем аналоговым выходам-входам: написал команду, которая всё это сбрасывает, но никаких положительных изменений не наблюдаю.