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

 
 
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
esaulenka
сообщение Jun 8 2018, 13:04
Сообщение #16


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

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



на F407 действительно стоит кварц частотой 26 МГц?


--------------------
Тут обсуждается творческий порыв, а не соответствие каким-либо стандартам ©
Go to the top of the page
 
+Quote Post
k155la3
сообщение Jun 9 2018, 05:07
Сообщение #17


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

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



Цитата(Ekka @ Jun 7 2018, 16:20) *
. . . две stm32f1 нормально общаются. Стоит подключить f4 с такими же настройками, как она вылетает в ошибки. . . .
Зря игнорируете рекомендацию посмотреть что на линиях осцилографом. Какие трансиверы используются, схема-номиналы выходных цепей.
Go to the top of the page
 
+Quote Post
Ekka
сообщение Jun 9 2018, 09:15
Сообщение #18


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

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



Цитата(yes @ Jun 7 2018, 15:44) *
если есть возможность, хорошо бы посмотреть осциллографом линию. может что-то не так с драйвером/уровнями? заодно и грубые ошибки времянки видны будут.

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

не уверен на 100% но Form Error может быть из-за того, что старт бит не передается - то есть на входе CAN_RX всегда 1


Все время получаю такой сигнал. Настройки stm32f4 изменены. Сейчас все stm-мы настроены на 250 kbit/s

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


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

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



Сигнал на ногц RX у stm32f4 приходит такой, как на рисунке. Но в прерывание я теперь не попадаю ни в какое.
Go to the top of the page
 
+Quote Post
esaulenka
сообщение Jun 11 2018, 08:51
Сообщение #20


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

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



Ну и что толку с этих картиночек? Вы их самостоятельно-то рассматривать пытались?
На F105 частота APB1 36 МГц, на F407 - 20 МГц. Настройки модуля CAN по-прежнему одинаковые? Ну тогда скорость у них отличается в 1.8 раза.

И под "посмотреть осциллографом" подразумевалось не "запостить картинку", а "измерить скорость шины". Методом измерения длительности одного бита и вычисления количества бит в одной секунде.

Ничего, что я здесь азбучные истины излагаю?


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


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

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



Все запустилось, проблема была в том, что вывод RS на плате болтался... После его настройки все заработало.
Go to the top of the page
 
+Quote Post
Ekka
сообщение Jun 12 2018, 08:54
Сообщение #22


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

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



мда... в кейле-то оно на хале шпарит без проблем, но вот хэта жуткая libopencm3...

В ней у меня так (для STM32f4)
Код
APB1_FREQ = 42 mHz
Prescaler (for TQ) = 24
42/24 = 1.75
1/1.75 * 1000 = 571.4 ns (Time Quantum)

Для скорости 250 kbit/s:
1/250*1000 = 4000 ns (time for One Bit)

571.4 * (1 + BS1 + BS2) = 4000
BS1+BS2 = 6 (пусть BS1 = 1, BS2 = 5)

Итого настройки CAN1 для скорости 250 Кбит/сек:
PRESC = 24
SJW = 1
BS1 = 1
BS2 = 5


Для STM32f1 (их трое, все нормально общаются)

Код
APB1_FREQ = 36 mHz
Prescaler (for TQ) = 12
36/12 = 3
1/3 * 1000 = 333.3 ns (Time Quantum)

Для скорости 250 kbit/s:
1/250*1000 = 4000 ns (time for One Bit)

333.3 * (1 + BS1 + BS2) = 4000
BS1+BS2 = 11 (пусть BS1 = 6, BS2 = 5)

Итого настройки CAN1 для скорости 250 Кбит/сек:

PRESC = 12
SJW = 1
BS1 = 6
BS2 = 5

Но на libopencm3 у меня просто виснет кан и ложит все остальные устройства (кроме передающего)...(((

Сообщение отредактировал Ekka - Jun 12 2018, 08:56
Go to the top of the page
 
+Quote Post
esaulenka
сообщение Jun 13 2018, 07:20
Сообщение #23


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

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



Ложит и ложит, хад такой...


Очередной бесценный советик. Постарайтесь понять, что это железка. Тупая и абсолютно бесчувственная. И всё эти эпитеты ей совершенно безразличны.
Что виснет? Как виснет? Что в шину передаётся? (осциллографом пора-таки воспользоваться). Что как где настроено?
Пишем подробное письмо, трижды перечитываем, пытаясь понять, что же именно написано (не простое ctrl-c ctrl-v "хотят - ну нате вам"). Можно даже не отправлять.


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


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

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



Цитата(Ekka @ Jun 12 2018, 09:41) *
Все запустилось, проблема была в том, что вывод RS на плате болтался... После его настройки все заработало.
А что сделали что "не болтается" ? какой номинал R и куда ? Повторяю вопрос, терминаторы, 120 Ом, два, не шине имеются ?
----
если работать по Вашей методе, сделайте "фото" настраиваемых регистров в работающем (HAL) и неработающем проектах (после инициализации), найдите разницу.
В IAR можно вывести несколько окон регистров и сделать скриншот. В другом проекте это можно не делать а сравнить с экрана.
---
Если собираетесь работать с CAN, попробуйте раздобыть адапетер CAN_HACKER. Удобно мониторить-снифф шины, легко перенастраивается, отображает ошибки.
Девайс и софт во многом удобнее даже фирменных утилит (по крайней мере от Kvaser).
Go to the top of the page
 
+Quote Post
Ekka
сообщение Jun 13 2018, 12:37
Сообщение #25


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

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



Похоже, была ошибка в том, что скорость у приемника и передатчика не совпадала.

Код
APB1_FREQ = 42 mHz
Prescaler (for TQ) = 24
42/24 = 1.75
1/1.75 * 1000 = 571.4 ns (Time Quantum)

Для скорости 250 kbit/s:
1/250*1000 = 4000 ns (time for One Bit)

571.4 * (1 + BS1 + BS2) = 4000
BS1+BS2 = 6 (пусть BS1 = 2, BS2 = 4)

Итого настройки CAN1 для скорости 250 Кбит/сек:
PRESC = 24
SJW = 1
BS1 = 2
BS2 = 4


Как ни странно, вот с этими настройками все запустилось на libopencm3.

СПАСИБО ОГРОМНОЕ ВСЕМ, кто ОТЗЫВАЛСЯ!!))))
Go to the top of the page
 
+Quote Post
k155la3
сообщение Jun 13 2018, 17:33
Сообщение #26


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

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



Не полагайтесь на всякие "железобетонные" расчеты. Если есть возможность проверить - всегда проверяйте соответствие заданного и полученного в реале.
ps
К Rs трансивера для скорости 250 Кбит подключайте резистор не более 1.5 - 5 кОм. (на GND)
Go to the top of the page
 
+Quote Post

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

 


RSS Текстовая версия Сейчас: 11th August 2025 - 21:01
Рейтинг@Mail.ru


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