Добил я эту айтуси. Связь восстанавливается в пределах длительности
одного кадра данных при любых разумных воздействиях на шину
(обрывы, закорачивание на землю, подтяжка к питанию при отсутствии
питания на МК). Для передачи в одном направлении, потребовалось порядка 300 строк кода Си (не все из них - инструкции) для каждой из сторон.
Для обнаружения и восстановления сбоя, в свободном времени главного цикла программы, крутится надсмотрщик, который глядит, свободна ли линия, и если да, то освобождает модуль от программного сброса. Потом, ещё через время, проверяет, чтобы линия была по прежнему чиста. И если так, то проверяет, не завис ли сам модуль. Если завис - дёргает GPIO.
Когда линия свободна и всё отвисло, обе стороны начинают работу. Одна - ожидание старта. Другая - ожидание данных от приложения.
По любому не штатному состоянию модулей полный сброс I2C и DMA, ожидание очистки линии от помех.
Смотрел логическим анализатором и коротил гвоздиком - аж приятно.
Получил почти 400кбит/с поток с DMA при совсем небольшой загрузке ЦП.
ЦП должен дать указатель на данные, откуда брать и куда складывать для каждого следующего кадра, а так же вертеть надзирателя.
Конечные автоматы интерфейса по сторонам, потребовали 8 и 9 состояний.