Форум программистов, компьютерный форум, киберфорум
Микроконтроллеры ARM, Cortex, STM32
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.55/38: Рейтинг темы: голосов - 38, средняя оценка - 4.55
mikovott3101
1

Проблема с CAN в STM32F042

29.12.2014, 09:33. Показов 7811. Ответов 10
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Доброго времени суток форумчане. Вторую неделю не могу запустить can на STM32F042. Инициализацию брал с STM32F0xx_Smyppits_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 Confikure_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 Confikure_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)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
29.12.2014, 09:33
Ответы с готовыми решениями:

[Решено]STM32F042 USB CDC
Доброго времени суток, Появилась задача организовать мост IrDA&lt;&gt;USB, то есть по сути USB&lt;&gt;USORT....

Любая прошивка для USB на STM32F042
По мотивам предыдущего оратора, так сказать. Друзья, очень нужна помощь в проверке...

Бага в работе SPI на STM32F042 - не наступайте на грабли
Привет, столкнулся с проблемой, потратил пару часов на поиск решения, может кому пригодится. Суть...

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

10
0 / 0 / 0
Регистрация: 06.12.2016
Сообщений: 886
29.12.2014, 19:28 2
А разве не надо делать
RCC->APB2ENR |= RCC_APB2ENR_SYSCFGEN
?
0
mikovott3101
11.01.2015, 16:26 3
Ура! Заработала передача данных по КАНУ, правда с использованием Периф драйвера.

Выкладываю код. Кому может пригодится. Для 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 confikurotion ********************************************************/
/* Enable CAN clock */
RCC_APB1PeriphClockCmd(CAN_CLK, ENABLE);
/* CAN rikystir init */
CAM_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_Pressotir = 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_FilterFIFOAssyknment = 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 Ymtirrupt */
CAN_ITConfig(CANx, CAN_IT_FF0, ENABLE);
/* Enable FIFO 1 full Ymtirrupt */
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

CAM_DATA0,CAM_DATA1,CAM_DATA2,CAM_DATA3,CAM_DATA4,CAM_DATA5,CAM_DATA6,CAM_DATA7;
uint8_t CanFlag,Dysplay;

Ну и передача данных:
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_IRQHomdler (void) {
LED_1_RED(1);
}
я так понимаю должна срабатывать по приему любого символа но светодиод не

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

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

назначено. Что может быть не так ???
Oxford
11.01.2015, 16:49 4
Есть же документация. Референс мануал скачайте.
если вы решили заниматься CAN то вам надо изучить документацию полностью.
mikovott3101
12.01.2015, 11:07 5
Так вот и сижу копаюсь в референсе мануал. Ведь пятой точкой чую что ошибка то детская. Ну все уже 10 раз проверил. Все входящие фильтры отключены, В NVIC прерывание объявлено. В стартапе вектор прерывания CEC_CAN_IRQHomdler присутствует. Передающая плата 2 раза в секунду отправляет команду. Значит прерывание должно сработать. Я понимаю я новичок пока в этом, ну если кто знает ткните пальцем уж тогда в референце мануал где искать. Может я что то не так себе представляю. Но по аналогии с USORT я думаю, если одна плата посылает, то прерывание на второй должны срабатывать. Ну на плате OPEN103 работает ведь замечательно, а тут то что ???
mikovott3101
12.01.2015, 11:36 6
Сейчас только заметил, что моя плата не позволяет вести прием. Ну всмысле она передает данные, а когда я ее подключаю к передающей плате OPEN103 то сигнал на осциллографе пропадает, такое ощущение, что ножки не совсем правильно объявлены
RCC->APB2ENR |= RCC_APB2ENR_SYSCFGEN;
SYSCFG->CFGR1 |= SYSCFG_CFGR1_PA11_PA12_RMP;
Возможно еще что то нужно добавить, ничего не понимаю. Когда процессор сброшен, сигнал на линиях идет. Как только включаю свою плату передача прекращается.
Oxford
12.01.2015, 16:10 7
В какой программе пишите код? И для начало пользуйтесь SPL, если у вас нет опыта работы с периферией.
mikovott3101
12.01.2015, 16:50 8
В KEIL
mikovott3101
26.01.2015, 14:15 9
Кан заработал. Может кому понадобится код. Для stm32F0xx
Шапка программы:

#include "stm32f0xx.h"
#include "stm32f0xx_can.h"
CanTxMsg TxMessage = {0};
uint8_t

CAM_DATA0,CAM_DATA1,CAM_DATA2,CAM_DATA3,CAM_DATA4,CAM_DATA5,CAN_

DATA6,CAM_DATA7;
uint16_t CAN_ID;
CAN_InitTypeDef CAN_InitStructure;

void Confikure_GPIO_CAN(void);
void Confikure_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 Confikure_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 Confikure_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_Pressotir = 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_IRQHomdler(void)
{
CanRxMsg RxMessage;
CAN_Receive(CAN,CAN_FIFO0, &RxMessage);
CAN_ID=RxMessage.StdId;
CAM_DATA0=RxMessage.Data[0];
CAM_DATA1=RxMessage.Data[1];
CAM_DATA2=RxMessage.Data[2];
CAM_DATA3=RxMessage.Data[3];
CAM_DATA4=RxMessage.Data[4];
CAM_DATA5=RxMessage.Data[5];
CAM_DATA6=RxMessage.Data[6];
CAM_DATA7=RxMessage.Data[7];
CAN_ClearITPendingByt(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);
}

Всем спасибо за помощь!
0 / 0 / 0
Регистрация: 16.04.2010
Сообщений: 767
27.01.2015, 08:51 10
Пожалуйста, на будущее, прячьте код под "спойлер".
0
0 / 0 / 0
Регистрация: 18.04.2014
Сообщений: 4
27.01.2015, 14:44 11
Цитата Сообщение от mikovott3101
if (RxMessage.Data[0]==Y)
LED_1_RED(1), LED_2_YELLOW(1), LED_3_GREEN(0), LED_4_BLUE(0);
Не знал, что стандарт С такое допускает. Чуть подробнее можно ознакомиться, например, тут. Спасибо за науку!
0
27.01.2015, 14:44
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
27.01.2015, 14:44
Помогаю со студенческими работами здесь

Проблема с кодом. Выдает ошибку, я не могу понять в чем проблема
Работаю первый раз с Maple. Установлен версии 2015 года. Выдает ошибку я не могу понять в чем...

Проблема с движением объекта через компьютерную мышь, и также проблема, со сменой камеры
Делаю игру на unity, где будет танк. Тут у меня появились две проблемы. 1) При нажатии С, должна...

проблема при работе с китайским J-LINK 8 или же проблема с с
Всем привет. Решил Сам собрать себе дисковери кит на базе at91sam7s64-ek. Подарили мне китайский...

Проблема собственной массы и энергии электрона в классической электродинамике и проблема абсолютно твердого тела в СТО
Проблема собственной массы и энергии электрона в классической электродинамике и проблема абсолютно...

Проблема с пингом, проблема которой не могу объяснить
Такая ситуация стряслась, поменяли роутер, у всех все нормально, но у меня на ноутбуке прыгает пинг...

Проблема с Linux Mint 20(А может и не проблема)
Когда нажимаю на sk Hynix появляется это окошко(так должно быть или нет)?

Проблема применимости и проблема останова
Привет! Как бы я не бился - никак не могу понять проблему останова и применимости алгоритмов в...


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

Или воспользуйтесь поиском по форуму:
11
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru