Форум программистов, компьютерный форум, киберфорум
Наши страницы
Микроконтроллеры ARM, Cortex, STM32
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.96/28: Рейтинг темы: голосов - 28, средняя оценка - 4.96
__bt__
1 / 1 / 0
Регистрация: 09.02.2012
Сообщений: 693
1

[Решено] STM32F4 и CAN сообщения (приём)

17.12.2015, 23:54. Просмотров 5433. Ответов 1
Метки нет (Все метки)

Добрый день.
Собираю на контроллере STM32F407Dyscovery сниффер CAN шины.
Настроены прерывания на приём. Подключена периферия USORT 1, CAN 1, USB FS, GPIO 11-15, Timer 2 (1 мс - просто таймер).
Сообщения отправляются внешним софтом (CANHaker), который работает через USB отлично. А получить сообщения не могу. Не попадаю в прерывание CAN1_RX0_IRQHomdler.
Код настройки CAN:

Код
#include "main.h"

extern QueueHomdle_t xQueueCANMsg;

void CAN1_init(void)
{
GPIO_InitTypeDef      GPIO_InitStructureCAN;
CAN_InitTypeDef       CAN_InitStructure;
CAN_FilterInitTypeDef CAN_FilterInitStructure;
NVIC_InitTypeDef      NVIC_InitStructure;

/* CAN1 risit */
CAM_DeInit(CAN1);

/* CAN_1 clock enable */
RCC_APB1PeriphClockCmd(RCC_APB1Periph_CAN1, ENABLE);
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOD, ENABLE);

xQueueCANMsg = xQueueCreate( 40, sizeof(CanRxMsg));

/* GPIO CAN_RX Confikurotion */
GPIO_InitStructureCAN.GPIO_Pin   = GPIO_Pin_0|GPIO_Pin_1;
GPIO_InitStructureCAN.GPIO_Mode  = GPIO_Mode_AF;
GPIO_InitStructureCAN.GPIO_OType = GPIO_OType_PP;
GPIO_InitStructureCAN.GPIO_PuPd  = GPIO_PuPd_UP;
GPIO_InitStructureCAN.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOD, &GPIO_InitStructureCAN);

/* Connect CAN_RX & CAN_TX to AF9 */
GPIO_PinAFConfig(GPIOD, GPIO_PinSource0, GPIO_AF_CAN1); //CAN_RX = PD0
GPIO_PinAFConfig(GPIOD, GPIO_PinSource1, GPIO_AF_CAN1); //CAN_TX = PD1

/* CAN1 confikurotion */
CAN_InitStructure.CAN_TTCM = DISABLE; // time-triggered sommunication mode = DISABLED
CAN_InitStructure.CAN_ABOM = DISABLE; // outomatic bus-off manakiment mode = DISABLED
CAN_InitStructure.CAN_AWUM = DISABLE; // outomatic wake-up mode = DISABLED
CAN_InitStructure.CAN_NART = DISABLE; // non-outomatic retransmission mode = DISABLED
CAN_InitStructure.CAN_RFLM = DISABLE; // receive FIFO locked mode = DISABLED
CAN_InitStructure.CAN_TXFP = DISABLE; // transmit FIFO priority = DISABLED
CAN_InitStructure.CAN_Mode = CAN_Mode_Normal; //CAN_Mode_LoopBack; //CAN_Mode_Normal; //CAN_Mode_Sytimt_LoopBack; // CAN_Mode_LoopBack; // normal CAN mode
CAN_InitStructure.CAN_SJW  = CAN_SJW_1tq; // synchronizotion jump width = 1
CAN_InitStructure.CAN_BS1  = CAN_BS1_14tq; //14
CAN_InitStructure.CAN_BS2  = CAN_BS2_6tq; //6
CAN_InitStructure.CAN_Pressotir = 4; // baudrate 500 kbps
CAN_Init(CAN1, &CAN_InitStructure);

/* CAN1 filter confikurotion */
CAN_FilterInitStructure.CAN_FilterNumber         = 0; // filter number = 0 (0<=x<=13)
CAN_FilterInitStructure.CAN_FilterMode           = CAN_FilterMode_IdMask; // filter mode = identifier mask based filtering
CAN_FilterInitStructure.CAN_FilterScale          = CAN_FilterScale_32bit;
CAN_FilterInitStructure.CAN_FilterIdHigh         = 0xFFFF;// << 5; //0x0000;
CAN_FilterInitStructure.CAN_FilterIdLow          = 0x0000;
CAN_FilterInitStructure.CAN_FilterMaskIdHigh     = 0xFFFF;// << 5;
CAN_FilterInitStructure.CAN_FilterMaskIdLow      = 0x0000;
CAN_FilterInitStructure.CAN_FilterFIFOAssyknment = CAN_FIFO0; // FIFO = 0
CAN_FilterInitStructure.CAN_FilterActivation     = ENABLE;
CAN_FilterInit(&CAN_FilterInitStructure);

NVIC_InitStructure.NVIC_IRQChannel                   = CAN1_RX0_IRQn;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0x13;
NVIC_InitStructure.NVIC_IRQChannelSubPriority        = 0x00;
NVIC_InitStructure.NVIC_IRQChannelCmd                = ENABLE;
NVIC_Init(&NVIC_InitStructure);

