AnsweredAssumed Answered

CAN Receive Error

Question asked by pradeep swamy on Mar 30, 2018
Latest reply on Mar 31, 2018 by T J

I'm working on STM32F412VET6 micro, & Configured CAN1 for communication & it is initialized as

500Kbps, 75% Sample, ABP1 is @ 24MHz

 

void CANInit(void)
{
#ifdef LPBK_TEST
CanTxMsg CanTxMsg;
uint32_t uwCounter = 0;
uint8_t TransmitMailbox = 0;
#endif
NVIC_InitTypeDef NVIC_InitStructure;

// GPIOD->MODER |= 10; //PD1 & PD0 as Alternate function 0b10
// GPIOD->AFR[0] |= 9;
// GPIOD->OTYPER |= 0x0003; //open push-pull configuration
// GPIOD->OSPEEDR |= 0x000F; //high speed
// GPIOD->PUPDR |= 0x0005; //pull up
//
//
// /* CAN configuration ********************************************************/
// /* Enable CAN clock */
// RCC->APB1ENR |= RCC_APB1ENR_CAN1EN;

GPIO_InitTypeDef GPIO_InitStructure;

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

/* Enable GPIO clock */
RCC->AHB1ENR |= RCC_AHB1Periph_GPIOD;

/* Configure CAN RX and TX pins */
GPIO_InitStructure.Pin = GPIO_PIN_0;
GPIO_InitStructure.Mode = GPIO_MODE_AF_PP;
GPIO_InitStructure.Speed = GPIO_SPEED_FREQ_VERY_HIGH;
// GPIO_InitStructure.OType = GPIO_OType_PP;
GPIO_InitStructure.Pull = GPIO_PULLUP;
GPIO_Init(GPIOD, &GPIO_InitStructure);

GPIO_InitStructure.Pin = GPIO_PIN_1;
GPIO_InitStructure.Mode = GPIO_MODE_AF_PP;
GPIO_InitStructure.Speed = GPIO_SPEED_FREQ_VERY_HIGH;
// GPIO_InitStructure.OType = GPIO_OType_PP;
GPIO_InitStructure.Pull = GPIO_PULLUP;
GPIO_Init(GPIOD, &GPIO_InitStructure);

/* Connect CAN pins to AF9 */
GPIO_PinAFConfig(GPIOD, GPIO_PIN_0, GPIO_AF9_CAN1);
GPIO_PinAFConfig(GPIOD, GPIO_PIN_1, GPIO_AF9_CAN1);

GPIOE->BSRR = CAN_GPIO_Rx; //GPIOE as High for CAN TxRx to be active

/* CAN configuration ********************************************************/
/* Enable CAN clock */
RCC->APB1ENR |= RCC_APB1Periph_CAN1;

//Reset CAN1 & release from reset
RCC->APB1RSTR |= RCC_APB1Periph_CAN1;
RCC->APB1RSTR &= ~RCC_APB1Periph_CAN1;

CAN_InitStructure.CAN_TTCM = DISABLE;
CAN_InitStructure.CAN_ABOM = ENABLE;
CAN_InitStructure.CAN_AWUM = DISABLE;
CAN_InitStructure.CAN_NART = ENABLE;
CAN_InitStructure.CAN_RFLM = DISABLE;
CAN_InitStructure.CAN_TXFP = DISABLE;
#ifdef LPBK_TEST
CAN_InitStructure.CAN_Mode = CAN_Mode_LoopBack; //CAN_Mode_Normal;
#else
CAN_InitStructure.CAN_Mode = CAN_Mode_Normal;
#endif
CAN_InitStructure.CAN_SJW = CAN_SJW_2tq;

/* CAN Baudrate = 500kBps (CAN clocked at 24 MHz) */
CAN_InitStructure.CAN_BS1 = CAN_BS1_11tq;
CAN_InitStructure.CAN_BS2 = CAN_BS2_4tq;
CAN_InitStructure.CAN_Prescaler = 3;
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 = 0x0000;
CAN_FilterInitStructure.CAN_FilterIdLow = 0x0000;
CAN_FilterInitStructure.CAN_FilterMaskIdHigh = 0x0000;
CAN_FilterInitStructure.CAN_FilterMaskIdLow = 0x0000;
CAN_FilterInitStructure.CAN_FilterFIFOAssignment = CAN_Filter_FIFO0;
CAN_FilterInitStructure.CAN_FilterActivation = ENABLE;

CAN_ITConfig(CAN1, CAN_IT_FMP0, ENABLE);
CAN_ITConfig(CAN1, CAN_IT_FMP1, ENABLE);

CAN_FilterInit(&CAN_FilterInitStructure);

/* Transmit Structure preparation */
for(unsigned char i = 0; i < 10; i++)
{
gsCanTxMsg[i].StdId = 0x050;
gsCanTxMsg[i].ExtId = 0x00;
gsCanTxMsg[i].RTR = CAN_RTR_DATA;
gsCanTxMsg[i].IDE = CAN_ID_STD;
gsCanTxMsg[i].DLC = 8;
gsCanTxMsg[i].Data[0] = 0x01;
gsCanTxMsg[i].Data[1] = 0x02;
gsCanTxMsg[i].Data[2] = 0x03;
gsCanTxMsg[i].Data[3] = 0x04;
gsCanTxMsg[i].Data[4] = 0x05;
gsCanTxMsg[i].Data[5] = 0x06;
gsCanTxMsg[i].Data[6] = 0x07;
gsCanTxMsg[i].Data[7] = 0x08;
}

#ifdef LPBK_TEST
CanTxMsg.StdId = 0x11;
CanTxMsg.RTR = CAN_RTR_DATA;
CanTxMsg.IDE = CAN_ID_STD;
CanTxMsg.DLC = 2;
CanTxMsg.Data[0] = 0xCA;
CanTxMsg.Data[1] = 0xFE;

TransmitMailbox = CAN_Transmit(CAN1, &CanTxMsg);
uwCounter = 0;
while((CAN_TransmitStatus(CAN1, TransmitMailbox) != CANTXOK) && (uwCounter != 0xFFFF))
{
uwCounter++;
}

uwCounter = 0;
while((CAN_MessagePending(CAN1, CAN_FIFO0) < 1) && (uwCounter != 0xFFFF))
{
uwCounter++;
}

/* receive */
gsCanRxMsg.StdId = 0x00;
gsCanRxMsg.IDE = CAN_ID_STD;
gsCanRxMsg.DLC = 0;
gsCanRxMsg.Data[0] = 0x00;
gsCanRxMsg.Data[1] = 0x00;
CAN_Receive(CAN1, CAN_FIFO0, &gsCanRxMsg);

if (gsCanRxMsg.StdId != 0x11)
{
uwCounter++;
}
uwCounter++;

if (gsCanRxMsg.IDE != CAN_ID_STD)
{
uwCounter++;
}
uwCounter++;
#else
/* Enable FIFO 0 message pending Interrupt */

// CAN_ITConfig(CAN1, CAN_IT_TME, ENABLE);

NVIC_InitStructure.NVIC_IRQChannel = CAN1_RX0_IRQn;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0x0;
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0x1;
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&NVIC_InitStructure);

// NVIC_InitStructure.NVIC_IRQChannel = CAN1_RX1_IRQn;
// NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0x0;
// NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0x1;
// NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
// NVIC_Init(&NVIC_InitStructure);
//
// NVIC_InitStructure.NVIC_IRQChannel = CAN1_TX_IRQn;
// NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0x0;
// NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0x1;
// NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
// NVIC_Init(&NVIC_InitStructure);
#endif
}

 

I'm able to transmit a CAN frame, but when I try sending a CAN frame from CAN analyzer i'm getting receive error

 

Any idea where am I going wrong.

Outcomes