Вести с полей. Не веря ни в какие "пички", решил поискать более материальную причину происходящего. Если контроллер не отвечает на свой адрес - возможно, он находит какую-то ошибку в происходящем на шине. Сказано - сделано, подключил обработчик прерывания ошибок на шине I2C, разрешил прерывания ITERREN=1, и в обработчике прерывания дергаю внешним отладочным пином, чтобы видеть происходящие ошибки. И сразу увидел, что в момент, когда при передаче адресного байта обе линии SCL и SDA одновременно падают в ноль (после переданного бита 1) - возникает ошибка Bus Error. Согласно даташита, это как раз ситуация, когда посреди передачи байта возникает "старт" или "стоп" условие на шине. Казалось бы, вот и ответ - программа бросает обе линии в ноль одновременно, но из-за различных емкостных характеристик линий SCL,SDA, неидеальности резисторов и ESD-диодов линия SDA с точки зрения контроллера падает в ноль первой, и возникает минимое "старт"-условие, которое и сбивает контроллер с толку. Включив лог. анализатор на максимальную скорость 400 MS/s, вижу, что SCL 1=>0 всё же опережает SDA 1=>0 буквально на 7-8 нс, то есть "старт"-условия нету, а ошибка шины есть! Замыкая проходные резисторы 100 Ом, могу подвигать фронтами, и вижу, что фронты двигаются друг относительно друга примерно на 10-15 нс, и ошибка пропадает при этом. НО! Я ещё понимаю, когда ошибка пропадает при отодвигании SDA 1=>0 позже по времени от SCL 1=>0. Фантастика заключается в том, что ошибка пропадает и при отодвигании спада SCL в другую сторону, то есть фактически, когда "старт"-условие в реальности выполняется (SDA 1=>0 при SCL=1)! Итого - ошибка шины возникает тогда и только тогда, когда разбежка между фронтами спада меньше 7-8 нс. Если разбег фронтов (в любую сторону) больше - ошибки нет, что мы и видим при любом прикосновении к любой линии (пинцетом, щупом осциллографа и т. п.). Что это - метастабильность триггера, защёлкивающего "старт" условие, из-за невыполнения setup-hold ?? Почему он его не защелкивает, когда "старт"-условие фактически выполняется (при подвижке спада на 10-15 нс в нужную сторону)?? И ещё. На такой же плате, у которой нет проблем с обменом (таких 90%) - также точно линии SCL и SDA падают в ноль с минимальным разбегом (<2.5 нс), но ошибки нет...
--------------------
Сделано в Китае. Упаковано в России.
|