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

Проблема С Can В Stm32F042


megavolt3101

Рекомендуемые сообщения

Доброго времени суток форумчане. Вторую неделю не могу запустить can на STM32F042. Инициализацию брал с STM32F0xx_Snippets_Package_V1.0.0 с примера работы для STM32F072. Пример скорее всего рабочий. Но процессор у меня в корпусе 20 ножек. По там нет кановских ножек PA_11 и PA_12. Их нужно ремапить на ноги PA_9 и PA_10. Во всем остальном вроде как инициализация должна подойти для моего процессора. Но осциллограф молчит . Инициализация вешается на цикле

while((CAN->MSR & CAN_MSR_INAK)==CAN_MSR_INAK)

{

}

Инициализация в loopback режиме. С каном только начал работать, поэтому мало что в нем понимаю. Во всем интернете не нашел не одного примера инициализации кроме приведенного выше для F0 линейки STM. Думаю может я ремапнул ноги как то не правильно или еще где какая детская ошибка ? В описании примера написано что на ноге PA12 я могу отследить, работает ли передача. Но увы… Привожу код инициализации, может кто чем поможет.

Инициализация ног КАН

__INLINE void Configure_GPIO_CAN(void)

{

RCC->AHBENR |= RCC_AHBENR_GPIOAEN;

SYSCFG->CFGR1 |= SYSCFG_CFGR1_PA11_PA12_RMP; // Добавил ремап для ног PA_9, PA_10

GPIOA->MODER = (GPIOA->MODER & ~(GPIO_MODER_MODER11 | GPIO_MODER_MODER12))\

| (GPIO_MODER_MODER11_1 | GPIO_MODER_MODER12_1); /* (1) */

GPIOA->AFR[1] = (GPIOA->AFR[1] &~ (GPIO_AFRH_AFR11 | GPIO_AFRH_AFR12))\

| (4 << (3 * 4)) | (4 << (4 * 4));

}

Инициализация Кана:

__INLINE void Configure_CAN(void)

{

RCC->APB1ENR |= RCC_APB1ENR_CANEN;

CAN->MCR |= CAN_MCR_INRQ; /* (1) */

while((CAN->MSR & CAN_MSR_INAK)!=CAN_MSR_INAK) /* (2) */

{

}

CAN->MCR &=~ CAN_MCR_SLEEP; /* (3) */

CAN->BTR |= CAN_BTR_LBKM | 2 << 20 | 3 << 16 | 5 << 0; /* (4) */

CAN->MCR &=~ CAN_MCR_INRQ;

while((CAN->MSR & CAN_MSR_INAK)==CAN_MSR_INAK) /* (6) */

{

}

// Из цикла программа не выходит!!!

GPIOA->ODR ^= GPIO_ODR_5;

CAN->FMR = CAN_FMR_FINIT; /* (7) */

CAN->FA1R = CAN_FA1R_FACT0; /* (8) */

#if (FILTER_LIST)

CAN->FM1R = CAN_FM1R_FBM0; /* (9) */

CAN->sFilterRegister[0].FR1 = CAN_ID2 << 5 | CAN_ID1 << (16+5); /* (10) */

#else

CAN->sFilterRegister[0].FR1 = CAN_ID1 << 5 | CAN_ID_MASK << 16; /* (11) */

#endif

CAN->FMR &=~ CAN_FMR_FINIT; /* (12) */

CAN->IER |= CAN_IER_FMPIE0; /* (13) */

NVIC_SetPriority(CEC_CAN_IRQn, 1); /* (16) */

NVIC_EnableIRQ(CEC_CAN_IRQn); /* (17) */

}

Передача данных:

Void TRANSMIT() {

if ((CAN->TSR & CAN_TSR_TME0) == CAN_TSR_TME0) /* (1) */

{

CAN->sTxMailBox[0].TDTR = 1;

CAN->sTxMailBox[0].TDLR = CMD;

CAN->sTxMailBox[0].TIR = (uint32_t)(CAN_ID << 21

| CAN_TI0R_TXRQ); /* (4) */

}

} // Из Референсе мануал на STM32F0

Дефайны программы.

#define CMD_TOGGLE (0xDA)

#define CAN_ID_MASK (0xFF70U)

#define CAN_ID1 (0x651U)

#define CAN_ID2 (0x652U)

#define FILTER_LIST (0)

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

  • 2 недели спустя...

Реклама: ООО ТД Промэлектроника, ИНН: 6659197470, Тел: 8 (800) 1000-321

Ура! Заработала передача данных по КАНУ, правда с использованием Периф драйвера.

Выкладываю код. Кому может пригодится. Для STM32F042F4P6 с кварцем 8 МГЦ и тактовой

частотой самого процессора 48 МГц. На ножках PA10 – TX, PA9 – RX;

Инициализация КАНА:

{

GPIO_InitTypeDef GPIO_InitStructure;

NVIC_InitTypeDef NVIC_InitStructure;

CAN_InitTypeDef CAN_InitStructure;

/*Конфигурация ножек

RCC->APB2ENR |= RCC_APB2ENR_SYSCFGEN; // Тактирования SYSCONFIG

SYSCFG->CFGR1 |= SYSCFG_CFGR1_PA11_PA12_RMP; // Ремап ножек PA10 PA9 на PA12 PA11

/CAN Интерфейс на 4 альтернативной функции/

GPIO_PinAFConfig(CAN_GPIO_PORT, CAN_RX_SOURCE, CAN_AF_PORT);

GPIO_PinAFConfig(CAN_GPIO_PORT, CAN_TX_SOURCE, CAN_AF_PORT);

/* Конфигурация CAN RX и TX */

GPIO_InitStructure.GPIO_Pin = CAN_RX_PIN | CAN_TX_PIN;

GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;

GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;

GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;

GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;

GPIO_Init(CAN_GPIO_PORT, &GPIO_InitStructure);

/* CAN NVIC Конфигурация **************************************************/

NVIC_InitStructure.NVIC_IRQChannel = CEC_CAN_IRQn;

NVIC_InitStructure.NVIC_IRQChannelPriority = 0;

NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;

NVIC_Init(&NVIC_InitStructure);

/* CAN configuration ********************************************************/

/* Enable CAN clock */

RCC_APB1PeriphClockCmd(CAN_CLK, ENABLE);

/* CAN register init */

CAN_DeInit(CANx);

CAN_StructInit(&CAN_InitStructure);

/* CAN cell init */

CAN_InitStructure.CAN_TTCM = DISABLE;

CAN_InitStructure.CAN_ABOM = DISABLE;

CAN_InitStructure.CAN_AWUM = DISABLE;

CAN_InitStructure.CAN_NART = DISABLE;

CAN_InitStructure.CAN_RFLM = ENABLE;

CAN_InitStructure.CAN_TXFP = ENABLE;

CAN_InitStructure.CAN_Mode = CAN_Mode_Normal;

CAN_InitStructure.CAN_SJW = CAN_SJW_1tq;

CAN_InitStructure.CAN_BS1 = CAN_BS1_4tq; //Необходимые предделители

CAN_InitStructure.CAN_BS2 = CAN_BS2_3tq; // Необходимые предделители

CAN_InitStructure.CAN_Prescaler = 5; //Необходимые предделители

CAN_Init(CANx, &CAN_InitStructure);

/* Конфигурация фильтров */

CAN_FilterInitStructure.CAN_FilterNumber = 0;

CAN_FilterInitStructure.CAN_FilterMode = CAN_FilterMode_IdList;

CAN_FilterInitStructure.CAN_FilterScale = CAN_FilterScale_32bit;

CAN_FilterInitStructure.CAN_FilterIdHigh =0x0000;// Нафиг фильтр

CAN_FilterInitStructure.CAN_FilterIdLow = 0x0000; ;// Нафиг фильтр

CAN_FilterInitStructure.CAN_FilterMaskIdHigh = 0x0000;

CAN_FilterInitStructure.CAN_FilterMaskIdLow = 0x0000;

CAN_FilterInitStructure.CAN_FilterFIFOAssignment = 0;

CAN_FilterInitStructure.CAN_FilterActivation = ENABLE;

CAN_FilterInit(&CAN_FilterInitStructure);

/* Transmit Structure preparation */

TxMessage.StdId =200;

TxMessage.ExtId = 1998;

TxMessage.RTR = CAN_RTR_DATA;

TxMessage.IDE = CAN_ID_STD;

TxMessage.DLC = 1;

/* Enable FIFO 0 full Interrupt */

CAN_ITConfig(CANx, CAN_IT_FF0, ENABLE);

/* Enable FIFO 1 full Interrupt */

CAN_ITConfig(CANx, CAN_IT_FF1, ENABLE);

Дефайны в шапке программы:

#define CAN_GPIO_CLK RCC_AHBPeriph_GPIOA

#define CAN_GPIO_PORT GPIOA

#define CAN_RX_SOURCE GPIO_PinSource11

#define CAN_TX_SOURCE GPIO_PinSource12

#define CAN_AF_PORT GPIO_AF_4

#define CAN_RX_PIN GPIO_Pin_11

#define CAN_TX_PIN GPIO_Pin_12

#define CAN_CLK RCC_APB1Periph_CAN

#define CANx CAN

uint8_t TxMessages[6] = { 0, 1, 2, 3, 4, 5 };

uint8_t

CAN_DATA0,CAN_DATA1,CAN_DATA2,CAN_DATA3,CAN_DATA4,CAN_DATA5,CAN_DATA6,CAN_DATA7;

uint8_t CanFlag,Display;

Ну и передача данных:

void transmitt(void) {

TxMessage.StdId = 14;

TxMessage.RTR = CAN_RTR_DATA;

TxMessage.IDE = CAN_ID_STD;

TxMessage.DLC = 8;

TxMessage.Data[0] = 'P';

TxMessage.Data[1] = 'R';

TxMessage.Data[2] = 'E';

TxMessage.Data[3] = 'V';

TxMessage.Data[4] = 'E';

TxMessage.Data[5] = 'D';

TxMessage.Data[6] = '!';

TxMessage.Data[7] = ' ';

CAN_Transmit(CANx,&TxMessage);

}

Передачу данных осуществлял на плату OPEN103V. К ней уже шли готовые примеры. На

плате OPEN103V Прекрасно работает и передача и прерывание по приему данных. Вот у

меня осталась главная проблема как сейчас на моем stm32f042 организовать прием.

Функция

void CEC_CAN_IRQHandler (void) {

LED_1_RED(1);

}

я так понимаю должна срабатывать по приему любого символа но светодиод не

загорается, стало быть прерывание по приему не срабатывает. В чем может быть ошибка.

Может я опять где что забыл объявить, ну вроде в NVIC прерывание по приему и так

назначено. Что может быть не так ???

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

  • 2 недели спустя...

20% скидка на весь каталог электронных компонентов в ТМ Электроникс!

Акция "Лето ближе - цены ниже", успей сделать выгодные покупки!

Плюс весь апрель действует скидка 10% по промокоду APREL24 + 15% кэшбэк и бесплатная доставка!

Перейти на страницу акции

Реклама: ООО ТМ ЭЛЕКТРОНИКС, ИНН: 7806548420, info@tmelectronics.ru, +7(812)4094849

NVIC_InitTypeDef NVIC_InitStructure;

NVIC_PriorityGroupConfig(NVIC_PriorityGroup_0);

NVIC_InitStructure.NVIC_IRQChannel = USB_LP_CAN1_RX0_IRQn;;

NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0x0;

NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0x0;

NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;

NVIC_Init(&NVIC_InitStructure);

void USB_LP_CAN1_RX0_IRQHandler (void)

{

if (CAN_GetITStatus(CAN1,CAN_IT_FMP0))

{ // message pending ?

CAN_Receive(CAN1,0,&RxMessage); // read the message

// set receive flag

}

}

я делал на f103 прерывание работает, только с фильтром разобраться немогу

Изменено пользователем Кинг
Ссылка на комментарий
Поделиться на другие сайты

Выбираем схему BMS для корректной работы литий-железофосфатных (LiFePO4) аккумуляторов

 Обязательным условием долгой и стабильной работы Li-FePO4-аккумуляторов, в том числе и производства EVE Energy, является применение специализированных BMS-микросхем. Литий-железофосфатные АКБ отличаются такими характеристиками, как высокая многократность циклов заряда-разряда, безопасность, возможность быстрой зарядки, устойчивость к буферному режиму работы и приемлемая стоимость. Но для этих АКБ, также как и для других, очень важен контроль процесса заряда и разряда, а специализированных микросхем для этого вида аккумуляторов не так много. Инженеры КОМПЭЛ подготовили список имеющихся микросхем и возможных решений от разных производителей. Подробнее>>

Реклама: АО КОМПЭЛ, ИНН: 7713005406, ОГРН: 1027700032161

Кан заработал. Может кому понадобится код. Для stm32F0xx

Шапка программы:

#include "stm32f0xx.h"

#include "stm32f0xx_can.h"

CanTxMsg TxMessage = {0};

uint8_t

CAN_DATA0,CAN_DATA1,CAN_DATA2,CAN_DATA3,CAN_DATA4,CAN_DATA5,CAN_

DATA6,CAN_DATA7;

uint16_t CAN_ID;

CAN_InitTypeDef CAN_InitStructure;

void Configure_GPIO_CAN(void);

void Configure_CAN(void);

void delay_ms(uint16_t time);

void delay_us(uint16_t time);

void LEDS_INIT(void);

void LED_1_RED(int a);

void LED_2_YELLOW(int a);

void LED_3_GREEN(int a);

void LED_4_BLUE(int a);

void KNOPS_INIT(void);

int KNOPS_1(void);

int KNOPS_2(void);

int KNOPS_3(void);

int KNOPS_4(void);

#define CMD_TOGGLE (0xDA)

#define CAN_ID_MASK (0xFF70U)

#define CAN_ID1 (0x651U)

#define CAN_ID2 (0x652U)

Инициализация ножек CAN

//*****************************************************НОГИ КАНА

__INLINE void Configure_GPIO_CAN(void)

{

RCC->AHBENR |= RCC_AHBENR_GPIOAEN;

RCC->APB2ENR |= RCC_APB2ENR_SYSCFGEN;

SYSCFG->CFGR1 |= SYSCFG_CFGR1_PA11_PA12_RMP;

GPIOA->MODER = (GPIOA->MODER & ~(GPIO_MODER_MODER11 |

GPIO_MODER_MODER12))\

| (GPIO_MODER_MODER11_1 | GPIO_MODER_MODER12_1);

GPIOA->AFR[1] = (GPIOA->AFR[1] &~ (GPIO_AFRH_AFR11 |

GPIO_AFRH_AFR12))\

| (4 << (3 * 4)) | (4 << (4 * 4));

}

//*****************************************************НОГИ КАНА

//****************************************************КОНФИГУРАЦ

ИЯ КАНА

__INLINE void Configure_CAN(void)

{

RCC->APB1ENR |= RCC_APB1ENR_CANEN;

CAN->MCR |= CAN_MCR_INRQ;

while((CAN->MSR & CAN_MSR_INAK)!=CAN_MSR_INAK)

{

}

CAN->MCR &=~CAN_MCR_SLEEP ;

CAN_StructInit(&CAN_InitStructure);

CAN_InitStructure.CAN_SJW = CAN_SJW_1tq;

CAN_InitStructure.CAN_BS1 = CAN_BS1_4tq;

CAN_InitStructure.CAN_BS2 = CAN_BS2_3tq;

CAN_InitStructure.CAN_Prescaler = 5;

CAN_Init(CAN, &CAN_InitStructure);

CAN->MCR &=~ CAN_MCR_INRQ;

while((CAN->MSR & CAN_MSR_INAK)==CAN_MSR_INAK)

{

}

CAN->sFilterRegister[0].FR1 = 0; /* (11) */

CAN->FMR = CAN_FMR_FINIT;

CAN->FA1R = CAN_FA1R_FACT0;

CAN->FMR &=~ CAN_FMR_FINIT;

CAN->IER |= CAN_IER_FMPIE0;

NVIC_SetPriority(CEC_CAN_IRQn, 0);

NVIC_EnableIRQ(CEC_CAN_IRQn);

}

//****************************************************КОНФИГУРАЦ

ИЯ КАНА

//**************************************************Отправка

строки по CAN

void CAN_WRITE_DATA(int number_id,char str[8]) {

TxMessage.StdId =number_id;

TxMessage.RTR = CAN_RTR_DATA;

TxMessage.IDE = CAN_ID_STD;

TxMessage.DLC = 8;

TxMessage.Data[0] = str[0];

TxMessage.Data[1] = str[1];

TxMessage.Data[2] = str[2];

TxMessage.Data[3] = str[3];

TxMessage.Data[4] = str[4];

TxMessage.Data[5] = str[5];

TxMessage.Data[6] = str[6];

TxMessage.Data[7] = str[7];

CAN_Transmit(CAN,&TxMessage);

}

//**************************************************Отправка

строки по CAN

Бесконечный цикл с опросом кнопок

while (1){

delay_ms(500);

if (KNOPS_1()==0) CAN_WRITE_DATA(1000,"YURIK");

if (KNOPS_2()==0) CAN_WRITE_DATA(1001,"DURIK");

}

}

