|
|
  |
Как ограничить количество попыток достучаться до устройства по 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:-)
|
|
|
|
|
Nov 4 2009, 16:43
|

Профессионал
    
Группа: Модераторы
Сообщений: 1 951
Регистрация: 27-08-04
Из: Санкт-Петербург
Пользователь №: 555

|
Цитата(Yaumen @ Nov 4 2009, 09:02)  По умолчанию сообщение будет отсылаться отправлять до 255 раз пока CAN не перейдет в режим "Bus OFF" Это не так! Только отсутсвие ACK - превдет к ERROR PASSIVE, а в этом режиме счетчики ошибок на отсутствие ACK не увеличиваются и пакет будет передаваться бесконечно к BUS OFF это не приведет, если нет других ошибок! К тому же, насколько я помню в активном режиме, отсутсвие АСК увеличивает tx error сразу на 8! Цитата(Yaumen @ Nov 4 2009, 09:02)  Как резюме, может кто подскажет как научить CAN считать только отстуствие ACK от устройства назначения!!!? НИКАК!!! если вы получили АСК - это значит что все устройства на CAN шине, независимо от фильтров, получили ваш пакет правильно, было ли в данный момент нужное устройство на шине или нет неизвестно. В дальнейшем все контроллеры могли выкинуть этот пакет по фильтрам и он не дошел до приложения, по ACK об этом вы не узнаете.
|
|
|
|
|
Nov 5 2009, 05:43
|
Частый гость
 
Группа: Свой
Сообщений: 187
Регистрация: 22-06-05
Из: Минск, Беларусь
Пользователь №: 6 213

|
Цитата(KRS @ Nov 4 2009, 18:43)  насколько я помню в активном режиме, отсутсвие АСК увеличивает tx error сразу на 8! Да, действительно Вы правы, пришлось поднять вчера спефикацию на CAN2.0 и там вычитал, что практически все ошибки увеличивают счетчик на 8, а не на 1, а вот декрементируются они на 1. И что после перехода в Error Passive режим, ACK перестает учитываться как ошибка, поэтому если на шине нет не одного устройства, то до Bus OFF действительно не добраться и сообщение будет отсылаться вечно, что я на этапе отладки программы и видел осцилографом. Цитата(KRS @ Nov 4 2009, 18:43)  если вы получили АСК - это значит что все устройства на CAN шине, независимо от фильтров, получили ваш пакет правильно, было ли в данный момент нужное устройство на шине или нет неизвестно. В дальнейшем все контроллеры могли выкинуть этот пакет по фильтрам и он не дошел до приложения, по ACK об этом вы не узнаете А вот это для меня НОВОСТЬ!!!!! Я считал, что ACK генерит только то устройство у которого совпал ID по фильтрам. По Вашим словам, достаточно быть на шине одному устройству и кому бы я не отсылал сообщение ошибок не будет вовсе. Можете подкрепить свое высказывание ссылкой на документ где это написано!? По даташиту на LPC я такого не обнаружил!!!!
|
|
|
|
|
Nov 5 2009, 06:17
|
Местный
  
Группа: Свой
Сообщений: 320
Регистрация: 13-09-06
Пользователь №: 20 348

|
Цитата(Yaumen @ Nov 5 2009, 09:43)  Да, действительно Вы правы, пришлось поднять вчера спефикацию на CAN2.0 и там вычитал, что практически все ошибки увеличивают счетчик на 8, а не на 1, а вот декрементируются они на 1. И что после перехода в Error Passive режим, ACK перестает учитываться как ошибка, поэтому если на шине нет не одного устройства, то до Bus OFF действительно не добраться и сообщение будет отсылаться вечно, что я на этапе отладки программы и видел осцилографом.
А вот это для меня НОВОСТЬ!!!!! Я считал, что ACK генерит только то устройство у которого совпал ID по фильтрам. По Вашим словам, достаточно быть на шине одному устройству и кому бы я не отсылал сообщение ошибок не будет вовсе. Можете подкрепить свое высказывание ссылкой на документ где это написано!? По даташиту на LPC я такого не обнаружил!!!! Правильно. Так даже на других процах сделано: ARM от Atmel и процы от Analog Я сам вначале как вы думал, но затем удостоверился, что достаточно появиться хотя бы одному устройству на линии, то он будет подтвержать передающему, что со собщением все ок, но при этом не факт, что это посылка для него Можно конечно использовать тип посылки сообщения, на которое принимающее должно ответить само и по результату выяснять
|
|
|
|
|
Nov 5 2009, 06:37
|
Частый гость
 
Группа: Свой
Сообщений: 187
Регистрация: 22-06-05
Из: Минск, Беларусь
Пользователь №: 6 213

|
bookevg, KRS, Step_ARM, Спасибо всем отклинувшимся, на этом наверное тему можно закрывать. К сожалению, подход, который я планировал применить, оказался неприменим  . Получается что удостовериться в наличии устройства с конкретным ID можно только обеспечив с ним полноценный ЗАПРОС-ОТВЕТный механизм, т.е. я ему что-то посылаю, он мне должен ответить в течении заданного таймаута, но это уже задача Прикладного Уровня, написанием которого я сейчас и займусь!!!
|
|
|
|
|
  |
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|