Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: libopencm3 + stm32f4 + CAN
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > ARM
Ekka
Привет всем!

Ребята, помогите, пожалуйста разобраться, что не так.
Пытаюсь запустить 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... такая гадость... понимаю, что кейл+куб лучше
да я и не против. Но задача стоит именно на этих средствах сделать.
ХЕЛП
RadiatoR
Почему RX pin устанавливается как GPIO_MODE_INPUT?

должна так же быть GPIO_MODE_AF
Ekka
Цитата(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 */
}

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


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

Скажите, пожалуйста, а почему ящики просто инкрементруются, а кода кончаются - вываливается в ошибку.
Получается, ничего не отправляется....
yes
сообщения не отправляются.
вопрос - а есть на шине второе устройство, которое будет подтверждать отправку? то есть так называемый ACK вставлять
статус ошибки надо посмотреть, ну или осциллографом провода - если там все время лупит (стоит auto_retransmit_enable или как-то так называется бит), то значит - это самое
k155la3
ну, и, конечно извиняюсь, проверить как проводки подсоединены (да, еще раз), какие скорости обмена, наличие терминаторов.
Без этого - ну никак. При условии что ничего не пропалено, если есть трансиверы - что рабочие и правильно подключены.


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

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



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


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

EWG, EVP и BOF и в последствии еще и LEC(((
Ekka
Ребята, читаю про ошибки Кана. Не пойму ошибку StuffError, когда именно она возникает? Объясните мне как для тех "кто в танке", пожалуйста
esaulenka
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
EWG, EVP и BOF - это уже следствия ошибок - то есть многократные попытки автомата по передаче сообщения были неуспешными.
нужно в первом прерывании по ошибке смотреть LEC - там будет код ошибки

еще раз обращу внимание - второе устройство у вас подключено? CAN не работает "в одиночку", не сможет передать сообщение, если нет второго CAN-а на шине. если второе есть, то нужно смотреть, что тактовые частоты и битовые интервалы правильно настроены на обоих устройствах - у меня например это самая частая причина неустановления связи
Ekka
Пытаюсь настроить устройства одинаково.

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

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

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

Вылетаю в ошибку FOR, по ней читаю что-то вроде, "Некоторые части CAN-сообщения имеют одинаковое значение во всех типах сообщений. Т.е. протокол CAN точно определяет какие уровни напряжения и когда должны появляться на шине. Если формат сообщений нарушается, то узлы генерируют ошибку Form Error". Немного не въезжаю... Где и что и ПОчему формат сообщения нарушен.
Ekka
Как можно избавиться от этой ошибки? С чем может быть такое связано?
две 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;

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

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

не уверен на 100% но Form Error может быть из-за того, что старт бит не передается - то есть на входе CAN_RX всегда 1
esaulenka
на F407 действительно стоит кварц частотой 26 МГц?
k155la3
Цитата(Ekka @ Jun 7 2018, 16:20) *
. . . две stm32f1 нормально общаются. Стоит подключить f4 с такими же настройками, как она вылетает в ошибки. . . .
Зря игнорируете рекомендацию посмотреть что на линиях осцилографом. Какие трансиверы используются, схема-номиналы выходных цепей.
Ekka
Цитата(yes @ Jun 7 2018, 15:44) *
если есть возможность, хорошо бы посмотреть осциллографом линию. может что-то не так с драйвером/уровнями? заодно и грубые ошибки времянки видны будут.

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

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


Все время получаю такой сигнал. Настройки stm32f4 изменены. Сейчас все stm-мы настроены на 250 kbit/s
Ekka
Сигнал на ногц RX у stm32f4 приходит такой, как на рисунке. Но в прерывание я теперь не попадаю ни в какое.
esaulenka
Ну и что толку с этих картиночек? Вы их самостоятельно-то рассматривать пытались?
На F105 частота APB1 36 МГц, на F407 - 20 МГц. Настройки модуля CAN по-прежнему одинаковые? Ну тогда скорость у них отличается в 1.8 раза.

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

Ничего, что я здесь азбучные истины излагаю?
Ekka
Все запустилось, проблема была в том, что вывод RS на плате болтался... После его настройки все заработало.
Ekka
мда... в кейле-то оно на хале шпарит без проблем, но вот хэта жуткая 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 у меня просто виснет кан и ложит все остальные устройства (кроме передающего)...(((
esaulenka
Ложит и ложит, хад такой...


Очередной бесценный советик. Постарайтесь понять, что это железка. Тупая и абсолютно бесчувственная. И всё эти эпитеты ей совершенно безразличны.
Что виснет? Как виснет? Что в шину передаётся? (осциллографом пора-таки воспользоваться). Что как где настроено?
Пишем подробное письмо, трижды перечитываем, пытаясь понять, что же именно написано (не простое ctrl-c ctrl-v "хотят - ну нате вам"). Можно даже не отправлять.
k155la3
Цитата(Ekka @ Jun 12 2018, 09:41) *
Все запустилось, проблема была в том, что вывод RS на плате болтался... После его настройки все заработало.
А что сделали что "не болтается" ? какой номинал R и куда ? Повторяю вопрос, терминаторы, 120 Ом, два, не шине имеются ?
----
если работать по Вашей методе, сделайте "фото" настраиваемых регистров в работающем (HAL) и неработающем проектах (после инициализации), найдите разницу.
В IAR можно вывести несколько окон регистров и сделать скриншот. В другом проекте это можно не делать а сравнить с экрана.
---
Если собираетесь работать с CAN, попробуйте раздобыть адапетер CAN_HACKER. Удобно мониторить-снифф шины, легко перенастраивается, отображает ошибки.
Девайс и софт во многом удобнее даже фирменных утилит (по крайней мере от Kvaser).
Ekka
Похоже, была ошибка в том, что скорость у приемника и передатчика не совпадала.

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

СПАСИБО ОГРОМНОЕ ВСЕМ, кто ОТЗЫВАЛСЯ!!))))
k155la3
Не полагайтесь на всякие "железобетонные" расчеты. Если есть возможность проверить - всегда проверяйте соответствие заданного и полученного в реале.
ps
К Rs трансивера для скорости 250 Кбит подключайте резистор не более 1.5 - 5 кОм. (на GND)
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.