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

 
 
> Как ограничить количество попыток достучаться до устройства по CAN
Yaumen
сообщение Nov 4 2009, 06:02
Сообщение #1


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

Группа: Свой
Сообщений: 187
Регистрация: 22-06-05
Из: Минск, Беларусь
Пользователь №: 6 213



Стоит следующая задача на LPC2366 попытаться ограничить количество попыток отправить пакет одному из устройств.

По умолчанию сообщение будет отсылаться отправлять до 255 раз пока CAN не перейдет в режим "Bus OFF". Можно конечно настроить регистр CANEWL чтобы получить прерывание при достижении определенного количества ошибок, но насколько я понял, этот счетчик ошибок инкрементируется при возникновении любой ошибки, связанной с работой CAN, включая борьбу за шину между несколькими устройствами. Поэтому если я установлю маленькое значение, а наступит момент когда несколько устройств будут пытаться захватить шину, то моему устройству может не хватить попыток передать сообщение, а если я настрою большое значение, то при свободной шине и недоступности устройства, которому предназначен пакет, он все равно будет пытаться отправляться большое число раз.

Как резюме, может кто подскажет как научить CAN считать только отстуствие ACK от устройства назначения!!!?
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
Step_ARM
сообщение Nov 4 2009, 07:00
Сообщение #2


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

Группа: Участник
Сообщений: 132
Регистрация: 11-07-08
Пользователь №: 38 870



Я просто сбрасываю контроллер как когда ES в CANGSR устанавливается в "1" по заданному количеству ошибок.
Тем не менее, любую ошибку можно посмотреть в CANICR биты 16:20 , в том числе и ACK...
Можно сделать так -- включить прерывание по шинной ошибке в CANIER (бит 7) и определять в прерывании тип ошибки и код ошибки по CANICR.
Пить пиво...

Сообщение отредактировал IgorKossak - Nov 4 2009, 07:22
Причина редактирования: Бездумное цитирование
Go to the top of the page
 
+Quote Post
Yaumen
сообщение Nov 4 2009, 07:06
Сообщение #3


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

Группа: Свой
Сообщений: 187
Регистрация: 22-06-05
Из: Минск, Беларусь
Пользователь №: 6 213



Цитата(Step_ARM @ Nov 4 2009, 09:00) *
Можно сделать так -- включить прерывание по шинной ошибке в CANIER (бит 7) и определять в прерывании тип ошибки и код ошибки по CANICR.


Но в этом случае процессору придется отвлекаться на обработку прерываний при каждой возникшей ошибке и вести собственный счетчик ошибок. Хотя возможно другого пути и нет sad.gif
Go to the top of the page
 
+Quote Post
Yaumen
сообщение Nov 4 2009, 09:47
Сообщение #4


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

Группа: Свой
Сообщений: 187
Регистрация: 22-06-05
Из: Минск, Беларусь
Пользователь №: 6 213



Поразмыслив, я пришел к следующему алгоритму работы с устройствами:
1) Разрешаю прерывания по:
- приему
- передаче
- ошибке на шине
- пассивной ошибке
2) При возникновении ошибки на шине, проверяю ERRBIT регистра CANICR и если ошибка соответствует ошибке слота ACK, то считаю, что этого устройтсва нет. В этом случае, возможно, надо несколько раз попробовать передать сообщение, если устройство все же не отвечает, то отбрасываю посылку и выставляю флаг того, что устройтсво недоступно. Во всех остальных ошибках шины ничего не делаю.
3) При возникновении пассивной ошибки, останавливаю отправку сообщения и выставляю флаг - ошибка шины и сбрасываю TXERR, готовясь к следующей посылке.

Таким образом попытки передачи очередного сообщения будут вестись до получения ошибки слота ACK, перехода CAN контроллера в режим "Error Passive" или до успешной передачи сообщения.

Вроде все так, но есть одно "НО". После перехода в режим "Error Passive" необходимо сбрасывать счетчик TXERR, чтобы ошибки по доставке сообщения конкретному устройтсву не влияли на обмен с другими устройствами. Для этого необходимо перевести CAN контроллер в Reset Mode. Но это ведь может нарушить прием сообщений, который в данный момент ведется. На что лучше ориентироваться, чтобы безболезненно сбрасывать счетчики ошибок не нарушая работу CAN!?
Go to the top of the page
 
+Quote Post
Step_ARM
сообщение Nov 4 2009, 10:13
Сообщение #5


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

Группа: Участник
Сообщений: 132
Регистрация: 11-07-08
Пользователь №: 38 870



Цитата(Yaumen @ Nov 4 2009, 12:47) *
На что лучше ориентироваться, чтобы безболезненно сбрасывать счетчики ошибок не нарушая работу CAN!?

На регистр состояния CAN:-)
Go to the top of the page
 
+Quote Post
Yaumen
сообщение Nov 4 2009, 10:52
Сообщение #6


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

Группа: Свой
Сообщений: 187
Регистрация: 22-06-05
Из: Минск, Беларусь
Пользователь №: 6 213



Т.е. сбрасывать тогда когда по флагам не ведется ни прием, ни передача? Но ведь есть вероятность того, что пока я буду проверять регистр состояния и сбрасывать счетчики ошибок, кто-то на другом устройстве, захочет передать сообщение. Не произойдет ли потеря этого сообщения?

Сообщение отредактировал Yaumen - Nov 4 2009, 10:53
Go to the top of the page
 
+Quote Post



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

 


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


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