cancel
Showing results for 
Search instead for 
Did you mean: 

STM32F423 bxCAN + Arduino MCP2515 — CAN reception issue

nikhilkrn
Visitor

Hardware connection

  • Node A: STM32F423RHTx, TCAN1462-Q1 transceiver, HSI→PLL→80MHz SYSCLK, 40MHz APB1, PA11/PA12
  • Node B: Arduino Uno + MCP2515 breakout (8MHz xtal, onboard transceiver), mcp_can v1.5. 120Ω termination, wiring verified 
  • CAN Timing (both at 500kbps)

CAN Configuration

CAN_HandleTypeDef hcan1;

/* CAN1 init function */
void MX_CAN1_Init(void)
{

  /* USER CODE BEGIN CAN1_Init 0 */

  /* USER CODE END CAN1_Init 0 */

  /* USER CODE BEGIN CAN1_Init 1 */

  /* USER CODE END CAN1_Init 1 */
  hcan1.Instance = CAN1;
  hcan1.Init.Prescaler = 8;
  hcan1.Init.Mode = CAN_MODE_NORMAL;
  hcan1.Init.SyncJumpWidth = CAN_SJW_1TQ;
  hcan1.Init.TimeSeg1 = CAN_BS1_6TQ;
  hcan1.Init.TimeSeg2 = CAN_BS2_3TQ;
  hcan1.Init.TimeTriggeredMode = DISABLE;
  hcan1.Init.AutoBusOff = DISABLE;
  hcan1.Init.AutoWakeUp = ENABLE;
  hcan1.Init.AutoRetransmission = DISABLE;
  hcan1.Init.ReceiveFifoLocked = DISABLE;
  hcan1.Init.TransmitFifoPriority = DISABLE;
  if (HAL_CAN_Init(&hcan1) != HAL_OK)
  {
    Error_Handler();
  }
  /* USER CODE BEGIN CAN1_Init 2 */
  CAN_FilterTypeDef canfilterconfig;

  canfilterconfig.FilterBank = 0;
  canfilterconfig.FilterMode = CAN_FILTERMODE_IDMASK;
  canfilterconfig.FilterScale = CAN_FILTERSCALE_32BIT;
  canfilterconfig.FilterIdHigh = 0x0000;
  canfilterconfig.FilterIdLow = 0x0000;
  canfilterconfig.FilterMaskIdHigh = 0x0000;
  canfilterconfig.FilterMaskIdLow = 0x0000;
  canfilterconfig.FilterFIFOAssignment = CAN_RX_FIFO0;
  canfilterconfig.FilterActivation = CAN_FILTER_ENABLE;
  canfilterconfig.SlaveStartFilterBank = 14;

  if (HAL_CAN_ConfigFilter(&hcan1, &canfilterconfig) != HAL_OK)
  {
    Error_Handler();
  }

  /* USER CODE END CAN1_Init 2 */

}

Notification is also enabled. 

  if (HAL_CAN_ActivateNotification(&hcan1, CAN_IT_RX_FIFO0_MSG_PENDING) != HAL_OK)
  {
      Error_Handler();
  }

Callback function

CAN_RxHeaderTypeDef gRxHeader;
uint8_t             gRxData[8];

void HAL_CAN_RxFifo0MsgPendingCallback(CAN_HandleTypeDef *hcan)
{
	printf("Hi from CB\r\n");
        if (HAL_CAN_GetRxMessage(&hcan1, CAN_RX_FIFO0, &gRxHeader, gRxData) == HAL_OK){
                printf("ID: 0x%03lX  DLC: %lu  Data:", gRxHeader.StdId, gRxHeader.DLC);
                for (uint8_t i = 0; i < gRxHeader.DLC; i++){
                        printf(" %02X", gRxData[i]);
                }
                printf("\r\n");
        }
}

What Works

  • STM32 → Arduino: Arduino serial monitor shows received frames every 1 second
  • STM32 Loopback mode: receives own frames internally
  • STM32 register dump: IER=0x02 (FMPIE0 armed), MSR shows normal mode, filter active

What Doesn't Work

  • Arduino → STM32: RF0R.FMP permanently 0, REC=0, interrupt never fires
  • Arduino sendMsgBuf returns CAN_SENDMSGTIMEOUT (7), EFLG=0x15 (TXEP+TXWAR+EWARN)
  • STM32's own TX frames show ACK Error (LEC=0x3) and TERR0=1 despite Arduino claiming to receive them — ACK contradiction

I have tried changing the filter configuration still that didn't worked.

0 REPLIES 0
Announcement

We’re moving the ST Community to a new platform to give you a better and more reliable community experience.