|
|
  |
STM32 как правильно поклокать i2c |
|
|
|
Mar 22 2012, 09:15
|
Участник

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

|
Возникают проблемы с i2c, не может выставиться START. По видимому, это связано с тем, что слейв находится в передаче и держит SDA. Чтобы слейв отпустил шину, предлагается дать по клоку несколько тактов. как это правильно сделать? Выключить i2c, включить ногу клока на выход, подергать, включить снова и2с или есть простой способ этого сделать не изменяя конфигурацию ног?
|
|
|
|
|
Mar 22 2012, 12:43
|
Частый гость
 
Группа: Свой
Сообщений: 112
Регистрация: 1-05-09
Из: Ростов-на-Дону
Пользователь №: 48 518

|
Похоже нарушен протокол I2C. Реализация аппаратная? Тогда как вы пытаетесь выставить вручную старт? Если слейв в режиме передачи, то нужно дать ему закончить передачу и не подтвердить последний байт, тем самым сеанс связи закончится и можно начинать новый, выставив старт. Или я что-то я не пойму, код в студию.
Сообщение отредактировал PoReX - Mar 22 2012, 12:44
--------------------
«У современных мобильных телефонов такая же вычислительная мощь, что и у компьютеров NASA в 60-е годы. И в то время этого хватало, чтобы запустить человека в космос, а сегодня — только чтобы запускать птиц в свиней.»
|
|
|
|
|
Mar 22 2012, 20:01
|
Частый гость
 
Группа: Участник
Сообщений: 169
Регистрация: 31-08-05
Из: New York
Пользователь №: 8 118

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

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

|
Цитата(PoReX @ Mar 22 2012, 16:43)  Похоже нарушен протокол I2C. Угу. Например, мастер в лице нашего контроллера решил перезагрузиться в момент передачи от слейва. Ситуация такая вполне вероятна (более того, наши тестировщики умеют повторять её на одном из устройств; пользователи, правда, не жаловались - они не щелкают кнопкой включения десяток раз подряд). Методика лечения очень простая - 9 раз дёрнуть клок, не выдавая ACK. Но как это сделать, не перенастраивая ноги, я не знаю. Может, кстати, при ошибках обмена такое же делать?.. А то я сейчас просто стоп-старт шлю, если что-то не так. Так что +1 к вопросу. Только у меня LPC.
--------------------
Тут обсуждается творческий порыв, а не соответствие каким-либо стандартам ©
|
|
|
|
|
Mar 23 2012, 12:13
|
Частый гость
 
Группа: Свой
Сообщений: 112
Регистрация: 1-05-09
Из: Ростов-на-Дону
Пользователь №: 48 518

|
Цитата(esaulenka @ Mar 23 2012, 12:31)  Угу. Например, мастер в лице нашего контроллера решил перезагрузиться в момент передачи от слейва. Ситуация такая вполне вероятна (более того, наши тестировщики умеют повторять её на одном из устройств; пользователи, правда, не жаловались - они не щелкают кнопкой включения десяток раз подряд). Если мастер перезагрузился, то почему бы не выдать девять клоков, а уже потом инициализировать I2C?
--------------------
«У современных мобильных телефонов такая же вычислительная мощь, что и у компьютеров NASA в 60-е годы. И в то время этого хватало, чтобы запустить человека в космос, а сегодня — только чтобы запускать птиц в свиней.»
|
|
|
|
|
Mar 23 2012, 20:10
|
Частый гость
 
Группа: Участник
Сообщений: 169
Регистрация: 31-08-05
Из: New York
Пользователь №: 8 118

|
Цитата(PoReX @ Mar 23 2012, 08:13)  Если мастер перезагрузился, то почему бы не выдать девять клоков, а уже потом инициализировать I2C? Перезагрузка мастера - не единственная причина i2c latchup-а. Он может случиться и от сильной помехи.
--------------------
ASB
|
|
|
|
|
Mar 28 2012, 06:59
|
Участник

Группа: Участник
Сообщений: 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(); }
|
|
|
|
|
  |
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|