Ekka 0 29 мая, 2018 Опубликовано 29 мая, 2018 (изменено) · Жалоба Привет всем! Ребята, помогите, пожалуйста разобраться, что не так. Пытаюсь запустить CAN в нормальном режиме ( в loopback работает) на stm32f4 в среде CodeBlock на библиотеке libopencm3 (ибо именно оно и надо - хотя оч ненависто) После того, как использует все ящики - зависает. Почему данные не уходят из почтовых ящиков? Второе устройство на шине имеется. Может я не сбрасываю какой-то флаг? Или неправильно настройки? Инициализация uint32_t _canConfig(uint32_t bitrate) { int prescaler = 0; switch(bitrate) { case 500: prescaler = 2; //500kb/s=2000ns break; case 250: prescaler = 4; //250kb/s=4000ns break; case 125: prescaler = 8; //125kb/s=8000ns break; case 100: prescaler = 10; //100kb/s=10000ns break; case 50: prescaler = 20; //50kb/s=20000ns break; case 20: prescaler = 50; //20kb/s=50000ns break; case 10: prescaler = 100; //10kb/s=100000ns break; default: prescaler = 2; //500kb/s=2000ns break; } //CANRX поставлено nopull по аналогии с халом rcc_periph_clock_enable(CAN_RX_PERIPH); gpio_mode_setup(CAN_RX_PORT, GPIO_MODE_INPUT, GPIO_PUPD_NONE, CAN_RX_PIN); gpio_set(CAN_RX_PORT, CAN_RX_PIN); //CANTX rcc_periph_clock_enable(CAN_TX_PERIPH); gpio_mode_setup(CAN_TX_PORT, GPIO_MODE_AF|GPIO_OSPEED_50MHZ, GPIO_OTYPE_PP, CAN_TX_PIN); //CANmodul rcc_periph_clock_enable(CAN_PERIPH); nvic_enable_irq(NVIC_CAN1_RX0_IRQ); nvic_set_priority(NVIC_CAN1_RX0_IRQ, 1); can_reset(CAN_NUM); if(can_init(CAN1, false, //TTCM: Time triggered comm mode? false, //ABOM: Automatic bus-off management? false, //AWUM: Automatic wakeup mode? false, //NART: No automatic retransmission? false, //RFLM: Receive FIFO locked mode? false, //TXFP: Transmit FIFO priority? CAN_BTR_SJW_1TQ, CAN_BTR_TS1_9TQ, CAN_BTR_TS2_6TQ, prescaler, //BRP+1: Baud rate prescaler false, //LOOPBACK? false) == 1) //SILENT? { return 1; } //CAN filter 0 init can_filter_id_mask_32bit_init( 0, // Filter ID - принимать все 0, // CAN ID 0, // CAN ID mask 0, // FIFO assignment (here: FIFO0) true); // Enable the filter //Enable CAN RX interrupt can_enable_irq(CAN1, CAN_IER_FMPIE0); Прерывание на получение данных мне пока не нужно, но вот void can1_rx0_isr(void) { can_fifo_release(CAN1, 0); } и в мейне отправка по-тупому while (1) { time++; if(time>1000000) { can_transmit(CAN1, 0x00, 0, 0,8, datat); time=0; } В чем может быть проблема? Эта libopen... такая гадость... понимаю, что кейл+куб лучше да я и не против. Но задача стоит именно на этих средствах сделать. ХЕЛП Изменено 29 мая, 2018 пользователем IgorKossak [codebox] для длинного кода, [code] - для короткого! Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
RadiatoR 2 29 мая, 2018 Опубликовано 29 мая, 2018 · Жалоба Почему RX pin устанавливается как GPIO_MODE_INPUT? должна так же быть GPIO_MODE_AF Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Ekka 0 29 мая, 2018 Опубликовано 29 мая, 2018 (изменено) · Жалоба Почему RX pin устанавливается как GPIO_MODE_INPUT? должна так же быть GPIO_MODE_AF настроено было по аналогии с халом из кейла void HAL_CAN_MspInit(CAN_HandleTypeDef* hcan) { GPIO_InitTypeDef GPIO_InitStruct; if(hcan->Instance==CAN1) { /* USER CODE BEGIN CAN1_MspInit 0 */ /* USER CODE END CAN1_MspInit 0 */ /* Peripheral clock enable */ __HAL_RCC_CAN1_CLK_ENABLE(); /**CAN1 GPIO Configuration PB8 ------> CAN1_RX PB9 ------> CAN1_TX */ GPIO_InitStruct.Pin = GPIO_PIN_8; GPIO_InitStruct.Mode = GPIO_MODE_INPUT; GPIO_InitStruct.Pull = GPIO_NOPULL; HAL_GPIO_Init(GPIOB, &GPIO_InitStruct); GPIO_InitStruct.Pin = GPIO_PIN_9; GPIO_InitStruct.Mode = GPIO_MODE_AF_PP; GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH; HAL_GPIO_Init(GPIOB, &GPIO_InitStruct); __HAL_AFIO_REMAP_CAN1_2(); /* Peripheral interrupt init */ HAL_NVIC_SetPriority(CAN1_RX0_IRQn, 0, 0); HAL_NVIC_EnableIRQ(CAN1_RX0_IRQn); HAL_NVIC_SetPriority(CAN1_SCE_IRQn, 0, 0); HAL_NVIC_EnableIRQ(CAN1_SCE_IRQn); /* USER CODE BEGIN CAN1_MspInit 1 */ /* USER CODE END CAN1_MspInit 1 */ } } Изменено 29 мая, 2018 пользователем IgorKossak [codebox] для длинного кода, [code] - для короткого! Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
RadiatoR 2 29 мая, 2018 Опубликовано 29 мая, 2018 · Жалоба Вообще странно. Я, конечно, не пользуюсь HAL и openlib, а использую напрямую регистры. Я ставлю обе ноги в AF Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Eddy_Em 2 29 мая, 2018 Опубликовано 29 мая, 2018 · Жалоба ТС, почитайте даташит или хотя бы примеры opencm3! Самый надежный вариант - не использовать чужие библиотеки. Только свои сниппеты, тщательно отлаженные и проверенные временем, гарантируют нормальную работу! // тоже не понял, с чего бы вдруг стал работать CAN, если ноги не в AF! Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Ekka 0 30 мая, 2018 Опубликовано 30 мая, 2018 · Жалоба ТС, почитайте даташит или хотя бы примеры opencm3! Самый надежный вариант - не использовать чужие библиотеки. Только свои сниппеты, тщательно отлаженные и проверенные временем, гарантируют нормальную работу! // тоже не понял, с чего бы вдруг стал работать CAN, если ноги не в AF! Приняты все исправления. Не помогло. Скажите, пожалуйста, а почему ящики просто инкрементруются, а кода кончаются - вываливается в ошибку. Получается, ничего не отправляется.... Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
yes 7 30 мая, 2018 Опубликовано 30 мая, 2018 · Жалоба сообщения не отправляются. вопрос - а есть на шине второе устройство, которое будет подтверждать отправку? то есть так называемый ACK вставлять статус ошибки надо посмотреть, ну или осциллографом провода - если там все время лупит (стоит auto_retransmit_enable или как-то так называется бит), то значит - это самое Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
k155la3 27 30 мая, 2018 Опубликовано 30 мая, 2018 · Жалоба ну, и, конечно извиняюсь, проверить как проводки подсоединены (да, еще раз), какие скорости обмена, наличие терминаторов. Без этого - ну никак. При условии что ничего не пропалено, если есть трансиверы - что рабочие и правильно подключены. После того, как использует все ящики - зависает. ОНО должно не зависать, а выдавать код ошибки, где и по какой причине "непонятка". Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Ekka 0 31 мая, 2018 Опубликовано 31 мая, 2018 · Жалоба ну, и, конечно извиняюсь, проверить как проводки подсоединены (да, еще раз), какие скорости обмена, наличие терминаторов. Без этого - ну никак. При условии что ничего не пропалено, если есть трансиверы - что рабочие и правильно подключены. ОНО должно не зависать, а выдавать код ошибки, где и по какой причине "непонятка". Да ошибки выдает. EWG, EVP и BOF и в последствии еще и LEC((( Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Ekka 0 31 мая, 2018 Опубликовано 31 мая, 2018 (изменено) · Жалоба Ребята, читаю про ошибки Кана. Не пойму ошибку StuffError, когда именно она возникает? Объясните мне как для тех "кто в танке", пожалуйста Изменено 31 мая, 2018 пользователем Ekka Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
esaulenka 7 31 мая, 2018 Опубликовано 31 мая, 2018 · Жалоба https://www.kvaser.com/about-can/the-can-pr...error-handling/ Bit Stuffing When five consecutive bits of the same level have been transmitted by a node, it will add a sixth bit of the opposite level to the outgoing bit stream. The receivers will remove this extra bit. This is done to avoid excessive DC components on the bus, but it also gives the receivers an extra opportunity to detect errors: if more than five consecutive bits of the same level occurs on the bus, a Stuff Error is signaled. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
yes 7 31 мая, 2018 Опубликовано 31 мая, 2018 · Жалоба EWG, EVP и BOF - это уже следствия ошибок - то есть многократные попытки автомата по передаче сообщения были неуспешными. нужно в первом прерывании по ошибке смотреть LEC - там будет код ошибки еще раз обращу внимание - второе устройство у вас подключено? CAN не работает "в одиночку", не сможет передать сообщение, если нет второго CAN-а на шине. если второе есть, то нужно смотреть, что тактовые частоты и битовые интервалы правильно настроены на обоих устройствах - у меня например это самая частая причина неустановления связи Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Ekka 0 7 июня, 2018 Опубликовано 7 июня, 2018 (изменено) · Жалоба Пытаюсь настроить устройства одинаково. stm32f4 CAN настроен на 500 кбит/сек stm32f1 тоже. Ниже привожу настройки. Но почему-то, как только пытаюсь с f4 что-то отправить или получить - вылетает в ошибки. f1 себя чувствует хорошо и не выпендривается. Что я делаю не так? Настройки кана у обоих stm-к одинаковы Вылетаю в ошибку FOR, по ней читаю что-то вроде, "Некоторые части CAN-сообщения имеют одинаковое значение во всех типах сообщений. Т.е. протокол CAN точно определяет какие уровни напряжения и когда должны появляться на шине. Если формат сообщений нарушается, то узлы генерируют ошибку Form Error". Немного не въезжаю... Где и что и ПОчему формат сообщения нарушен. Изменено 7 июня, 2018 пользователем Ekka Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Ekka 0 7 июня, 2018 Опубликовано 7 июня, 2018 · Жалоба Как можно избавиться от этой ошибки? С чем может быть такое связано? две stm32f1 нормально общаются. Стоит подключить f4 с такими же настройками, как она вылетает в ошибки. везде пишут, что это за ошибка, а как от нее отделаться не пишут( :crying: Может я сообщение не правильно формирую...О_О CanTxMsgTypeDef tx; tx.StdId = 0xFF; tx.ExtId = 0xFF; tx.RTR = CAN_RTR_DATA; tx.IDE = CAN_ID_STD; tx.DLC = 2; tx.Data[0] = 'C'; tx.Dаta[1] = 'A'; hcan1.pTxMsg = &tx; Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
yes 7 7 июня, 2018 Опубликовано 7 июня, 2018 · Жалоба если есть возможность, хорошо бы посмотреть осциллографом линию. может что-то не так с драйвером/уровнями? заодно и грубые ошибки времянки видны будут. или соединить два CAN-а в F4 между собой... не уверен на 100% но Form Error может быть из-за того, что старт бит не передается - то есть на входе CAN_RX всегда 1 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться