Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: STM32 как правильно поклокать i2c
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > ARM
Vladimir Prokofiev
Возникают проблемы с i2c, не может выставиться START. По видимому, это связано с тем, что слейв находится в передаче и держит SDA.
Чтобы слейв отпустил шину, предлагается дать по клоку несколько тактов.
как это правильно сделать?
Выключить i2c, включить ногу клока на выход, подергать, включить снова и2с или есть простой способ этого сделать не изменяя конфигурацию ног?
PoReX
Похоже нарушен протокол I2C. Реализация аппаратная? Тогда как вы пытаетесь выставить вручную старт? Если слейв в режиме передачи, то нужно дать ему закончить передачу и не подтвердить последний байт, тем самым сеанс связи закончится и можно начинать новый, выставив старт. Или я что-то я не пойму, код в студию.
Aleksandr Baranov
Цитата(Vladimir Prokofiev @ Mar 22 2012, 05:15) *
Выключить i2c, включить ногу клока на выход, подергать, включить снова и2с или есть простой способ этого сделать не изменяя конфигурацию ног?

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

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

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

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

А в чём проблема с перенастройкой ног?
esaulenka
Некрасиво это. Как-то исторически сложилось, что настройка ног - в одном месте, а дальше её никто не меняет. И портировать драйвер на другие пины не так удобно будет...
Но это единственное препятствие sm.gif
scifi
Цитата(esaulenka @ Mar 23 2012, 15:30) *
Некрасиво это.

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

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

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

Перезагрузка мастера - не единственная причина i2c latchup-а. Он может случиться и от сильной помехи.
Vladimir Prokofiev
У меня ситуация почти постоянно возникает такая, включаем плату, начинается обмен данными с датчиком. Заливаем/запускаем прошивку 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();
}
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.