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

 
 
 
Reply to this topicStart new topic
> STM32 как правильно поклокать i2c
Vladimir Prokofi...
сообщение Mar 22 2012, 09:15
Сообщение #1


Участник
*

Группа: Участник
Сообщений: 47
Регистрация: 9-03-11
Пользователь №: 63 481



Возникают проблемы с i2c, не может выставиться START. По видимому, это связано с тем, что слейв находится в передаче и держит SDA.
Чтобы слейв отпустил шину, предлагается дать по клоку несколько тактов.
как это правильно сделать?
Выключить i2c, включить ногу клока на выход, подергать, включить снова и2с или есть простой способ этого сделать не изменяя конфигурацию ног?
Go to the top of the page
 
+Quote Post
PoReX
сообщение Mar 22 2012, 12:43
Сообщение #2


Частый гость
**

Группа: Свой
Сообщений: 112
Регистрация: 1-05-09
Из: Ростов-на-Дону
Пользователь №: 48 518



Похоже нарушен протокол I2C. Реализация аппаратная? Тогда как вы пытаетесь выставить вручную старт? Если слейв в режиме передачи, то нужно дать ему закончить передачу и не подтвердить последний байт, тем самым сеанс связи закончится и можно начинать новый, выставив старт. Или я что-то я не пойму, код в студию.

Сообщение отредактировал PoReX - Mar 22 2012, 12:44


--------------------
«У современных мобильных телефонов такая же вычислительная мощь, что и у компьютеров NASA в 60-е годы. И в то время этого хватало, чтобы запустить человека в космос, а сегодня — только чтобы запускать птиц в свиней.»
Go to the top of the page
 
+Quote Post
Aleksandr Barano...
сообщение Mar 22 2012, 20:01
Сообщение #3


Частый гость
**

Группа: Участник
Сообщений: 169
Регистрация: 31-08-05
Из: New York
Пользователь №: 8 118



Цитата(Vladimir Prokofiev @ Mar 22 2012, 05:15) *
Выключить i2c, включить ногу клока на выход, подергать, включить снова и2с или есть простой способ этого сделать не изменяя конфигурацию ног?

Я как-то так и делал.


--------------------
ASB
Go to the top of the page
 
+Quote Post
esaulenka
сообщение Mar 23 2012, 09:31
Сообщение #4


Профессионал
*****

Группа: Свой
Сообщений: 1 032
Регистрация: 13-03-08
Из: Маськва
Пользователь №: 35 877



Цитата(PoReX @ Mar 22 2012, 16:43) *
Похоже нарушен протокол I2C.

Угу. Например, мастер в лице нашего контроллера решил перезагрузиться в момент передачи от слейва.
Ситуация такая вполне вероятна (более того, наши тестировщики умеют повторять её на одном из устройств; пользователи, правда, не жаловались - они не щелкают кнопкой включения десяток раз подряд).

Методика лечения очень простая - 9 раз дёрнуть клок, не выдавая ACK. Но как это сделать, не перенастраивая ноги, я не знаю.
Может, кстати, при ошибках обмена такое же делать?.. А то я сейчас просто стоп-старт шлю, если что-то не так.

Так что +1 к вопросу. Только у меня LPC.


--------------------
Тут обсуждается творческий порыв, а не соответствие каким-либо стандартам ©
Go to the top of the page
 
+Quote Post
scifi
сообщение Mar 23 2012, 09:36
Сообщение #5


Гуру
******

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



Цитата(esaulenka @ Mar 23 2012, 13:31) *
Методика лечения очень простая - 9 раз дёрнуть клок, не выдавая ACK. Но как это сделать, не перенастраивая ноги, я не знаю.

А в чём проблема с перенастройкой ног?
Go to the top of the page
 
+Quote Post
esaulenka
сообщение Mar 23 2012, 11:30
Сообщение #6


Профессионал
*****

Группа: Свой
Сообщений: 1 032
Регистрация: 13-03-08
Из: Маськва
Пользователь №: 35 877



Некрасиво это. Как-то исторически сложилось, что настройка ног - в одном месте, а дальше её никто не меняет. И портировать драйвер на другие пины не так удобно будет...
Но это единственное препятствие sm.gif


--------------------
Тут обсуждается творческий порыв, а не соответствие каким-либо стандартам ©
Go to the top of the page
 
+Quote Post
scifi
сообщение Mar 23 2012, 11:37
Сообщение #7


Гуру
******

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



Цитата(esaulenka @ Mar 23 2012, 15:30) *
Некрасиво это.

Ну, если это единственная проблема, то я Вам завидую: у Вас всё очень хорошо :-)
Go to the top of the page
 
+Quote Post
PoReX
сообщение Mar 23 2012, 12:13
Сообщение #8


Частый гость
**

Группа: Свой
Сообщений: 112
Регистрация: 1-05-09
Из: Ростов-на-Дону
Пользователь №: 48 518



Цитата(esaulenka @ Mar 23 2012, 12:31) *
Угу. Например, мастер в лице нашего контроллера решил перезагрузиться в момент передачи от слейва.
Ситуация такая вполне вероятна (более того, наши тестировщики умеют повторять её на одном из устройств; пользователи, правда, не жаловались - они не щелкают кнопкой включения десяток раз подряд).

Если мастер перезагрузился, то почему бы не выдать девять клоков, а уже потом инициализировать I2C?



--------------------
«У современных мобильных телефонов такая же вычислительная мощь, что и у компьютеров NASA в 60-е годы. И в то время этого хватало, чтобы запустить человека в космос, а сегодня — только чтобы запускать птиц в свиней.»
Go to the top of the page
 
+Quote Post
Aleksandr Barano...
сообщение Mar 23 2012, 20:10
Сообщение #9


Частый гость
**

Группа: Участник
Сообщений: 169
Регистрация: 31-08-05
Из: New York
Пользователь №: 8 118



Цитата(PoReX @ Mar 23 2012, 08:13) *
Если мастер перезагрузился, то почему бы не выдать девять клоков, а уже потом инициализировать I2C?

Перезагрузка мастера - не единственная причина i2c latchup-а. Он может случиться и от сильной помехи.


--------------------
ASB
Go to the top of the page
 
+Quote Post
Vladimir Prokofi...
сообщение Mar 28 2012, 06:59
Сообщение #10


Участник
*

Группа: Участник
Сообщений: 47
Регистрация: 9-03-11
Пользователь №: 63 481



У меня ситуация почти постоянно возникает такая, включаем плату, начинается обмен данными с датчиком. Заливаем/запускаем прошивку JTAGом, питание с датчиков не сбрасывается, поэтому их состояние неизвестно, а контроллер с новой прошивкой начинает все сначала.

Получилось довольно некрасиво, но работает. Я просто думал может i2c можно аппаратно поклокать, принудительно ченить сделать чтобы байт от слейва дочитать, но пока не нашел способа.

CODE
//Ïðîâåðêà ÷òî íèêòî èç ñëåéâîâ íå äåðæèò øèíó
if( (I2C1->SR2 & I2C_SR2_BUSY) > 0 ){
GPIO_InitTypeDef GPIO_InitStructure;

I2C_DeInit(I2C1);

GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_OType = GPIO_OType_OD;
GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL;
GPIO_Init(GPIOB, &GPIO_InitStructure);

for( j = 0; j < 10; j++ ){
GPIOB->BSRRH = GPIO_Pin_8;
for( i = 0; i < 0x0FFF; i++ );
GPIOB->BSRRL = GPIO_Pin_8;
for( i = 0; i < 0x0FFF; i++ );
}

API2C_Init();
}
Go to the top of the page
 
+Quote Post

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

 


RSS Текстовая версия Сейчас: 18th June 2025 - 12:11
Рейтинг@Mail.ru


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