Прерывание по приему CAN

void CEC_CAN_IRQHandler(void)

{

CanRxMsg RxMessage;

CAN_Receive(CAN,CAN_FIFO0, &RxMessage);

CAN_ID=RxMessage.StdId;

CAN_DATA0=RxMessage.Data[0];

CAN_DATA1=RxMessage.Data[1];

CAN_DATA2=RxMessage.Data[2];

CAN_DATA3=RxMessage.Data[3];

CAN_DATA4=RxMessage.Data[4];

CAN_DATA5=RxMessage.Data[5];

CAN_DATA6=RxMessage.Data[6];

CAN_DATA7=RxMessage.Data[7];

CAN_ClearITPendingBit(CAN,CAN_IT_FMP0);

if (RxMessage.Data[0]=='Y') LED_1_RED(1),LED_2_YELLOW(1),

LED_3_GREEN(0),LED_4_BLUE(0);

if (RxMessage.Data[0]=='D') LED_1_RED(0),LED_2_YELLOW(0),

LED_3_GREEN(1),LED_4_BLUE(1);

if (RxMessage.Data[0]=='L') LED_1_RED(1),LED_2_YELLOW(1),

LED_3_GREEN(1),LED_4_BLUE(1);

if (RxMessage.Data[0]=='P') LED_1_RED(0),LED_2_YELLOW(0),

LED_3_GREEN(0),LED_4_BLUE(0);

}

Всем спасибо за помощь!

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

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.
Примечание: Ваш пост будет проверен модератором, прежде чем станет видимым.

Гость
Unfortunately, your content contains terms that we do not allow. Please edit your content to remove the highlighted words below.
Ответить в этой теме...

×   Вставлено с форматированием.   Восстановить форматирование

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

Загрузка...
  • Последние посетители   0 пользователей онлайн

    • Ни одного зарегистрированного пользователя не просматривает данную страницу
×
×
  • Создать...