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

 
 
> I2C Slave на STM32F103, нестабильная работа
Demeny
сообщение Aug 3 2015, 07:20
Сообщение #1


Знающий
****

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



Добрый день!
На контроллере STM32F103 реализовано I2C Slave устройство, которое принимает от "внешнего мира" команды, обрабатывает их, и по запросу чтения выдает ответ. Всё это работает на 90% выпущенных плат.
На 10% тех же плат (из той же произведенной серии) наблюдается следующая картина - I2C Slave аппаратно не подтверждает свой адрес, то есть не выдает ACK на первый (адресный) байт со стороны мастера. В качестве мастера для теста используется компьютер с простейшим адаптером на LPT порт, который имитирует программно работу мастера (выдает команды по I2C и получает ответ).
Картина, наблюдаемая логическим анализатором, доподлинно следующая - мастер правильно формирует старт-условие, адресный байт, не получает от I2C Slave ACK, снова формирует старт, адрес и т. д. много-много раз (несколько десятков раз), и вот в какой-то момент адрес подтверждается (ACK), контроллер получает команду, обрабатывает её и готов отдать ответ. Далее та же петрушка начинается с чтением - старт, адрес + бит чтения = NACK до посинения, потом, наконец, STM32 формирует ACK и выдает правильный ответ мастеру.
Примечательный момент - если встать на любую линию SCL или SDA щупом осциллографа, то работа слейва сразу стабилизируется, он начинает работать четко и формирует ACK сразу после первого же запроса.
Что это может быть? В чём ошибка? Почему 90% плат работают, а 10% ведут себя так?


--------------------
Сделано в Китае. Упаковано в России.
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
Demeny
сообщение Aug 4 2015, 15:47
Сообщение #2


Знающий
****

Группа: Свой
Сообщений: 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
scifi
сообщение Aug 4 2015, 17:21
Сообщение #3


Гуру
******

Группа: Свой
Сообщений: 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   I2C Slave на STM32F103   Aug 3 2015, 07:20
- - 1113   ваше устройство только с компьютером связано или с...   Aug 3 2015, 07:23
- - Golikov A.   и с подтяжками шин... уровни логические, питание,...   Aug 3 2015, 07:31
- - Demeny   Цитата(1113 @ Aug 3 2015, 10:23) ваше уст...   Aug 3 2015, 07:58
- - 1113   посмотрите осциллографом на землю компьютера относ...   Aug 3 2015, 08:00
|- - Demeny   Цитата(1113 @ Aug 3 2015, 11:00) посмотри...   Aug 3 2015, 08:09
- - Golikov A.   Может 3.3 вольт не хватать компьютеру для 1? У как...   Aug 3 2015, 08:09
|- - Demeny   Цитата(Golikov A. @ Aug 3 2015, 11:09) Мо...   Aug 3 2015, 08:21
|- - Timmy   Согласен с iosifk, это могут быть короткие пички н...   Aug 3 2015, 08:25
|- - iosifk   Цитата(Demeny @ Aug 3 2015, 11:21) Это я ...   Aug 3 2015, 08:28
|- - Demeny   Цитата(iosifk @ Aug 3 2015, 11:28) Потому...   Aug 3 2015, 08:40
|- - scifi   Цитата(iosifk @ Aug 3 2015, 11:28) Потому...   Aug 3 2015, 08:51
|- - iosifk   Цитата(scifi @ Aug 3 2015, 11:51) Вообще-...   Aug 3 2015, 09:05
- - iosifk   Цитата(Demeny @ Aug 3 2015, 10:20) Примеч...   Aug 3 2015, 08:13
- - Golikov A.   ЦитатаВ линии стоят последовательные резисторы 100...   Aug 3 2015, 09:04
- - Golikov A.   а вы уверены что дело в том что вы сдвинули фронты...   Aug 4 2015, 16:56
- - Demeny   Цитата(Golikov A. @ Aug 4 2015, 19:56) а ...   Aug 4 2015, 17:24
- - scifi   Цитата(Demeny @ Aug 4 2015, 20:24) У меня...   Aug 4 2015, 17:33


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

 


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


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