|
Как ограничить количество попыток достучаться до устройства по CAN |
|
|
|
Nov 4 2009, 06:02
|
Частый гость
 
Группа: Свой
Сообщений: 187
Регистрация: 22-06-05
Из: Минск, Беларусь
Пользователь №: 6 213

|
Стоит следующая задача на LPC2366 попытаться ограничить количество попыток отправить пакет одному из устройств.
По умолчанию сообщение будет отсылаться отправлять до 255 раз пока CAN не перейдет в режим "Bus OFF". Можно конечно настроить регистр CANEWL чтобы получить прерывание при достижении определенного количества ошибок, но насколько я понял, этот счетчик ошибок инкрементируется при возникновении любой ошибки, связанной с работой CAN, включая борьбу за шину между несколькими устройствами. Поэтому если я установлю маленькое значение, а наступит момент когда несколько устройств будут пытаться захватить шину, то моему устройству может не хватить попыток передать сообщение, а если я настрою большое значение, то при свободной шине и недоступности устройства, которому предназначен пакет, он все равно будет пытаться отправляться большое число раз.
Как резюме, может кто подскажет как научить CAN считать только отстуствие ACK от устройства назначения!!!?
|
|
|
|
|
 |
Ответов
|
Nov 4 2009, 07:00
|
Частый гость
 
Группа: Участник
Сообщений: 132
Регистрация: 11-07-08
Пользователь №: 38 870

|
Я просто сбрасываю контроллер как когда ES в CANGSR устанавливается в "1" по заданному количеству ошибок. Тем не менее, любую ошибку можно посмотреть в CANICR биты 16:20 , в том числе и ACK... Можно сделать так -- включить прерывание по шинной ошибке в CANIER (бит 7) и определять в прерывании тип ошибки и код ошибки по CANICR. Пить пиво...
Сообщение отредактировал IgorKossak - Nov 4 2009, 07:22
Причина редактирования: Бездумное цитирование
|
|
|
|
|
Nov 4 2009, 07:06
|
Частый гость
 
Группа: Свой
Сообщений: 187
Регистрация: 22-06-05
Из: Минск, Беларусь
Пользователь №: 6 213

|
Цитата(Step_ARM @ Nov 4 2009, 09:00)  Можно сделать так -- включить прерывание по шинной ошибке в CANIER (бит 7) и определять в прерывании тип ошибки и код ошибки по CANICR. Но в этом случае процессору придется отвлекаться на обработку прерываний при каждой возникшей ошибке и вести собственный счетчик ошибок. Хотя возможно другого пути и нет
|
|
|
|
|
Nov 4 2009, 09:47
|
Частый гость
 
Группа: Свой
Сообщений: 187
Регистрация: 22-06-05
Из: Минск, Беларусь
Пользователь №: 6 213

|
Поразмыслив, я пришел к следующему алгоритму работы с устройствами: 1) Разрешаю прерывания по: - приему - передаче - ошибке на шине - пассивной ошибке 2) При возникновении ошибки на шине, проверяю ERRBIT регистра CANICR и если ошибка соответствует ошибке слота ACK, то считаю, что этого устройтсва нет. В этом случае, возможно, надо несколько раз попробовать передать сообщение, если устройство все же не отвечает, то отбрасываю посылку и выставляю флаг того, что устройтсво недоступно. Во всех остальных ошибках шины ничего не делаю. 3) При возникновении пассивной ошибки, останавливаю отправку сообщения и выставляю флаг - ошибка шины и сбрасываю TXERR, готовясь к следующей посылке.
Таким образом попытки передачи очередного сообщения будут вестись до получения ошибки слота ACK, перехода CAN контроллера в режим "Error Passive" или до успешной передачи сообщения.
Вроде все так, но есть одно "НО". После перехода в режим "Error Passive" необходимо сбрасывать счетчик TXERR, чтобы ошибки по доставке сообщения конкретному устройтсву не влияли на обмен с другими устройствами. Для этого необходимо перевести CAN контроллер в Reset Mode. Но это ведь может нарушить прием сообщений, который в данный момент ведется. На что лучше ориентироваться, чтобы безболезненно сбрасывать счетчики ошибок не нарушая работу CAN!?
|
|
|
|
|
Nov 4 2009, 10:13
|
Частый гость
 
Группа: Участник
Сообщений: 132
Регистрация: 11-07-08
Пользователь №: 38 870

|
Цитата(Yaumen @ Nov 4 2009, 12:47)  На что лучше ориентироваться, чтобы безболезненно сбрасывать счетчики ошибок не нарушая работу CAN!? На регистр состояния CAN:-)
|
|
|
|
Сообщений в этой теме
Yaumen Как ограничить количество попыток достучаться до устройства по CAN Nov 4 2009, 06:02 KRS Цитата(Yaumen @ Nov 4 2009, 09:02) По умо... Nov 4 2009, 16:43 Yaumen Цитата(KRS @ Nov 4 2009, 18:43) насколько... Nov 5 2009, 05:43  bookevg Цитата(Yaumen @ Nov 5 2009, 09:43) Да, де... Nov 5 2009, 06:17   Yaumen bookevg, KRS, Step_ARM,
Спасибо всем отклинувшим... Nov 5 2009, 06:37
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|