jenya7 0 3 июня, 2019 Опубликовано 3 июня, 2019 (изменено) · Жалоба У меня на шине три модуля - один мастер и два слейва. Я посылаю по терминалу команду мастеру а мастер посылает ее двум слейвам. Первый слейв получает команду всегда без пропусков а второй пропускает - 4-5 команд принял потом пропустил. Помню был проект с 5 модулями на шине и все слали как попало и не помню чтоб были пропуски. Куда посмотреть? Что может влиять? Да. Терминационное сопротивление есть. Изменено 3 июня, 2019 пользователем jenya7 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
adnega 11 3 июня, 2019 Опубликовано 3 июня, 2019 · Жалоба CAN устроен так, что или все получат сообщение или ни один не получит сообщение. У вас, скорее всего, ошибка в коде. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
jenya7 0 3 июня, 2019 Опубликовано 3 июня, 2019 · Жалоба 1 hour ago, adnega said: CAN устроен так, что или все получат сообщение или ни один не получит сообщение. У вас, скорее всего, ошибка в коде. у меня на слейвах фильтр. мастер посылает один раз с ID для первого слейва, второй раз с ID для второго слейва. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
adnega 11 3 июня, 2019 Опубликовано 3 июня, 2019 · Жалоба 1 минуту назад, jenya7 сказал: у меня на слейвах фильтр. мастер посылает один раз с ID для первого слейва, второй раз с ID для второго слейва. Фильтрация никак не влияет на прием пакета. Каждый пакет будет принят, а попадет ли он в мэйлбокс уже зависит от фильтра. Начните со слежения за CAN-счетчиками ошибок приема и передачи (специальные регистры). Проверьте корректность установки точки семплирования. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
jenya7 0 3 июня, 2019 Опубликовано 3 июня, 2019 · Жалоба 1 hour ago, adnega said: Фильтрация никак не влияет на прием пакета. Каждый пакет будет принят, а попадет ли он в мэйлбокс уже зависит от фильтра. Начните со слежения за CAN-счетчиками ошибок приема и передачи (специальные регистры). Проверьте корректность установки точки семплирования. то есть если он не попал в мэйлбокс - что из этого следует? я так понимаю он не был принят. а что значит точка семплирования? я принимаю пакет в прерывании. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
adnega 11 3 июня, 2019 Опубликовано 3 июня, 2019 · Жалоба Только что, jenya7 сказал: то есть если он не попал в мэйлбокс - что из этого следует? Некорректный вопрос. Если вы отправили пакет, который должен попасть в мейлбокс, а он не попал, то нужно смотреть статус ошибки в регистре состояний и счетчики ошибок. Они точно скажут, что не так. Только что, jenya7 сказал: я так понимаю он не был принят. а что значит точка семплирования? я принимаю пакет в прерывании. Вы когда задаете скорость шины должны указать предделитель и длительности сегментов TSEG1 и TSEG2, которые задают положение точки семплирования. Вы читали стандарт CAN? Вы читали DS на модуль CAN в вашем МК? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
jenya7 0 3 июня, 2019 Опубликовано 3 июня, 2019 · Жалоба 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; } Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
AlexandrY 3 3 июня, 2019 Опубликовано 3 июня, 2019 · Жалоба Не защищен от гонок бит can_params.message_received Как минимум это надо исправить. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
jenya7 0 3 июня, 2019 Опубликовано 3 июня, 2019 (изменено) · Жалоба 1 hour ago, AlexandrY said: Не защищен от гонок бит can_params.message_received Как минимум это надо исправить. исправить как? как бы единственная защита перенести функцию в прерывание. но что будет если придет следующий пакет а текущий еще не обработан? Изменено 3 июня, 2019 пользователем jenya7 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
adnega 11 3 июня, 2019 Опубликовано 3 июня, 2019 · Жалоба Цитата /* 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% Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
jenya7 0 3 июня, 2019 Опубликовано 3 июня, 2019 · Жалоба 1 hour ago, adnega said: Попробуйте увеличить BS1 за счет BS2 чтобы точка семплирования была более 80%. У вас сейчас порядка 50% Например, так CAN_InitStructure.CAN_BS1 = CAN_BS1_15tq; CAN_InitStructure.CAN_BS2 = CAN_BS2_2tq; Будет положение 83% спасибо. не знал что это влияет на стабильность. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
adnega 11 3 июня, 2019 Опубликовано 3 июня, 2019 · Жалоба Только что, jenya7 сказал: спасибо. не знал что это влияет на стабильность. На 1 Мбит/с это очень влияет. А если еще трансивер медленный или гальваноразвязка, то вообще работать не должно. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
jenya7 0 3 июня, 2019 Опубликовано 3 июня, 2019 · Жалоба 1 hour ago, adnega said: На 1 Мбит/с это очень влияет. А если еще трансивер медленный или гальваноразвязка, то вообще работать не должно. у меня SN65HVD231D. не знаю насколько он хорош. видел его в других проектах решил пойти по проверенному пути. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
adnega 11 3 июня, 2019 Опубликовано 3 июня, 2019 · Жалоба 25 минут назад, jenya7 сказал: у меня SN65HVD231D. не знаю насколько он хорош. видел его в других проектах решил пойти по проверенному пути. А как у вас подключен пин RS? Если через 100кОм на землю, то на мегабит я бы не рассчитывал. Если прямое подключение к земле, то получается типовая задержка. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
jenya7 0 3 июня, 2019 Опубликовано 3 июня, 2019 (изменено) · Жалоба 1 hour ago, adnega said: А как у вас подключен пин RS? Если через 100кОм на землю, то на мегабит я бы не рассчитывал. Если прямое подключение к земле, то получается типовая задержка. работает только если жестко посадить на землю. в других случаях не работает. Изменено 3 июня, 2019 пользователем jenya7 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться