Реклама на сайте DatasheetsDatasheets

KAZUS.RUN - Электронный портал. Принципиальные схемы, Datasheets, Форум по электронике

Новости электроники Новости Литература, электронные книги Литература Документация, даташиты Документация Поиск даташитов (datasheets)Поиск PDF
  От производителей
Новости поставщиков
В мире электроники

  Сборник статей
Книги и журналы
FAQ по электронике

  Datasheets
Поиск SMD
Онлайн справочник

Принципиальные схемы Схемы Каталоги программ, сайтов Каталоги Общение, форум Общение Ваш аккаунтАккаунт
  Каталог схем
Схемы и проекты
Принципиальные схемы
  Программы
Каталог сайтов
Калькуляторы
  Форумы по электронике
Помощь проекту


 
Опции темы

STM32F303K6 - виснет при приёме сообщений CAN

Непрочитано 14.12.2016, 13:06  
lau-de
Прохожий
 
Регистрация: 14.12.2016
Сообщений: 3
Сказал спасибо: 0
Сказали Спасибо 0 раз(а) в 0 сообщении(ях)
lau-de на пути к лучшему
По умолчанию STM32F303K6 - виснет при приёме сообщений CAN

Приветствую всех,
прошу помощи; не получается принимать сообщения, как только микроконтроллер принимает сообщение он тут же подвисает
Код:
#include "stm32f30x.h"

void TIM2_IRQHandler(void){
	CanTxMsg canMessage;
	TIM_ClearITPendingBit(TIM2, TIM_IT_Update);
	if(GPIO_ReadOutputDataBit(GPIOA, GPIO_Pin_1)){
		GPIO_WriteBit(GPIOA, GPIO_Pin_1, Bit_RESET);
		
	}else{
		GPIO_WriteBit(GPIOA, GPIO_Pin_1, Bit_SET);
	}
	canMessage.StdId = 0x123;
	canMessage.ExtId = 0;
	canMessage.RTR = CAN_RTR_DATA;
	canMessage.IDE = CAN_ID_STD;
	canMessage.DLC = 8;
	 
	canMessage.Data[0] = 0;
	canMessage.Data[1] = 1;
	canMessage.Data[2] = 2;
	canMessage.Data[3] = 3;
	canMessage.Data[4] = 4;
	canMessage.Data[5] = 5;
	canMessage.Data[6] = 6;
	canMessage.Data[7] = 7;
	 
	CAN_Transmit(CAN1, &canMessage);
}
void USB_LP_CAN1_RX0_IRQHandler(void) {
	
}

int main() {
	
	GPIO_InitTypeDef GPIO_InitStructure;
	CAN_InitTypeDef CAN_InitStructure;
	NVIC_InitTypeDef  NVIC_InitStructure;
	CAN_FilterInitTypeDef  CAN_FilterInitStructure;
	TIM_TimeBaseInitTypeDef TIM_TimeBase_InitStructure;
	TIM_OCInitTypeDef TIM_OC_InitStructure;
	//CanTxMsg canMessage;

	SystemInit();
	SystemCoreClockUpdate();

	RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOA, ENABLE);

	RCC_APB1PeriphClockCmd(RCC_APB1Periph_CAN1, ENABLE);

	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT;
	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1; //PA1
	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;

	GPIO_Init(GPIOA, &GPIO_InitStructure); //LED1 

	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2; //PA2

	GPIO_Init(GPIOA, &GPIO_InitStructure); //LED2

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

	/* Connect CAN pins to AF9 */
	GPIO_PinAFConfig(GPIOA, GPIO_PinSource11, GPIO_AF_9);
	GPIO_PinAFConfig(GPIOA, GPIO_PinSource12, GPIO_AF_9); 
	
	/* Configure CAN RX and TX pins */
	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_11 | GPIO_Pin_12;
	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(GPIOA, &GPIO_InitStructure);

	/* NVIC configuration **************************************************  *****/
	NVIC_InitStructure.NVIC_IRQChannel = USB_LP_CAN1_RX0_IRQn;
	NVIC_InitStructure.NVIC_IRQChannelPreemptionPriori  ty = 0x0;
	NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0x0;
	NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
	NVIC_Init(&NVIC_InitStructure);
	
	NVIC_InitStructure.NVIC_IRQChannel = CAN1_RX1_IRQn;
	NVIC_InitStructure.NVIC_IRQChannelPreemptionPriori  ty = 0x0;
	NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0x0;
	NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
	NVIC_Init(&NVIC_InitStructure);

	
	/* CAN configuration **************************************************  ******/  
	/* Enable CAN clock */
	RCC_APB1PeriphClockCmd(RCC_APB1Periph_CAN1, ENABLE);
	
	/* CAN register init */
	CAN_DeInit(CAN1);
	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 = ENABLE;
	CAN_InitStructure.CAN_RFLM = DISABLE;
	CAN_InitStructure.CAN_TXFP = DISABLE;
	CAN_InitStructure.CAN_Mode = CAN_Mode_Normal;//CAN_Mode_LoopBack//CAN_Mode_Normal
	CAN_InitStructure.CAN_SJW = CAN_SJW_1tq;
		
	/* CAN Baudrate = 500KBps (CAN clocked at 36 MHz) */
	CAN_InitStructure.CAN_BS1 = CAN_BS1_9tq;
	CAN_InitStructure.CAN_BS2 = CAN_BS2_8tq;
	CAN_InitStructure.CAN_Prescaler = 2;
	CAN_Init(CAN1, &CAN_InitStructure);

	/* CAN filter init */
	CAN_FilterInitStructure.CAN_FilterNumber = 0;
	CAN_FilterInitStructure.CAN_FilterMode = CAN_FilterMode_IdMask;
	CAN_FilterInitStructure.CAN_FilterScale = CAN_FilterScale_32bit;
	//CAN_FilterInitStructure.CAN_FilterIdHigh = 0x0401 ‹‹ 5;
	//CAN_FilterInitStructure.CAN_FilterIdLow = 0x0000;
	//CAN_FilterInitStructure.CAN_FilterMaskIdHigh = 0xFFFF;
	//CAN_FilterInitStructure.CAN_FilterMaskIdLow = 0xFFFF;
	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);
	
	/* Enable FIFO 0 message pending Interrupt */
	CAN_ITConfig(CAN1, CAN_IT_FMP0, ENABLE);
	
	//TIMER BLINK LED
	
	RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE);
	
	TIM_TimeBase_InitStructure.TIM_ClockDivision = TIM_CKD_DIV1;
	TIM_TimeBase_InitStructure.TIM_CounterMode = TIM_CounterMode_Up;
	TIM_TimeBase_InitStructure.TIM_Period = 500; //1999
	TIM_TimeBase_InitStructure.TIM_Prescaler = 17999;
	TIM_TimeBaseInit(TIM2, &TIM_TimeBase_InitStructure);
 
	TIM_ITConfig(TIM2, TIM_IT_Update, ENABLE);
 
	NVIC_InitStructure.NVIC_IRQChannel = TIM2_IRQn;
	NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
	NVIC_InitStructure.NVIC_IRQChannelPreemptionPriori  ty = 0x0F;
	NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0x0F;
	NVIC_Init(&NVIC_InitStructure);
	
	TIM_Cmd(TIM2, ENABLE);
	
	while(1) {
	}
}
то есть светодиод мыргает ~2 раза в секунду и отправляет сообщения, это работает, отправленные сообщения вижу CAN анализатором, но как только я CAN анализатором отправляю любое сообщение проц подвисает и светодиод на PA1 мыргать перестаёт (похоже подвисает не core, а переферия потому что в ST-LINK core можно останавливать, запускать, ресететить, ничего не меняется пока не сделаешь system reset)
передачу сообщений в TIM2_IRQHandler отключал, ничего не меняется в поведении, всё также подвисает
если mode переключить в loopback то подвисает тут после ресета, очевидно при приёме своего же первого сообщения
--------------------------------------------------------------------------
подопытный: STM32F303K6
CAN driver: SN65HVD232D
внешний кварц 4 мгц, внутренний такт 72 мгц
IDE: Keil uVision 5
Реклама:
lau-de вне форума  
Непрочитано 14.12.2016, 18:15  
Alex9797
Почётный гражданин KAZUS.RUN
 
