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

 
 
2 страниц V   1 2 >  
Reply to this topicStart new topic
> twi(i2c)-интерфейс, обеспечение надежности передачи
namelos
сообщение Nov 22 2007, 15:04
Сообщение #1


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

Группа: Свой
Сообщений: 77
Регистрация: 4-08-06
Пользователь №: 19 324



Доброе время суток всем.
Разрабатываю систему измерения и контроля температуры на 36 датчиков, состоящую из 3 контроллеров(slaves) на 12 датчиков(опрос, контроль, вкл./выкл. реле) и контроллера(master) отображения информации на GLCD и ввода данных на рабочие контроллеры(запись в eeprom). Коммуникация главного контроллера осуществляется по twi(i2c)-интерфейсу.
Пока работаю с макеткой. Нашел bug при обрывaнии линии twi, зависает главный контроллер, т.к. TWI Interrupt не был обнулен, т.е не произошло нормального завершения передачи информации.
Вопрос такой, уважаемые эмбеддеры, для контроля работы twi обязательно использовать еще таймер, который при зависании квитирует Interrupt?
И еще, slaves посылают пакеты в 40 байт, обязательна ли при такой длине пакета crc проверка?
Заранее всем спасибо.

Сообщение отредактировал namelos - Nov 22 2007, 15:05
Go to the top of the page
 
+Quote Post
umup
сообщение Nov 22 2007, 15:29
Сообщение #2


Местный
***

Группа: Свой
Сообщений: 226
Регистрация: 2-06-06
Пользователь №: 17 720



да, TWI на АВР часто глухо виснет при замыканиях/обрывах/помехах на линии. проверка обязательна. можно реализовать TWI программно с контролем состояния линии. и зачем аж 4 контроллера ? с одним будет надежнее - расстояние между контроллерами наверно небольшое.
Go to the top of the page
 
+Quote Post
namelos
сообщение Nov 22 2007, 15:41
Сообщение #3


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

Группа: Свой
Сообщений: 77
Регистрация: 4-08-06
Пользователь №: 19 324



Цитата(umup @ Nov 22 2007, 19:29) *
да, TWI на АВР часто глухо виснет при замыканиях/обрывах/помехах на линии. проверка обязательна. можно реализовать TWI программно с контролем состояния линии. и зачем аж 4 контроллера ? с одним будет надежнее - расстояние между контроллерами наверно небольшое.

umup, спасибо за ответ.
Что-то я не понял, вы какую проверку имеете ввиду? И если можно по подробнее про TWI с контролем состояния линии.
Использую 3 контроллера для 3 обьектов, в свою очередь, для каждого обьекта возможна различная конфигурация и настройка сенсоров. Надеюсь разместить все контроллеры на одной платине.

Сообщение отредактировал namelos - Nov 22 2007, 15:43
Go to the top of the page
 
+Quote Post
Dog Pawlowa
сообщение Nov 22 2007, 17:02
Сообщение #4


Гуру
******

Группа: Свой
Сообщений: 2 702
Регистрация: 14-07-06
Пользователь №: 18 823



Цитата(namelos @ Nov 22 2007, 19:41) *
umup, спасибо за ответ.
Что-то я не понял, вы какую проверку имеете ввиду? И если можно по подробнее про TWI с контролем состояния линии.
Использую 3 контроллера для 3 обьектов, в свою очередь, для каждого обьекта возможна различная конфигурация и настройка сенсоров. Надеюсь разместить все контроллеры на одной платине.


Родное немецкое слово "платИна" smile.gif
На какое расстояние передаете? С какой скоростью?


--------------------
Уходя, оставьте свет...
Go to the top of the page
 
+Quote Post
defunct
сообщение Nov 22 2007, 17:23
Сообщение #5


кекс
******

Группа: Свой
Сообщений: 3 825
Регистрация: 17-12-05
Из: Киев
Пользователь №: 12 326



Цитата(umup @ Nov 22 2007, 18:29) *
да, TWI на АВР часто глухо виснет при замыканиях/обрывах/помехах на линии. проверка обязательна.

Несогласен с этим утверждением.
Ничего не виснет просто так. Скорее всего просто не обрабатывается какое-то из состояний линии, чаще всего некоторые игнорируют обработку ошибочных ситуаций (состояние 0x00), что и приводит к "зависанию".

