Принцип понятен, но аккуратно реализовать не выходит: читается некое число (уже хорошо), но оно просто "не нуль", а какой-то битовый мусор.
Заодно столкнулся с загадочным явлением пролезания звука из правого канала в левый,
Долго думал, в чём дело.
Пока думал, пролаз исчез.
Нифига! и наоборот тоже, и никуда он не исчез. Выглядит это так, словно внутри кодека сигнал от линейного входа проходит на линейный выход - да, там есть микшер, который позволяет так пробросить сигнал (прямо в аналоговой форме). Но я вроде бы его выключил и перенаправил вход АЦП прямо на линвход, а выход ЦАП строго на линвыход, минуя микширование. Видимо, это не так и микширование всё равно работает.
На логическом уровне у меня пока что loopback - принятые данные переписываются в регистр передачи: правый канал в правый, левый в левый (или крест-накрест, если надо сделать swap). Без обработки, без ничего.
Хотел было подключить гарнитурку, но имеющиеся в распоряжении разъёмчики - простые аудио jack 3.5мм - оказались.. как бы это помягче... одноразовыми. Пластиковая гильза-корпус штеккера крепится к металлической части на сопливой резьбе и при небольшом усилии вдоль оси разъёма резьба тут же срывается - а усилие нужно, чтобы продавить пружинный контакт в розетке. Хорошо ещё, что контакт этот потом возвращается обратно. Было бы совсем уж комедийно.
Upd и в самом деле, ошибся с адресом регистра управления микшером, просто опечатка в коде. Исправил, включил обход и микширование исчезло.
Upd2 в принципе, чтение из регистров кодека мне нафиг не надо, т.к. запись работает и всё равно копия этих данных будет лежать где-то в памяти управляющего всем этим оркестром микроконтроллера. Но когда что-то не работает (особенно если СОВСЕМ), это бесит. Поэтому выяснил и допилил: проблема была всего-лишь в том, что я слишком рано читаю. Транзакции чтения, в отличие от записи, разделены во времени - сначала нужно выслать индекс читаемого регистра, а затем дождаться ответа, в котором будет повторен этот индекс и будут валидные данные. Собственно, я сделал совсем просто: воткнул в функцию чтения небольшую задержку, как раз между передачей запроса на чтение и самим чтением. И всё заработало. Не идеально - всё равно какие-то ошибки происходят - но это уже прогресс.