|
libopencm3 + stm32f4 + CAN, CAN на забытой всеми библиотеке |
|
|
|
May 29 2018, 13:21
|

Частый гость
 
Группа: Участник
Сообщений: 164
Регистрация: 12-04-16
Из: Белгород
Пользователь №: 91 250

|
Привет всем! Ребята, помогите, пожалуйста разобраться, что не так. Пытаюсь запустить CAN в нормальном режиме ( в loopback работает) на stm32f4 в среде CodeBlock на библиотеке libopencm3 (ибо именно оно и надо - хотя оч ненависто) После того, как использует все ящики - зависает. Почему данные не уходят из почтовых ящиков? Второе устройство на шине имеется. Может я не сбрасываю какой-то флаг? Или неправильно настройки? Инициализация CODE 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... такая гадость... понимаю, что кейл+куб лучше да я и не против. Но задача стоит именно на этих средствах сделать. ХЕЛП
Сообщение отредактировал IgorKossak - May 29 2018, 18:46
Причина редактирования: [codebox] для длинного кода, [code] - для короткого!
|
|
|
|
|
May 29 2018, 13:51
|

Частый гость
 
Группа: Участник
Сообщений: 164
Регистрация: 12-04-16
Из: Белгород
Пользователь №: 91 250

|
Цитата(RadiatoR @ May 29 2018, 14:44)  Почему RX pin устанавливается как GPIO_MODE_INPUT?
должна так же быть GPIO_MODE_AF настроено было по аналогии с халом из кейла CODE 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 */ }
}
Сообщение отредактировал IgorKossak - May 29 2018, 18:46
Причина редактирования: [codebox] для длинного кода, [code] - для короткого!
|
|
|
|
|
May 30 2018, 12:49
|

Частый гость
 
Группа: Участник
Сообщений: 164
Регистрация: 12-04-16
Из: Белгород
Пользователь №: 91 250

|
Цитата(Эдди @ May 29 2018, 17:50)  ТС, почитайте даташит или хотя бы примеры opencm3! Самый надежный вариант - не использовать чужие библиотеки. Только свои сниппеты, тщательно отлаженные и проверенные временем, гарантируют нормальную работу! // тоже не понял, с чего бы вдруг стал работать CAN, если ноги не в AF! Приняты все исправления. Не помогло. Скажите, пожалуйста, а почему ящики просто инкрементруются, а кода кончаются - вываливается в ошибку. Получается, ничего не отправляется....
|
|
|
|
|
May 30 2018, 13:24
|
Профессионал
    
Группа: Свой
Сообщений: 1 123
Регистрация: 8-03-09
Из: Днепр
Пользователь №: 45 848

|
ну, и, конечно извиняюсь, проверить как проводки подсоединены (да, еще раз), какие скорости обмена, наличие терминаторов. Без этого - ну никак. При условии что ничего не пропалено, если есть трансиверы - что рабочие и правильно подключены. Цитата(Ekka @ May 29 2018, 16:21)  После того, как использует все ящики - зависает. ОНО должно не зависать, а выдавать код ошибки, где и по какой причине "непонятка".
|
|
|
|
|
May 31 2018, 05:36
|

Частый гость
 
Группа: Участник
Сообщений: 164
Регистрация: 12-04-16
Из: Белгород
Пользователь №: 91 250

|
Цитата(k155la3 @ May 30 2018, 14:24)  ну, и, конечно извиняюсь, проверить как проводки подсоединены (да, еще раз), какие скорости обмена, наличие терминаторов. Без этого - ну никак. При условии что ничего не пропалено, если есть трансиверы - что рабочие и правильно подключены.
ОНО должно не зависать, а выдавать код ошибки, где и по какой причине "непонятка". Да ошибки выдает. EWG, EVP и BOF и в последствии еще и LEC(((
|
|
|
|
|
Jun 7 2018, 11:27
|

Частый гость
 
Группа: Участник
Сообщений: 164
Регистрация: 12-04-16
Из: Белгород
Пользователь №: 91 250

|
Пытаюсь настроить устройства одинаково. stm32f4 CAN настроен на 500 кбит/сек stm32f1 тоже. Ниже привожу настройки. Но почему-то, как только пытаюсь с f4 что-то отправить или получить - вылетает в ошибки. f1 себя чувствует хорошо и не выпендривается. Что я делаю не так? Настройки кана у обоих stm-к одинаковы Вылетаю в ошибку FOR, по ней читаю что-то вроде, "Некоторые части CAN-сообщения имеют одинаковое значение во всех типах сообщений. Т.е. протокол CAN точно определяет какие уровни напряжения и когда должны появляться на шине. Если формат сообщений нарушается, то узлы генерируют ошибку Form Error". Немного не въезжаю... Где и что и ПОчему формат сообщения нарушен.
Сообщение отредактировал Ekka - Jun 7 2018, 11:31
Эскизы прикрепленных изображений
|
|
|
|
|
Jun 7 2018, 13:20
|

Частый гость
 
Группа: Участник
Сообщений: 164
Регистрация: 12-04-16
Из: Белгород
Пользователь №: 91 250

|
Как можно избавиться от этой ошибки? С чем может быть такое связано? две stm32f1 нормально общаются. Стоит подключить f4 с такими же настройками, как она вылетает в ошибки. везде пишут, что это за ошибка, а как от нее отделаться не пишут( Может я сообщение не правильно формирую...О_О Код 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;
|
|
|
|
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|