‮Сдвиг по фазе (kincajou) wrote,
‮Сдвиг по фазе
kincajou

Categories:

worklog: AC'97 (продолжаю разбираться)

Не могу победить чтение. Точнее сказать, пока не победил. Победил! см. ниже
Принцип понятен, но аккуратно реализовать не выходит: читается некое число (уже хорошо), но оно просто "не нуль", а какой-то битовый мусор.


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


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

На логическом уровне у меня пока что loopback - принятые данные переписываются в регистр передачи: правый канал в правый, левый в левый (или крест-накрест, если надо сделать swap). Без обработки, без ничего.

Хотел было подключить гарнитурку, но имеющиеся в распоряжении разъёмчики - простые аудио jack 3.5мм - оказались.. как бы это помягче... одноразовыми. Пластиковая гильза-корпус штеккера крепится к металлической части на сопливой резьбе и при небольшом усилии вдоль оси разъёма резьба тут же срывается - а усилие нужно, чтобы продавить пружинный контакт в розетке. Хорошо ещё, что контакт этот потом возвращается обратно. Было бы совсем уж комедийно.

Upd и в самом деле, ошибся с адресом регистра управления микшером, просто опечатка в коде. Исправил, включил обход и микширование исчезло.

Upd2 в принципе, чтение из регистров кодека мне нафиг не надо, т.к. запись работает и всё равно копия этих данных будет лежать где-то в памяти управляющего всем этим оркестром микроконтроллера. Но когда что-то не работает (особенно если СОВСЕМ), это бесит. Поэтому выяснил и допилил: проблема была всего-лишь в том, что я слишком рано читаю. Транзакции чтения, в отличие от записи, разделены во времени - сначала нужно выслать индекс читаемого регистра, а затем дождаться ответа, в котором будет повторен этот индекс и будут валидные данные. Собственно, я сделал совсем просто: воткнул в функцию чтения небольшую задержку, как раз между передачей запроса на чтение и самим чтением. И всё заработало. Не идеально - всё равно какие-то ошибки происходят - но это уже прогресс.
Tags: радио
Subscribe

  • Post a new comment

    Error

    Anonymous comments are disabled in this journal

    default userpic

    Your reply will be screened

    Your IP address will be recorded 

  • 10 comments