Hallo zusammen,
ich möchte hier um euere Hilfe bieten... ich versuche mit dem
STM32F303K6 eine CAN-Nachricht zu empfangen und der Mikrocontroller
hängt sich auf wenn die Nachricht empfangen wird.
Die LED am PA1 blink mit dem Timer und die Nachrichten werden
einwandfrei gesendet, das sehe ich mit meinem CAN-Analyzer; aber sobald
ich mit dem Analyzer nur eine Nachricht sende hängt sich Mikrocontroller
auf, die LED bleibt je nach dem an oder aus; der kommt nicht mal zu der
Interrupt-Behandlung, die LED am PA2 bleibt aus. Setze ich CAN_Mode auf
loopback hängt er sich direkt nach dem RESET, offensichtlich von eigener
gesendeten Nachricht.
CAN Treiber: SN65HVD232D
ext. Quarz 4 mhz, interner Takt 72 mhz
IDE: Keil uVision 5
Vielen Dank
Stanislav
hier ist der Code:
#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) {
GPIO_WriteBit(GPIOA, GPIO_Pin_2, Bit_SET);
}
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_IRQChannelPreemptionPriority = 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_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_IRQChannelPreemptionPriority = 0x0F;
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0x0F;
NVIC_Init(&NVIC_InitStructure);
TIM_Cmd(TIM2, ENABLE);
while(1) {
}
}