Welcome to EDAboard.com

Welcome to our site! EDAboard.com is an international Electronics Discussion Forum focused on EDA software, circuits, schematics, books, theory, papers, asic, pld, 8051, DSP, Network, RF, Analog Design, PCB, Service Manuals... and a whole lot more! To participate you need to register. Registration is free. Click here to register now.

CAN- message transmission proble.

Status
Not open for further replies.

sunil_kasar

Newbie level 6
Joined
May 6, 2015
Messages
13
Helped
0
Reputation
0
Reaction score
0
Trophy points
1
Location
India
Activity points
125
Hello all,
I wrote code for CAN message transmission using STM32F429ZI board. Message is not getting transferred. It is displaying only error frames in CANanalyzer. Please suggest me solution for this problem. I have attached the code for your convenience. Even I have attached a snapshot of CAN analyzer result.

Thanking you.

Code:
#include "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;
 
  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_GPIOD, ENABLE);
	RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOB, ENABLE);
 
  /* Connect CAN pins */
	// GPIO_PinAFConfig(GPIOD, GPIO_PinSource0, GPIO_AF_CAN1);
	// GPIO_PinAFConfig(GPIOD, GPIO_PinSource1, GPIO_AF_CAN1);
	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_0 | GPIO_Pin_1;
  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(GPIOD, &GPIO_InitStructure);
	*/
	
	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_PuPd_UP;
  GPIO_Init(GPIOB, &GPIO_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 = 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 = 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);
 
  // 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[4] = (j >>  0) & 0xFF; // Cycling
    TxMessage.Data[5] = (j >>  8) & 0xFF;
    TxMessage.Data[6] = (j >> 16) & 0xFF;
    TxMessage.Data[7] = (j >> 24) & 0xFF;
    j++;
 
    TransmitMailbox = CAN_Transmit(CAN1, &TxMessage);
 
    i = 0;
    while((CAN_TransmitStatus(CAN1, TransmitMailbox) != CANTXOK) && (i != 0xFFFFFF)) // Wait on Transmit
    {
      i++;
    }
  }
}
 
#ifdef  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)
  {
  }
}
#endif
 

Attachments

  • Can_error.PNG
    Can_error.PNG
    42.3 KB · Views: 4
Last edited by a moderator:

sunil_kasar

Newbie level 6
Joined
May 6, 2015
Messages
13
Helped
0
Reputation
0
Reaction score
0
Trophy points
1
Location
India
Activity points
125
CAN- message transmission problem.

Hello All,

I am facing problem in transmission of frames. I am sending frames from CAN analyzer to STM32F429ZI board. Board has to receive the frames and transmit back. But I am Receiving error frames in the Can-analyzer when I try with below code. Kindly help me to get rid from this problem. I have attached the Can-analyzer snapshot for the convenience.


Code:
#include "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);   // PB8 = Rx
        GPIO_PinAFConfig(GPIOB, GPIO_PinSource9, GPIO_AF_CAN1);   // PB9 = Tx
 
 
       /* 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_IRQChannelPreemptionPriority = 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++;
    }
  }
}
 
#ifdef  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)
  {
  }
}
#endif
 
Last edited by a moderator:

sunil_kasar

Newbie level 6
Joined
May 6, 2015
Messages
13
Helped
0
Reputation
0
Reaction score
0
Trophy points
1
Location
India
Activity points
125
Re: CAN- message transmission problem.

CAN_ESR status result on STM32F429.
ESR.PNG
 

Status
Not open for further replies.

Similar threads

Part and Inventory Search

Welcome to EDABoard.com

Sponsor

Top