Цитата
контроля работы twi обязательно использовать еще таймер, который при зависании квитирует Interrupt?

определенно - нет.
Лучше напишите i2c драйвер в режиме прерываний с обслуживанием всех 32х состояний линии. Проблем с TWI модулем тогда будет - ровно 0.
Go to the top of the page
 
+Quote Post
umup
сообщение Nov 22 2007, 20:08
Сообщение #6


Местный
***

Группа: Свой
Сообщений: 226
Регистрация: 2-06-06
Пользователь №: 17 720



defunct
никак не могу понять - как отловить завершение Stop condition ?
Go to the top of the page
 
+Quote Post
IgorKossak
сообщение Nov 22 2007, 20:37
Сообщение #7


Шаман
******

Группа: Модераторы
Сообщений: 3 064
Регистрация: 30-06-04
Из: Киев, Украина
Пользователь №: 221



Цитата(umup @ Nov 22 2007, 22:08) *
defunct
никак не могу понять - как отловить завершение Stop condition ?

Хоть я и не defunct, но отвечу.
Stop condition это единственное состояние, завершения которого не нужно отлавливать. Оно выполняется безусловно.
Go to the top of the page
 
+Quote Post
namelos
сообщение Nov 22 2007, 20:50
Сообщение #8


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

Группа: Свой
Сообщений: 77
Регистрация: 4-08-06
Пользователь №: 19 324



Спасибо, defunct. A как насчет crc-проверки после пересылки пакета? Или для i2c протокола это необязательно?


Цитата(Dog Pawlowa @ Nov 22 2007, 21:02) *
Родное немецкое слово "платИна" smile.gif
На какое расстояние передаете? С какой скоростью?

smile.gif
Скорость установил 100кбит/с, надеюсь уложиться до 10см.
Go to the top of the page
 
+Quote Post
defunct
сообщение Nov 23 2007, 10:35
Сообщение #9


кекс
******

Группа: Свой
Сообщений: 3 825
Регистрация: 17-12-05
Из: Киев
Пользователь №: 12 326



Цитата(namelos @ Nov 22 2007, 23:50) *
A как насчет crc-проверки после пересылки пакета? Или для i2c протокола это необязательно?

Думаю что обязательно, как раз для случаев когда на линии возникает ошибка (помеха искажающая данные)..
Но это уже забота того модуля кому предназначался пакет.
Go to the top of the page
 
+Quote Post
umup
сообщение Nov 23 2007, 11:12
Сообщение #10


Местный
***

Группа: Свой
Сообщений: 226
Регистрация: 2-06-06
Пользователь №: 17 720



IgorKossak
а если нужно отловить момент завершения формирования STOP ?
Go to the top of the page
 
+Quote Post
defunct
сообщение Nov 23 2007, 11:29
Сообщение #11


кекс
******

Группа: Свой
Сообщений: 3 825
Регистрация: 17-12-05
Из: Киев
Пользователь №: 12 326



Цитата(umup @ Nov 23 2007, 14:12) *
а если нужно отловить момент завершения формирования STOP ?

Для слейва - состояние 0xA0 (STOP or repeated START)
для мастера смотрите состояния - arbitration lost / bus error (для случая если стоп не может быть послан). Стоп состояние мастеру отлавливать не нужно, т.к. он его посылает.
Go to the top of the page
 
+Quote Post
IgorKossak
сообщение Nov 23 2007, 13:43
Сообщение #12


Шаман
******

Группа: Модераторы
Сообщений: 3 064
Регистрация: 30-06-04
Из: Киев, Украина
Пользователь №: 221



Цитата(umup @ Nov 23 2007, 13:12) *
IgorKossak
а если нужно отловить момент завершения формирования STOP ?

Дополню сказанное defunct.
Со стороны мастера. Перед посылкой команды стоп не должно быть ошибок в линии (анализируется опросом состояния).
Команда стоп как таковая срабатывает аналогично команде установки состояния порта и сигнал появляется на линии в следующий (или через один, не помню точно) такт МК. Срабатывает безусловно. Для этого состояния, в отличие от других, и прерывание не предусмотрено.
Go to the top of the page
 
+Quote Post
namelos
сообщение Nov 23 2007, 18:16
Сообщение #13


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

Группа: Свой
Сообщений: 77
Регистрация: 4-08-06
Пользователь №: 19 324



Цитата(IgorKossak @ Nov 23 2007, 17:43) *
Перед посылкой команды стоп не должно быть ошибок в линии (анализируется опросом состояния).
Команда стоп как таковая срабатывает аналогично команде установки состояния порта и сигнал появляется на линии в следующий (или через один, не помню точно) такт МК. Срабатывает безусловно. Для этого состояния, в отличие от других, и прерывание не предусмотрено.

А как проверить состояние линии?
При разьединении сигнального кабеля TWI как раз в этом месте у меня происходит зависание master контроллера. Определил, что TWSR = 0x58, но почему то команда в момент прерывания
Код
ISR (TWI_vect)
{
switch(TWSR)
{
case 0x58: // Data byte has been received and NACK transmitted
TWCR = (1<<TWEN)|                          // TWI Interface enabled
             (0<<TWIE)|(1<<TWINT)|                  // Disable TWI Interrupt and clear the flag
             (0<<TWEA)|(0<<TWSTA)|(1<<TWSTO)|       // Initiate a STOP condition. TWSTO reset
             (0<<TWWC);
}
}

не выполняется и опрос TWI порта не просходит, т.к TWIE не обнуляется.
Код
if( !(TWCR & _BV(TWIE)) )
    {
            //Check if the last opeation was OK
        if(twi_statusReg.lastReceiveOK) // Last transmission competed successfully.
            twi_get_data_message ( ...);
        
        twi_start_data_transceiver();
    }


Что можно предпринять?

Сообщение отредактировал namelos - Nov 23 2007, 19:16
Go to the top of the page
 
+Quote Post
bodja74
сообщение Nov 23 2007, 19:00
Сообщение #14


Знающий
****

Группа: Свой
Сообщений: 543
Регистрация: 22-10-05
Пользователь №: 9 984



Цитата(namelos @ Nov 23 2007, 21:16) *
А как проверить состояние линии?

...
Что можно предпринять?


1 Любая проверка ,есть ли связь ,опредляется по НАСК или АСК.
2 Если мастер получает НАСК ,он должен выставить СТОП ,если слейв получает НАСК он должен прекратить передачу и перейти на ожидание старта со своим адресом.
3 Со стопом там тоже не все чисто ,так как проверки флага там нет стоит сделать задержку не менее одного такта шины,или обеспечить таковую между пакетами ,вставив какую нибудь обработку кода.В противном случае легко перейдем в ступор.Хотя может в новых камнях это продебажили - незнаю.
4 Зависон у Вас от того ,что Вы пропустили пару раз подряд НАСК и никак на это не отреагировали.
Go to the top of the page
 
+Quote Post
namelos
сообщение Nov 23 2007, 19:34
Сообщение #15


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

Группа: Свой
Сообщений: 77
Регистрация: 4-08-06
Пользователь №: 19 324



Цитата(bodja74 @ Nov 23 2007, 23:00) *
3 Со стопом там тоже не все чисто ,так как проверки флага там нет стоит сделать задержку не менее одного такта шины,или обеспечить таковую между пакетами ,вставив какую нибудь обработку кода.В противном случае легко перейдем в ступор.Хотя может в новых камнях это продебажили - незнаю.

несовсем понятно...начало transreceive пакета реализуется только в случае недействительного TWI Interrupt (TWIE =0)
Цитата(bodja74 @ Nov 23 2007, 23:00) *
4 Зависон у Вас от того ,что Вы пропустили пару раз подряд НАСК и никак на это не отреагировали.

Почему не отреагировал, вот :
Код
TWCR = (1<<TWEN)|                          // TWI Interface enabled
             (0<<TWIE)|(1<<TWINT)|                  // Disable TWI Interrupt and clear the flag
             (0<<TWEA)|(0<<TWSTA)|(1<<TWSTO)|       // Initiate a STOP condition. TWSTO reset
             (0<<TWWC);

Контроллер не зависает, он из состояния interrupt не выходит, а точнее выходит, но TWIE не обнуляет.

Сообщение отредактировал namelos - Nov 23 2007, 19:40
Go to the top of the page
 
+Quote Post

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

 


RSS Текстовая версия Сейчас: 22nd July 2025 - 18:48
Рейтинг@Mail.ru


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