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

 
 
 
Reply to this topicStart new topic
> CAN в LPC1768, помогите понять что происходит
PriBoris
сообщение Jun 8 2011, 19:05
Сообщение #1


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

Группа: Участник
Сообщений: 167
Регистрация: 7-10-05
Из: Санкт-Петербург
Пользователь №: 9 352




Есть две одинаковые платки под управлением lpc1768 каждая.
Платы связаны по CAN 250кбит/с, витая пара 20 см, согласование на обоих концах.
Подпрограммы инициализации и обработки прерываний у плат одинаковые.
Каждая плата посылает другой примерно 5-7 раз в секунду по 10-20 пакетов.
Обмен идет корректно и стабильно, за исключением того, что примерно раз в 3-5
секунд фиксируются ошибки, причем они идут группами. Т.е. 3-5 секунд нет ошибок,
а потом бац и 20 ошибок выскочит.

Статистика за 10 минут например такая :
180000 пакетов принято
61000 пакетов отослано
15000 ошибок передачи
6000 ошибок приема
110 раз контроллер уходил в bus-off
Подавляющее большинство ошибок это Acknowledge Slot и End of Frame.

Я первый раз работаю с CAN, поэтому и спрашиваю: это нормально?
Если нет, то в чем причина ? Надо размазывать отсылку пакетов во времени а не
отсылать сразу группу ? Вроде бы это нелогично, прием идет по прерываниям и тактовая у микроконтроллера 96МГц,
и ничем он больше почти не занят.
Код
__irq void CAN_IRQHandler(void)
{
    CanInterruptStatus = dwrCAN1ICR;
    if ((CanInterruptStatus&(1<<0))!=0)
    {
        pInterruptRxFrame = (TCanRxTxFrame*)&(CanRxFrames[CanRxFramePtrReceived]);
        pInterruptRxFrame->dwInfo = dwrCAN1RFS;
        pInterruptRxFrame->dwIdentifier = dwrCAN1RID;
        *(DWORD*)&(pInterruptRxFrame->bData[0]) = dwrCAN1RDA;
        *(DWORD*)&(pInterruptRxFrame->bData[4]) = dwrCAN1RDB;
        dwrCAN1CMR = (1<<2);
        CanRxFramePtrReceived = (CanRxFramePtrReceived+1)%CAN_NUM_RX_FRAMES;
        CanRxPacketCounter++;    
    }
        ...
}









Go to the top of the page
 
+Quote Post
konstan
сообщение Jun 8 2011, 20:01
Сообщение #2


Участник
*

Группа: Участник
Сообщений: 55
Регистрация: 16-02-07
Из: Deutschland
Пользователь №: 25 408



А как это у вас получилось отослать/принять столько пакетов?
Считаю, каждую 5 секунду отправляется/принимаестся 20 пакетов (это у вас так было указано), за 10 мин (600 сек) это будет 2400 пакетов?!

Какие использовали терминаторы - должны быть 120 ом.

А Вы уверены, что lpc1768 настроен правильно. Одинаковы ли частоты и временные параметры участков передачи сигнала (SYNC_SEG, PROP_SEG, PHASE_SEG1, PHASE_SEG2).
Я с lpc1768 дел не имел, но уверен, что режим loopback для отстройки CAN имеется. Включите его и проверьте, что данные честно отсылаются/ принимаются.

Вообще, надежность CAN очень высокая.
Go to the top of the page
 
+Quote Post
KRS
сообщение Jun 9 2011, 21:40
Сообщение #3


Профессионал
*****

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



А у вас случайно не идут на встречу пакеты с одинаковым ID?
Дело в том что арбитраж происходит только по ID и если ID одинаковые, а данные разные будут ошибки!

Хотя судя по кодам ваших ошибок (в конце фреймов) больше похоже на рассинхронизацию.
Go to the top of the page
 
+Quote Post
PriBoris
сообщение Jun 10 2011, 18:37
Сообщение #4


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

Группа: Участник
Сообщений: 167
Регистрация: 7-10-05
Из: Санкт-Петербург
Пользователь №: 9 352



Всем спасибо, разобрался. Оказалось что действительно перемудрил с длительностями сегментов.
Go to the top of the page
 
+Quote Post

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

 


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


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