реклама на сайте
подробности

 
 
2 страниц V  < 1 2  
Reply to this topicStart new topic
> I2C Slave на STM32F103, нестабильная работа
Demeny
сообщение Aug 4 2015, 15:47
Сообщение #16


Знающий
****

Группа: Свой
Сообщений: 648
Регистрация: 11-02-06
Из: Санкт-Петербург
Пользователь №: 14 237



Вести с полей.
Не веря ни в какие "пички", решил поискать более материальную причину происходящего. Если контроллер не отвечает на свой адрес - возможно, он находит какую-то ошибку в происходящем на шине.
Сказано - сделано, подключил обработчик прерывания ошибок на шине 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 нс), но ошибки нет...


--------------------
Сделано в Китае. Упаковано в России.
Go to the top of the page
 
+Quote Post
Golikov A.
сообщение Aug 4 2015, 16:56
Сообщение #17


Гуру
******

Группа: Свой
Сообщений: 4 256
Регистрация: 17-02-06
Пользователь №: 14 454



а вы уверены что дело в том что вы сдвинули фронты, а не в том, что вы их сделали круче убрав резисторы?

Go to the top of the page
 
+Quote Post
scifi
сообщение Aug 4 2015, 17:21
Сообщение #18


Гуру
******

Группа: Свой
Сообщений: 3 020
Регистрация: 7-02-07
Пользователь №: 25 136



По спецификации I2C Fast Mode для Start Condition между фронтами SDA и SCL должно быть как минимум 600 нс. Вот не надо нарушать.
Go to the top of the page
 
+Quote Post
Demeny
сообщение Aug 4 2015, 17:24
Сообщение #19


Знающий
****

Группа: Свой
Сообщений: 648
Регистрация: 11-02-06
Из: Санкт-Петербург
Пользователь №: 14 237



Цитата(Golikov A. @ Aug 4 2015, 19:56) *
а вы уверены что дело в том что вы сдвинули фронты, а не в том, что вы их сделали круче убрав резисторы?

Как изменяет фронт прикосновение пинцетом или щупом осцилла? Разве что затягивает из-за доп. емкости...
Посмотрел осциллографом - спад идёт 75 нс. По даташиту на контроллер I2C в STM32 до 300 нс максимум.
Кстати, да, если закоротить оба резистора 100 Ом проблема тоже уходит...
Но в том же даташите на I2C в STM32 (Fig. 48) как раз нарисованы эти резисторы 100 Ом и подтяжка 4,7 кОм, прямо как у меня.
Ничего не понимаю...

Цитата(scifi @ Aug 4 2015, 20:21) *
По спецификации I2C Fast Mode для Start Condition между фронтами SDA и SCL должно быть как минимум 600 нс. Вот не надо нарушать.

У меня слейв, который как раз ловит "неправильный" Start Condition, поэтому я ничего не нарушаю.


--------------------
Сделано в Китае. Упаковано в России.
Go to the top of the page
 
+Quote Post
scifi
сообщение Aug 4 2015, 17:33
Сообщение #20


Гуру
******

Группа: Свой
Сообщений: 3 020
Регистрация: 7-02-07
Пользователь №: 25 136



Цитата(Demeny @ Aug 4 2015, 20:24) *
У меня слейв, который как раз ловит "неправильный" Start Condition, поэтому я ничего не нарушаю.

Если Start Condition неправильный, то имеете все основания предъявить претензии его аффтару.
Или затяните один из фронтов в правильную сторону. Но это некий танец с бубном.
Go to the top of the page
 
+Quote Post

2 страниц V  < 1 2
Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 20th July 2025 - 01:50
Рейтинг@Mail.ru


Страница сгенерированна за 0.01385 секунд с 7
ELECTRONIX ©2004-2016