Перейти к содержанию
    

Пропуск данных на CAN шине

У меня на шине три модуля - один мастер и два слейва. Я посылаю по терминалу команду мастеру а мастер посылает ее двум слейвам. Первый слейв получает команду всегда без пропусков а второй пропускает -  4-5 команд принял потом пропустил.

Помню был проект с 5 модулями на шине и все слали как попало и не помню чтоб были пропуски.

Куда посмотреть? Что может влиять?

 

Да. Терминационное сопротивление есть.

Изменено пользователем jenya7

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

CAN устроен так, что или все получат сообщение или ни один не получит сообщение. У вас, скорее всего, ошибка в коде.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

1 hour ago, adnega said:

CAN устроен так, что или все получат сообщение или ни один не получит сообщение. У вас, скорее всего, ошибка в коде.

у меня на слейвах фильтр. мастер посылает один раз с ID для первого слейва, второй раз с ID для второго слейва.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

1 минуту назад, jenya7 сказал:

у меня на слейвах фильтр. мастер посылает один раз с ID для первого слейва, второй раз с ID для второго слейва.

Фильтрация никак не влияет на прием пакета. Каждый пакет будет принят, а попадет ли он в мэйлбокс уже зависит от фильтра.

Начните со слежения за CAN-счетчиками ошибок приема и передачи (специальные регистры).

Проверьте корректность установки точки семплирования.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

1 hour ago, adnega said:

Фильтрация никак не влияет на прием пакета. Каждый пакет будет принят, а попадет ли он в мэйлбокс уже зависит от фильтра.

Начните со слежения за CAN-счетчиками ошибок приема и передачи (специальные регистры).

Проверьте корректность установки точки семплирования.

то есть если он не попал в мэйлбокс - что из этого следует? я так понимаю он не был принят. а что значит точка семплирования? я принимаю пакет в прерывании.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Только что, jenya7 сказал:

то есть если он не попал в мэйлбокс - что из этого следует?

Некорректный вопрос. Если вы отправили пакет, который должен попасть в мейлбокс, а он не попал, то нужно смотреть статус ошибки в регистре состояний и счетчики ошибок.

Они точно скажут, что не так.

Только что, jenya7 сказал:

я так понимаю он не был принят. а что значит точка семплирования? я принимаю пакет в прерывании.

Вы когда задаете скорость шины должны указать предделитель и длительности сегментов TSEG1 и TSEG2, которые задают положение точки семплирования.

Вы читали стандарт CAN? Вы читали DS на модуль CAN в вашем МК?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

1 hour ago, adnega said:

Некорректный вопрос. Если вы отправили пакет, который должен попасть в мейлбокс, а он не попал, то нужно смотреть статус ошибки в регистре состояний и счетчики ошибок.

Они точно скажут, что не так.

Вы когда задаете скорость шины должны указать предделитель и длительности сегментов TSEG1 и TSEG2, которые задают положение точки семплирования.

Вы читали стандарт CAN? Вы читали DS на модуль CAN в вашем МК?

у меня настройки одинаковы для обеих слейвов

// CAN cell init 
CAN_InitStructure.CAN_TTCM = DISABLE;
CAN_InitStructure.CAN_ABOM = ENABLE;  //DISABLE
CAN_InitStructure.CAN_AWUM = DISABLE;
CAN_InitStructure.CAN_NART = ENABLE;  //ENABLE DISABLE NO AUTOMATIC RETRANSMITTION
CAN_InitStructure.CAN_RFLM = DISABLE;
CAN_InitStructure.CAN_TXFP = DISABLE;
CAN_InitStructure.CAN_Mode = CAN_Mode_Normal;
CAN_InitStructure.CAN_SJW = CAN_SJW_1tq;

/* CAN Baudrate = 1MBps (CAN clocked at 36 MHz) */
CAN_InitStructure.CAN_BS1 = CAN_BS1_9tq;
CAN_InitStructure.CAN_BS2 = CAN_BS2_8tq;
CAN_InitStructure.CAN_Prescaler = 2;
CAN_Init(CANx, &CAN_InitStructure);

и код приема тоже одинаковый

void USB_LP_CAN1_RX0_IRQHandler(void)
{
  can_params.message_received = 1;
  can_params.fifo_num = CAN_FIFO0;
  
  can_message_received = 1;
  
   CAN_Receive(CANx, CAN_FIFO0, &RxMessage);
}

uint32_t CAN_RX_Slave(uint32_t *opcode, uint32_t *rx_dlc)
{
    uint32_t mot_id; 
     
    if (can_params.message_received)
    {
        can_params.message_received = 0;
        
        mot_id = (RxMessage.ExtId & 0xFF);
        
        if (mot_id == motor_sys_params.mot_id)
        {
            *opcode = (RxMessage.ExtId >> 8) & 0xFF;
            *rx_dlc = RxMessage.DLC;
            memcpy(can_rx_data, &RxMessage.Data[0], RxMessage.DLC);
            return 1;
        }   
    }
    
    return 0;
}

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

1 hour ago, AlexandrY said:

Не защищен от гонок бит 


can_params.message_received

Как минимум это надо исправить. 

исправить как?  как бы единственная защита перенести функцию в прерывание. но что будет если придет следующий пакет а текущий еще не обработан?

 

Изменено пользователем jenya7

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Цитата

/* CAN Baudrate = 1MBps (CAN clocked at 36 MHz) */
CAN_InitStructure.CAN_BS1 = CAN_BS1_9tq;
CAN_InitStructure.CAN_BS2 = CAN_BS2_8tq;
CAN_InitStructure.CAN_Prescaler = 2;
CAN_Init(CANx, &CAN_InitStructure);

Попробуйте увеличить BS1 за счет BS2 чтобы точка семплирования была более 80%. У вас сейчас порядка 50%

Например, так

CAN_InitStructure.CAN_BS1 = CAN_BS1_15tq;
CAN_InitStructure.CAN_BS2 = CAN_BS2_2tq;
Будет положение 83%

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

1 hour ago, adnega said:

Попробуйте увеличить BS1 за счет BS2 чтобы точка семплирования была более 80%. У вас сейчас порядка 50%

Например, так

CAN_InitStructure.CAN_BS1 = CAN_BS1_15tq;
CAN_InitStructure.CAN_BS2 = CAN_BS2_2tq;
Будет положение 83%

спасибо. не знал что это влияет на стабильность.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Только что, jenya7 сказал:

спасибо. не знал что это влияет на стабильность.

На 1 Мбит/с это очень влияет. А если еще трансивер медленный или гальваноразвязка, то вообще работать не должно.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

1 hour ago, adnega said:

На 1 Мбит/с это очень влияет. А если еще трансивер медленный или гальваноразвязка, то вообще работать не должно.

у меня SN65HVD231D. не знаю насколько он хорош. видел его в других проектах решил пойти по проверенному пути.
 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

25 минут назад, jenya7 сказал:

у меня SN65HVD231D. не знаю насколько он хорош. видел его в других проектах решил пойти по проверенному пути.
 

А как у вас подключен пин RS? Если через 100кОм на землю, то на мегабит я бы не рассчитывал. Если прямое подключение к земле, то получается типовая задержка.

image.png.e2fb3ceb0e1f47ac5321d305f599e07f.png

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

1 hour ago, adnega said:

А как у вас подключен пин RS? Если через 100кОм на землю, то на мегабит я бы не рассчитывал. Если прямое подключение к земле, то получается типовая задержка.

image.png.e2fb3ceb0e1f47ac5321d305f599e07f.png

работает только если жестко посадить на землю. в других случаях не работает.

Изменено пользователем jenya7

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...