|
|
 |
Ответов
|
Mar 22 2012, 12:43
|
Частый гость
 
Группа: Свой
Сообщений: 112
Регистрация: 1-05-09
Из: Ростов-на-Дону
Пользователь №: 48 518

|
Похоже нарушен протокол I2C. Реализация аппаратная? Тогда как вы пытаетесь выставить вручную старт? Если слейв в режиме передачи, то нужно дать ему закончить передачу и не подтвердить последний байт, тем самым сеанс связи закончится и можно начинать новый, выставив старт. Или я что-то я не пойму, код в студию.
Сообщение отредактировал PoReX - Mar 22 2012, 12:44
--------------------
«У современных мобильных телефонов такая же вычислительная мощь, что и у компьютеров NASA в 60-е годы. И в то время этого хватало, чтобы запустить человека в космос, а сегодня — только чтобы запускать птиц в свиней.»
|
|
|
|
|
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
|
|
|