Аватар для Alex9797
 
Регистрация: 20.08.2010
Адрес: Днепр
Сообщений: 8,548
Сказал спасибо: 5,035
Сказали Спасибо 10,606 раз(а) в 3,594 сообщении(ях)
Alex9797 на пути к лучшему
По умолчанию Re: STM32F303K6 - виснет при приёме сообщений CAN

Сообщение от lau-de Посмотреть сообщение
сообщения вижу CAN анализатором
А какой анализатор? Как называется? Какой приемопередатчик в анализаторе, и какой на плате?
Alex9797 вне форума  
Непрочитано 15.12.2016, 02:05  
lau-de
Прохожий
 
Регистрация: 14.12.2016
Сообщений: 3
Сказал спасибо: 0
Сказали Спасибо 0 раз(а) в 0 сообщении(ях)
lau-de на пути к лучшему
По умолчанию Re: STM32F303K6 - виснет при приёме сообщений CAN

UPA-USB CAN analyser от elrasoft
наверно 82с250, затёрто на нём
на плате вроде написал что:
CAN driver: SN65HVD232D
lau-de вне форума  
Непрочитано 15.12.2016, 22:28  
Alex9797
Почётный гражданин KAZUS.RUN
 
Аватар для Alex9797
 
Регистрация: 20.08.2010
Адрес: Днепр
Сообщений: 8,548
Сказал спасибо: 5,035
Сказали Спасибо 10,606 раз(а) в 3,594 сообщении(ях)
Alex9797 на пути к лучшему
По умолчанию Re: STM32F303K6 - виснет при приёме сообщений CAN

C такими драйверами не работал. Обычно использую TJA1040 и TJA1941. Начинал с микрочиповских, но у них цена кусачая.

В общем, я бы советовал взять логический анализатор, поцепиться на логические входы и выходы драйверов CAN, и посмотреть, что там происходит во время обмена.

Полезная информация для периода отладки может быть получена при помощи светодиодов. Я цепляю по светодиоду на логический вход и выход драйвера, чтобы они светились от логического нуля. И тогда хорошо видно, когда проходит одиночный пакет, или группа пакетов, или сплошной поток пакетов.
Alex9797 вне форума  
Непрочитано 17.12.2016, 06:21  
lau-de
Прохожий
 
Регистрация: 14.12.2016
Сообщений: 3
Сказал спасибо: 0
Сказали Спасибо 0 раз(а) в 0 сообщении(ях)
lau-de на пути к лучшему
По умолчанию Re: STM32F303K6 - виснет при приёме сообщений CAN

надо было просто вместо общего startup_stm32f30x.s использовать startup_stm32f334x8.s
всё заработало, всем всё равно спасибо
lau-de вне форума  
 
Опции темы

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.

Быстрый переход

Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Парапсихология, гомеопатия и паранаука Marc2005 Отвлекитесь, эмбеддеры! 2616 05.09.2014 23:07
DVD Orion-881 виснет посредине диска slaventiy969 Видеотехника 9 12.08.2012 22:46


Часовой пояс GMT +4, время: 19:07.


Powered by vBulletin® Version 3.8.4
Copyright ©2000 - 2026, Jelsoft Enterprises Ltd.