2012-07-13 06:57 AM
Hi all,
I am trying to get the CAN interface working on the STM32F4DISCOVERY board.After calling the configuration functions from the peripheral library, when I tried to transmit message with just a oscilloscope connected to the TX and RX pins it does not work. I tried usng CAN_TransmitStatus() to see the status of the mailbox and it returned ''pending''. Then I tracked down the register in the CAN controller, the error flag is up and further more it says ''BIT DOMINANT error''... I don't know if I need to connect to a transceiver first and hook this board onto a CAN bus before I test it out? Or is it just something wrong with the configuration.Here is the code I had for the configuration part:---(I just used GPIOE pin0 to see if the program is running, nothing else) /* Enable GPIO clock */ RCC_AHB1PeriphClockCmd(CAN_GPIO_CLK|RCC_AHB1Periph_GPIOE, ENABLE); /* Connect CAN pins to AF9 */ GPIO_PinAFConfig(CAN_GPIO_PORT, CAN_RX_SOURCE, CAN_AF_PORT); GPIO_PinAFConfig(CAN_GPIO_PORT, CAN_TX_SOURCE, CAN_AF_PORT); /* Configure CAN RX and TX pins */ 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); //RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOE, ENABLE); //configure a pin for debug GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_InitStructure.GPIO_OType = GPIO_OType_PP; GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP; GPIO_Init(GPIOE, &GPIO_InitStructure); /* CAN configuration ********************************************************/ /* Enable CAN clock */ RCC_APB1PeriphClockCmd(CAN_CLK, ENABLE); /* CAN register init */ CAN_DeInit(CANx); /* 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 = DISABLE; CAN_InitStructure.CAN_TXFP = DISABLE; CAN_InitStructure.CAN_Mode = CAN_Mode_Normal; CAN_InitStructure.CAN_SJW = CAN_SJW_1tq; /* CAN Baudrate = 1 MBps (CAN clocked at 30 MHz) */ CAN_InitStructure.CAN_BS1 = CAN_BS1_6tq; CAN_InitStructure.CAN_BS2 = CAN_BS2_8tq; CAN_InitStructure.CAN_Prescaler = 2; CAN_Init(CANx, &CAN_InitStructure); /* CAN filter init */#ifdef USE_CAN1 CAN_FilterInitStructure.CAN_FilterNumber = 0;#else /* USE_CAN2 */ CAN_FilterInitStructure.CAN_FilterNumber = 14;#endif /* USE_CAN1 */ CAN_FilterInitStructure.CAN_FilterMode = CAN_FilterMode_IdMask; 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 = 0x321; TxMessage.ExtId = 0x01; TxMessage.RTR = CAN_RTR_DATA; TxMessage.IDE = CAN_ID_STD; TxMessage.DLC = 1; /* Enable FIFO 0 message pending Interrupt */ CAN_ITConfig(CANx, CAN_IT_FMP0, ENABLE);Any help is very appreciated. Thanks!Keybo2014-12-17 07:58 PM
2014-12-17 08:36 PM
But am I missing something or making any mistake in terms of GPIO and CAN configuration in the code posted earlier?
First example seems to be setting 450 kbaud, the second example seems to be 500 kbaud, but enables an interrupt with no service code. There are working examples in the Standard Peripheral Library, and working board designs. If this is your first outing with CAN it might make sense to review some of these and see how they work. CAN is further complicated by needing a receiving node to acknowledge transmission, and needing transceivers.2014-12-18 07:13 AM
2014-12-18 07:28 AM
I have used STM32 HAL Cube for programming.
2015-01-07 01:13 AM
Why
2015-01-07 03:43 AM
Why
I choose not too? May be you can find/start a STM32F429I-DISCO + CAN + HAL thread to discuss this in, with people using/supporting said library?2015-01-23 12:34 AM
I have got my communication between the two CAN nodes working. I am able to transmit and receive CAN data.
First I transmit a particular data from node1, to which node2 responds. The response of node2 is received by node1 using the CAN receive interrupt. After this interrupt is processed node1 sends another data frame, to which node2 responds with two CAN frames(these are seen on a logic analyzer) but the CAN receive interrupt is not triggered again after the second transmission.What could be the reason for this? I couldnt find if any flags have to be cleared after the first interrupt.I don't think there should be an issue in timing for interrupts. But for your information, the time between the first transmit frame and first received frame is about 0.5ms, while that between the second transmit frame and second received frame is about 1.4ms.Please help.Thank you