Перейти к содержанию

Привет всем!

 

Ребята, помогите, пожалуйста разобраться, что не так.

Пытаюсь запустить 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... такая гадость... понимаю, что кейл+куб лучше

да я и не против. Но задача стоит именно на этих средствах сделать.

ХЕЛП

Изменено пользователем IgorKossak
[codebox] для длинного кода, [code] - для короткого!

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

 

должна так же быть GPIO_MODE_AF

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
Почему 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 */
 }

}

Изменено пользователем IgorKossak
[codebox] для длинного кода, [code] - для короткого!

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Вообще странно. Я, конечно, не пользуюсь HAL и openlib, а использую напрямую регистры. Я ставлю обе ноги в AF

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

ТС, почитайте даташит или хотя бы примеры opencm3!

Самый надежный вариант - не использовать чужие библиотеки. Только свои сниппеты, тщательно отлаженные и проверенные временем, гарантируют нормальную работу!

// тоже не понял, с чего бы вдруг стал работать CAN, если ноги не в AF!

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
ТС, почитайте даташит или хотя бы примеры opencm3!

Самый надежный вариант - не использовать чужие библиотеки. Только свои сниппеты, тщательно отлаженные и проверенные временем, гарантируют нормальную работу!

// тоже не понял, с чего бы вдруг стал работать CAN, если ноги не в AF!

 

Приняты все исправления.

Не помогло.

 

Скажите, пожалуйста, а почему ящики просто инкрементруются, а кода кончаются - вываливается в ошибку.

Получается, ничего не отправляется....

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

сообщения не отправляются.

вопрос - а есть на шине второе устройство, которое будет подтверждать отправку? то есть так называемый ACK вставлять

статус ошибки надо посмотреть, ну или осциллографом провода - если там все время лупит (стоит auto_retransmit_enable или как-то так называется бит), то значит - это самое

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

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

 

 

После того, как использует все ящики - зависает.

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

 

Поделиться сообщением


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

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

 

 

 

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

 

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

 

EWG, EVP и BOF и в последствии еще и LEC(((

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

Изменено пользователем Ekka

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

нужно в первом прерывании по ошибке смотреть LEC - там будет код ошибки

 

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

 

stm32f4 CAN настроен на 500 кбит/сек

stm32f1 тоже. Ниже привожу настройки. Но почему-то, как только пытаюсь с f4 что-то отправить или получить - вылетает в ошибки.

f1 себя чувствует хорошо и не выпендривается.

 

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

 

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

 

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

post-91250-1528370683_thumb.jpg

post-91250-1528370797_thumb.jpg

post-91250-1528370808_thumb.jpg

Изменено пользователем Ekka

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Как можно избавиться от этой ошибки? С чем может быть такое связано?

две 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;

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

 

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

 

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Для публикации сообщений создайте учётную запись или авторизуйтесь

Вы должны быть пользователем, чтобы оставить комментарий

Создать учетную запись

Зарегистрируйте новую учётную запись в нашем сообществе. Это очень просто!

Регистрация нового пользователя

Войти

Уже есть аккаунт? Войти в систему.

Войти