ВходНаше всё Теги codebook 无线电组件 Поиск Опросы Закон Четверг
19 февраля
1571431 Топик полностью
AlexBi (Вчера, 19:02, просмотров: 21) ответил AlexBi на Столкнулся с проблемой использования встроенного I2C у Artery AT32F407 Мне нужно передать данные сперва по одному адресу, потом по другому. Работу веду по прерываниям. Первая порция передается нормально, а дальше начинаются проблемы. Генерить рестарт на шине модуль I2C не умеет, генерить стоп тоже проблема, вместо этого предлагается еще раз генерить старт. Я так и делаю, но после этого начинаются чудеса. Первый байт (адрес с битом направления передачи) передается, а дальше
В результате некоторого количества экспериментов пришел к такому решению: после передачи передачи байта второго адреса опять заставляю выдать старт, после которого опять передаю второй адрес, дальше вторая порция данных нормально выдается. 

Все попытки переинициализировать модуль I2С после выдачи первой порции данных не увенчались успехом, после включения модуль уходил в ошибку шины, похоже у него внутренности сбрасываются не сразу, может синхронизируются с чем-то, ядро все делает быстро, а I2C сравнительно медленный. Причем бит сброса, расположенный в регистре модуля, как-то слабо влияет на поведение, после него может что-то выдавать на шину. Сброс через CRM сбрасывает лучше, но все равно не достаточно, что бы модуль начал работать как в первый раз. Видимо нужно выдержать время, но я не знаю сколько.