Похоже, ЦАП не виноват - это я сам где-то налажал.
Победил. Лажа была отчасти моей - я немного напутал порядок записи байтов :) Это когда идёт чтение, то сначала читается младший (что вызывает защёлкивание старшего байта в теневой регистр), потом читается старший (как раз из "тени"). Но когда идёт запись, то порядок обратный - сначала записывается старший в "тень", потом уже младший (и это вызывает фактический перенос данных из "тени" в старший регистр). Я же ошибся и перепутал порядок следования при записи. Поэтому так и получалось, что при изменении младшего байта он мог не записаться куда надо (т.е., например, в регистре лежало 0x01FF, и мы пытаемся записать туда 0x0200 - но фактически записывается 0x02FF, что и вызывает 200 мВ скачок на выходе)
На всякий случай, ввёл ещё один синхронизирующий регистр, чтобы подстраховаться на предмет "а чё будет, если контроллер захочет чё-нть записывать/считывать точно в тот момент, когда идёт перенос данных".
Но попутно нашлось нечто странное, как обычно.
Когда я пишу в теневой регистр ЦАП, то включаю флажок "данные ждут переноса". Оный флажок анализируется при записи в младший регистр, и если он установлен, то это и вызывает перенос всех шестнадцати бит сразу. Но почему-то при этом данный флажок таинственным образом стал влиять на доступность данных АЦП, хотя он никак и нигде на них не завязан! Бред какой-то.