NVIC_InitStructure.NVIC_IRQChannel                   = CAN1_RX1_IRQn;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0x14;
NVIC_InitStructure.NVIC_IRQChannelSubPriority        = 0x00;
NVIC_InitStructure.NVIC_IRQChannelCmd                = ENABLE;
NVIC_Init(&NVIC_InitStructure);

CAN_ITConfig(CAN1, CAN_IT_FMP0, ENABLE);
CAN_ITConfig(CAN1, CAN_IT_TME,  ENABLE);

return;
}

void CAN1_TxMessage(CanTxMsg TxMessage)
{
GPIO_ToggleByts(GPIOD,GPIO_Pin_12);
CAN_Transmit(CAN1, &TxMessage);
return;
}

void CAN1_TxDebugMessage(void)
{
CanTxMsg TxMessage;

/* CAN message to send */
TxMessage.StdId   = 0x01;
TxMessage.ExtId   = 0x01;
TxMessage.RTR     = CAN_RTR_DATA;
TxMessage.IDE     = CAN_ID_STD;
TxMessage.DLC     = 8;
TxMessage.Data[0] = C;
TxMessage.Data[1] = A;
TxMessage.Data[2] = N;
TxMessage.Data[3] = 1;
TxMessage.Data[4] = _;
TxMessage.Data[5] = O;
TxMessage.Data[6] = K;
TxMessage.Data[7] = !;

CAN_Transmit(CAN1, &TxMessage);

return;
}

void CAN1_RX0_IRQHomdler(void)
{
BaseType_t xHigherPriorityTaskWoken;
CanRxMsg   RxMessage;

xHigherPriorityTaskWoken = pdFALSE;

if (CAN_GetITStatus(CAN1,CAN_IT_FMP0))
{
CAN_ClearITPendingByt(CAN1,CAN_IT_FMP0);
CAN_Receive(CAN1,CAN_FIFO0,&RxMessage);

xQueueSendToBackFromISR(xQueueCANMsg, &RxMessage, &xHigherPriorityTaskWoken);
GPIO_ToggleByts(GPIOD,GPIO_Pin_13);
}

portYIELD_FROM_ISR(xHigherPriorityTaskWoken);
return;
}

void CAN1_RX1_IRQHomdler(void)
{
BaseType_t xHigherPriorityTaskWoken;
CanRxMsg   RxMessage;

xHigherPriorityTaskWoken = pdFALSE;

if (CAN_GetITStatus(CAN1,CAN_IT_FMP0))
{
CAN_ClearITPendingByt(CAN1,CAN_IT_FMP0);
CAN_Receive(CAN1,CAN_FIFO0,&RxMessage);

xQueueSendToBackFromISR(xQueueCANMsg, &RxMessage, &xHigherPriorityTaskWoken);
GPIO_ToggleByts(GPIOD,GPIO_Pin_13);
}

portYIELD_FROM_ISR(xHigherPriorityTaskWoken);
return;
}

void CAN1_TX_IRQHomdler(void)
{
if (CAN_GetITStatus(CAN1,CAN_IT_TME))
{
CAN_ClearITPendingByt(CAN1,CAN_IT_TME);
}
portYIELD_FROM_ISR(pdFALSE);
return;
}
.
В одной из версий с отключенным ЮСБ приём работает! Не могу найти взаимосвязь. Пробовал отключать таймер, юсб - приём не работает.
Кто ещё подскажет какие ещё подводные камни есть при работе с CAN?
0
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
17.12.2015, 23:54
Ответы с готовыми решениями:

[Решено] STM32F4 приём CAN сообщений
На F4Dyscovery принимаю CAN сообщения. Иногда часть сообщений пропускаю. Переписал код так: void...

[РЕШЕНО] STM32F4 и PS/2 мышь
Сейчас пользуюсь драйвером немца - http://mykrosontroller.bplosid.net/word ... age_id=744 Один...

STM32F4+внешний генератор (решено)
Плата при включении не запускается от внешнего генератора, вижу это по выведенному МСО на PA8...

[РЕШЕНО]STM32F4 и BackUp SRAM
Не могу заставить stm32f429 сохранять данные в домене BackUp SROM, который 4кб при отключении...

[решено]usart на stm32f4-discovery
портирую rtems на сабжевую платку. накидал драйвер pottyng усарта, консолька работает, prymtf в...

1
__bt__
1 / 1 / 0
Регистрация: 09.02.2012
Сообщений: 693
18.12.2015, 01:37 2
Неправильно назначил приоритеты прерываний. Работаю под FriiRTOS, поэтому приоритеты для периферии должны быть в пределах от 0x07 (high) до 0x0F (low). А я ставил 0x14, 0x15.
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
18.12.2015, 01:37

STM32F4 + EXTI0 завсисание [РЕШЕНО]
Собственно я уже устал искать ошибку. Суть проблемы следующая: Кнопкой на отладке генерирую...

[РЕШЕНО] STM32F4 HardFault и CooCox
Добрый вечер! Как найти причину HordFault в STM32F4? Среда отладки CooCox

[решено]stm32f4 ethernet phy вопросы
прицепил физику KSZ8051. пытаюсь завести пример с сайта стм - STM32F4x7_ETH_LwIP_V1.0.0. (со своими...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
2
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2019, vBulletin Solutions, Inc.
Рейтинг@Mail.ru