2015-09-22 04:09 AM
Hello All,
I have written a code for Transmission of frames from CAN-analyzer to STM32F429ZI board and back from board to CAN-Analyzer . But I am receiving only error frames in the CAN-analyzer. Even transmission also not happening. Please suggest me what is wrong in my code. I have pasted the code and attached CAN-analyzer result image for your convenience. Thanking you. &sharpinclude ''stm32f4xx.h'' uint32_t SysClk; uint32_t HClk; uint32_t PClk1; uint32_t PClk2; int main(void) { GPIO_InitTypeDef GPIO_InitStructure; RCC_ClocksTypeDef RCC_Clocks; CAN_InitTypeDef CAN_InitStructure; CAN_FilterInitTypeDef CAN_FilterInitStructure; NVIC_InitTypeDef NVIC_InitStructure; CanTxMsg TxMessage; RCC_GetClocksFreq(&RCC_Clocks); SysClk = RCC_Clocks.SYSCLK_Frequency; HClk = RCC_Clocks.HCLK_Frequency; PClk1 = RCC_Clocks.PCLK1_Frequency; PClk2 = RCC_Clocks.PCLK2_Frequency; /* CAN GPIOs configuration **************************************************/ /* Enable GPIO clock */ RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOB, ENABLE); /* Connect CAN pins */ GPIO_PinAFConfig(GPIOB, GPIO_PinSource8, GPIO_AF_CAN1); GPIO_PinAFConfig(GPIOB, GPIO_PinSource9, GPIO_AF_CAN1); /* Configure CAN RX and TX pins */ GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8 | GPIO_Pin_9; 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_NOPULL; GPIO_Init(GPIOB, &GPIO_InitStructure); /* CAN configuration ************************************************** ******/ /* Enable CAN clock */ RCC_APB1PeriphClockCmd(RCC_APB1Periph_CAN1, ENABLE); NVIC_InitStructure.NVIC_IRQChannel = CAN1_RX0_IRQn; NVIC_InitStructure.NVIC_IRQChannelPreemptionPriori ty = 0x0; NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0x0; NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; NVIC_Init(&NVIC_InitStructure); /* 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 = DISABLE; CAN_InitStructure.CAN_RFLM = DISABLE; CAN_InitStructure.CAN_TXFP = DISABLE; CAN_InitStructure.CAN_Mode = CAN_Mode_Normal; /* quanta 1+6+7 = 14, 14 * 3 = 42, 42000000 / 42 = 1000000 */ /* CAN Baudrate = 1Mbps (CAN clocked at 42 MHz) Prescale = 3 */ /* Requires a clock with integer division into APB clock */ CAN_InitStructure.CAN_SJW = CAN_SJW_1tq; // 1+6+7 = 14, 1+14+6 = 21, 1+15+5 = 21 CAN_InitStructure.CAN_BS1 = CAN_BS1_6tq; CAN_InitStructure.CAN_BS2 = CAN_BS2_7tq; CAN_InitStructure.CAN_Prescaler = 6; //RCC_Clocks.PCLK1_Frequency / (14 * 1000000); // quanta by baudrate CAN_Init(CAN1, &CAN_InitStructure); /* CAN filter init */ CAN_FilterInitStructure.CAN_FilterNumber = 0; // CAN1 [ 0..13] CAN_FilterInitStructure.CAN_FilterMode = CAN_FilterMode_IdMask; // IdMask or IdList CAN_FilterInitStructure.CAN_FilterScale = CAN_FilterScale_32bit; // 16 or 32 CAN_FilterInitStructure.CAN_FilterIdHigh = 0x0000; // Everything, otherwise 11-bit in top bits CAN_FilterInitStructure.CAN_FilterIdLow = 0x0000; CAN_FilterInitStructure.CAN_FilterMaskIdHigh = 0x0000; CAN_FilterInitStructure.CAN_FilterMaskIdLow = 0x0000; CAN_FilterInitStructure.CAN_FilterFIFOAssignment = CAN_FIFO0; // Rx CAN_FilterInitStructure.CAN_FilterActivation = ENABLE; CAN_FilterInit(&CAN_FilterInitStructure); /* Enable FIFO 0 message pending Interrupt */ CAN_ITConfig(CAN1, CAN_IT_FMP0, ENABLE); /* transmit */ TxMessage.StdId = 0x123; TxMessage.ExtId = 0x00; TxMessage.RTR = CAN_RTR_DATA; TxMessage.IDE = CAN_ID_STD; TxMessage.DLC = 8; TxMessage.Data[0] = 0x02; TxMessage.Data[1] = 0x11; TxMessage.Data[2] = 0x11; TxMessage.Data[3] = 0x11; while(1) // Do not want to exit { volatile uint32_t i; static int j = 0; uint8_t TransmitMailbox = 0; TxMessage.Data[0] = (j >> 0) & 0xFF; // Cycling TxMessage.Data[1] = (j >> 8) & 0xFF; TxMessage.Data[2] = (j >> 16) & 0xFF; TxMessage.Data[3] = (j >> 24) & 0xFF; j++; TransmitMailbox = CAN_Transmit(CAN1, &TxMessage); i = 0; while((CAN_TransmitStatus(CAN1, TransmitMailbox) != CANTXOK) && (i != 0xFFFFFF)) // Wait on Transmit { i++; } } } &sharpifdef USE_FULL_ASSERT /** * @brief Reports the name of the source file and the source line number * where the assert_param error has occurred. * @param file: pointer to the source file name * @param line: assert_param error line source number * @retval None */ void assert_failed(uint8_t* file, uint32_t line) { /* User can add his own implementation to report the file name and line number, ex: printf(''Wrong parameters value: file %s on line %d\r\n'', file, line) */ /* Infinite loop */ while (1) { } } &sharpendif Here is the ISR which I have written for reception of CAN frames and transmitting back. void CAN1_RX0_IRQHandler(void) { CanRxMsg RxMsg; if(CAN_GetITStatus(CAN1, CAN_IT_FMP0) != RESET) { CAN_ClearITPendingBit(CAN1,CAN_IT_FMP0); //clears the it pending bits CAN_Receive(CAN1, CAN_FIFO0, &RxMsg); CAN_Transmit(CAN1, (CanTxMsg*)&RxMsg); } } #txerr #ack-slot2015-10-01 06:40 AM
Hi kasar.sunil,
I don't see a particular incoherence in your code.It may be interesting for you to make the test with other pins (if possible) like PA11 and PA12 as what is implemented in the example STM32F4xx_DSP_StdPeriph_Lib_V1.6.0\Project\STM32F4xx_StdPeriph_Examples\CAN\CAN_Networking.-Mayla-To give better visibility on the answered topics, please click on Accept as Solution on the reply which solved your issue or answered your question.
2015-10-01 10:11 AM
Check the CAN_ESR register on the F429 to see if you have errors on the STM32 side. You might want to add the CAN SCE interrupt. What is the crystal frequency on your HSE oscillator, and are you sure the PLL is set correctly?
You might try a lower speed first. Do you know what the quanta settings on your analyzer are? Jack Peacock