ВходНаше всё Теги codebook 无线电组件 Поиск Опросы Закон Суббота
18 апреля
1582485 Топик полностью
Nikolay_Po (Сегодня, 20:13, просмотров: 29) ответил Nikolay_Po на Один и тот же IP-блок I2C кочует по миру. В I2C CH32V006, похоже, такой же баг в аналоговом фильтре, какой был у STM32F1xx. Если на выводах I2C напряжение появляется раньше, чем питание, модуль зависает в BUSY и переходит в BUSY через пару мкс после сброса.
Добил я эту айтуси. Связь восстанавливается в пределах длительности одного кадра данных при любых разумных воздействиях на шину (обрывы, закорачивание на землю, подтяжка к питанию при отсутствии питания на МК). 

Для передачи в одном направлении, потребовалось порядка 300 строк кода Си (не все из них - инструкции) для каждой из сторон.

Для обнаружения и восстановления сбоя, в свободном времени главного цикла программы, крутится надсмотрщик, который глядит, свободна ли линия, и если да, то освобождает модуль от программного сброса. Потом, ещё через время, проверяет, чтобы линия была по прежнему чиста. И если так, то проверяет, не завис ли сам модуль. Если завис - дёргает GPIO.

Когда линия свободна и всё отвисло, обе стороны начинают работу. Одна - ожидание старта. Другая - ожидание данных от приложения.

По любому не штатному состоянию модулей полный сброс I2C и DMA, ожидание очистки линии от помех.

Смотрел логическим анализатором и коротил гвоздиком - аж приятно.

Получил почти 400кбит/с поток с DMA при совсем небольшой загрузке ЦП.

ЦП должен дать указатель на данные, откуда брать и куда складывать для каждого следующего кадра, а так же вертеть надзирателя.

Конечные автоматы интерфейса по сторонам, потребовали 8 и 9 состояний.