本帖最后由 donatello1996 于 2023-7-20 17:08 编辑

     瑞萨的RA4E2和RA6E2是有CANFD接口的,软件stack归类为CANFD-lite,要使用瑞萨片上的CANFD接口,必须外接CAN收发器,这里我用在淘宝上能买到的常用收发器模块TJA1050,RX接RA4E2和RA6E2的P402引脚,TX接RA6E2的P401引脚:


设置20MHz的外部晶振2分频,16倍频,获得160MHz系统主频,再设置CANFD时钟4分频,获得CANFD时钟40MHz,RA4E2和RA6E2都这么做:


CANFD-lite stack配置,只有通道0可用:


波特率使用默认的配置,向下兼容模式500KHz, FD模式2MHz,采样率75%:


启用MailBox 0发送中断:



启用一个buffer,payload size 8个字节:


两块板的AFL参数都设置相同,ID号示例为0x50:

  1. const canfd_afl_entry_t p_canfd0_afl[CANFD_CFG_AFL_CH0_RULE_NUM] =
  2. {
  3.         {
  4.                 .id =
  5.                 {
  6.                 .id = 0x50,
  7.                 .frame_type = CAN_FRAME_TYPE_DATA,
  8.                 .id_mode = CAN_ID_MODE_STANDARD
  9.                 },
  10.                 .mask =
  11.                 {
  12.                         .mask_id = 0x7fe,
  13.                         .mask_frame_type = 0,
  14.                         .mask_id_mode = 1,
  15.                 },
  16.                 .destination =
  17.                 {
  18.                         .minimum_dlc = CANFD_MINIMUM_DLC_0,
  19.                         .rx_buffer = CANFD_RX_MB_0,
  20.                 },
  21.         },
  22. };

发送ID号也要用0x50,不然是收不到数据的:

  1.         can_tx_frame.id               = 0x50;
  2.         can_tx_frame.id_mode                                        = CAN_ID_MODE_STANDARD;
  3.         can_tx_frame.type             = CAN_FRAME_TYPE_DATA;
  4.         can_tx_frame.data_length_code = 1;

  5.         memcpy((uint8_t*)&can_tx_frame.data[0], (uint8_t*)&can_rx_msg1[0], 1);


接收端用的函数为:

  1.                 R_CANFD_InfoGet(&g_canfd0_ctrl , &can_rx_info);

  2.                 if((can_rx_info.rx_mb_status & (1<<0)) == (1<<0))
  3.                 {
  4.                         R_CANFD_Read(&g_canfd0_ctrl , 0 , &g_can_rx_frame);
  5.                         printf("R_CANFD_Read %s\n" , g_can_rx_frame.data);
  6.                 }


运行效果,一切正常,一收一发,没有任何问题:

11.jpg