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

 
 
2 страниц V   1 2 >  
Reply to this topicStart new topic
> libopencm3 + stm32f4 + CAN, CAN на забытой всеми библиотеке
Ekka
сообщение May 29 2018, 13:21
Сообщение #1


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

Группа: Участник
Сообщений: 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] - для короткого!
Go to the top of the page
 
+Quote Post
RadiatoR
сообщение May 29 2018, 13:44
Сообщение #2


Местный
***

Группа: Свой
Сообщений: 270
Регистрация: 8-08-15
Из: Москва
Пользователь №: 87 901



Почему RX pin устанавливается как GPIO_MODE_INPUT?

должна так же быть GPIO_MODE_AF
Go to the top of the page
 
+Quote Post
Ekka
сообщение May 29 2018, 13:51
Сообщение #3


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

Группа: Участник
Сообщений: 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] - для короткого!
Go to the top of the page
 
+Quote Post
RadiatoR
сообщение May 29 2018, 14:00
Сообщение #4


Местный
***

Группа: Свой
Сообщений: 270
Регистрация: 8-08-15
Из: Москва
Пользователь №: 87 901



Вообще странно. Я, конечно, не пользуюсь HAL и openlib, а использую напрямую регистры. Я ставлю обе ноги в AF
Go to the top of the page
 
+Quote Post
Эдди
сообщение May 29 2018, 16:50
Сообщение #5


Знающий
****

Группа: Участник
Сообщений: 825
Регистрация: 16-04-15
Из: КЧР, Нижний Архыз
Пользователь №: 86 250



ТС, почитайте даташит или хотя бы примеры opencm3!
Самый надежный вариант - не использовать чужие библиотеки. Только свои сниппеты, тщательно отлаженные и проверенные временем, гарантируют нормальную работу!
// тоже не понял, с чего бы вдруг стал работать CAN, если ноги не в AF!
Go to the top of the page
 
+Quote Post
Ekka
сообщение May 30 2018, 12:49
Сообщение #6


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

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



Цитата(Эдди @ May 29 2018, 17:50) *
ТС, почитайте даташит или хотя бы примеры opencm3!
Самый надежный вариант - не использовать чужие библиотеки. Только свои сниппеты, тщательно отлаженные и проверенные временем, гарантируют нормальную работу!
// тоже не понял, с чего бы вдруг стал работать CAN, если ноги не в AF!


Приняты все исправления.
Не помогло.

Скажите, пожалуйста, а почему ящики просто инкрементруются, а кода кончаются - вываливается в ошибку.
Получается, ничего не отправляется....
Go to the top of the page
 
+Quote Post
yes
сообщение May 30 2018, 13:00
Сообщение #7


Гуру
******

Группа: Свой
Сообщений: 2 198
Регистрация: 23-12-04
Пользователь №: 1 640



сообщения не отправляются.
вопрос - а есть на шине второе устройство, которое будет подтверждать отправку? то есть так называемый ACK вставлять
статус ошибки надо посмотреть, ну или осциллографом провода - если там все время лупит (стоит auto_retransmit_enable или как-то так называется бит), то значит - это самое
Go to the top of the page
 
+Quote Post
k155la3
сообщение May 30 2018, 13:24
Сообщение #8


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

Группа: Свой
Сообщений: 1 123
Регистрация: 8-03-09
Из: Днепр
Пользователь №: 45 848



ну, и, конечно извиняюсь, проверить как проводки подсоединены (да, еще раз), какие скорости обмена, наличие терминаторов.
Без этого - ну никак. При условии что ничего не пропалено, если есть трансиверы - что рабочие и правильно подключены.


Цитата(Ekka @ May 29 2018, 16:21) *
После того, как использует все ящики - зависает.

ОНО должно не зависать, а выдавать код ошибки, где и по какой причине "непонятка".
Go to the top of the page
 
+Quote Post
Ekka
сообщение May 31 2018, 05:36
Сообщение #9


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

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



Цитата(k155la3 @ May 30 2018, 14:24) *
ну, и, конечно извиняюсь, проверить как проводки подсоединены (да, еще раз), какие скорости обмена, наличие терминаторов.
Без этого - ну никак. При условии что ничего не пропалено, если есть трансиверы - что рабочие и правильно подключены.



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


Да ошибки выдает.

EWG, EVP и BOF и в последствии еще и LEC(((
Go to the top of the page
 
+Quote Post
Ekka
сообщение May 31 2018, 12:31
Сообщение #10


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

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



Ребята, читаю про ошибки Кана. Не пойму ошибку StuffError, когда именно она возникает? Объясните мне как для тех "кто в танке", пожалуйста

Сообщение отредактировал Ekka - May 31 2018, 12:32
Go to the top of the page
 
+Quote Post
esaulenka
сообщение May 31 2018, 12:49
Сообщение #11


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

Группа: Свой
Сообщений: 1 032
Регистрация: 13-03-08
Из: Маськва
Пользователь №: 35 877



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.


--------------------
Тут обсуждается творческий порыв, а не соответствие каким-либо стандартам ©
Go to the top of the page
 
+Quote Post
yes
сообщение May 31 2018, 13:19
Сообщение #12


Гуру
******

Группа: Свой
Сообщений: 2 198
Регистрация: 23-12-04
Пользователь №: 1 640



EWG, EVP и BOF - это уже следствия ошибок - то есть многократные попытки автомата по передаче сообщения были неуспешными.
нужно в первом прерывании по ошибке смотреть LEC - там будет код ошибки

еще раз обращу внимание - второе устройство у вас подключено? CAN не работает "в одиночку", не сможет передать сообщение, если нет второго CAN-а на шине. если второе есть, то нужно смотреть, что тактовые частоты и битовые интервалы правильно настроены на обоих устройствах - у меня например это самая частая причина неустановления связи
Go to the top of the page
 
+Quote Post
Ekka
сообщение Jun 7 2018, 11:27
Сообщение #13


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

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



Пытаюсь настроить устройства одинаково.

stm32f4 CAN настроен на 500 кбит/сек
stm32f1 тоже. Ниже привожу настройки. Но почему-то, как только пытаюсь с f4 что-то отправить или получить - вылетает в ошибки.
f1 себя чувствует хорошо и не выпендривается.

Что я делаю не так?

Настройки кана у обоих stm-к одинаковы

Вылетаю в ошибку FOR, по ней читаю что-то вроде, "Некоторые части CAN-сообщения имеют одинаковое значение во всех типах сообщений. Т.е. протокол CAN точно определяет какие уровни напряжения и когда должны появляться на шине. Если формат сообщений нарушается, то узлы генерируют ошибку Form Error". Немного не въезжаю... Где и что и ПОчему формат сообщения нарушен.

Сообщение отредактировал Ekka - Jun 7 2018, 11:31
Эскизы прикрепленных изображений
Прикрепленное изображение
Прикрепленное изображение
Прикрепленное изображение
 
Go to the top of the page
 
+Quote Post
Ekka
сообщение Jun 7 2018, 13:20
Сообщение #14


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

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



Как можно избавиться от этой ошибки? С чем может быть такое связано?
две stm32f1 нормально общаются. Стоит подключить f4 с такими же настройками, как она вылетает в ошибки.



везде пишут, что это за ошибка, а как от нее отделаться не пишут( crying.gif


Может я сообщение не правильно формирую...О_О

Код
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;

Go to the top of the page
 
+Quote Post
yes
сообщение Jun 7 2018, 15:44
Сообщение #15


Гуру
******

Группа: Свой
Сообщений: 2 198
Регистрация: 23-12-04
Пользователь №: 1 640



если есть возможность, хорошо бы посмотреть осциллографом линию. может что-то не так с драйвером/уровнями? заодно и грубые ошибки времянки видны будут.

или соединить два CAN-а в F4 между собой...

не уверен на 100% но Form Error может быть из-за того, что старт бит не передается - то есть на входе CAN_RX всегда 1
Go to the top of the page
 
+Quote Post

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

 


RSS Текстовая версия Сейчас: 17th June 2025 - 14:03
Рейтинг@Mail.ru


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