0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

RA MCU CANFD的应用实例(下)

瑞萨MCU小百科 来源:瑞萨MCU小百科 2023-10-25 15:55 次阅读

前篇您可点击上方的文章合集或文末的“上一篇 · RA MCU CANFD应用实例(上)”查看相关文章。

3.14 设置Stack

点击New Stack,选择CAN FD Lite

7c9eab6c-730a-11ee-939d-92fbcf53809c.png

3.15 它会变为红色,表示FSP配置器发现模块有错误

将鼠标指针悬停在 CAN FD lite框上并检查错误:

7cb232e0-730a-11ee-939d-92fbcf53809c.png

3.16 CANFD时钟默认为禁用状态。

切换到Clocks选项卡,将CANFDCLK设置为40MHz:

●将PLL(锁相环)分频器改为Div / 2

●将PLL乘法器改为 Mul x16.0

●将CANFDCLK改为 Src: PLL

●将CANFDCLK分频器改为 Div /4

7cc91e7e-730a-11ee-939d-92fbcf53809c.png

3.17 切回Stacks选项卡,选择CANFD lite,转至Properties选项卡

(确保当前为FSP 配置透视图 – 点击右上方

7ce40b6c-730a-11ee-939d-92fbcf53809c.png

)。打开属性检查比特率。

本实例将使用自动比特率生成器的默认比特率配置。您可在Bitrate->Automatic中检查比特率。确保已禁用了“使用手动设置”。

7cfbe0f2-730a-11ee-939d-92fbcf53809c.png

3.18 检查实际采样点和比特率(hal_data.c)是否与应用程序的要求相匹配。

7d0f9084-730a-11ee-939d-92fbcf53809c.png

注意

●为了获得最佳时钟容差,检查Arbitration baud_rate_prescaler和Data baud_rate_prescaler是否相同至关重要。

●如果启用了收发器Delay Compensation,请不要使Data baud_rate_prescaler位大于 1。

3.19 我们将传输CANFD消息(msg ID:0x60),通过TX Mailbox 0(TX MB0)。

为此,我们需要修改以下参数

●Common->Reception->Acceptance Filtering->Channel 1 Rule Count: 0(修改后可以看到Stacks Tab上的error7d2d98c2-730a-11ee-939d-92fbcf53809c.png就没有了)

●Module CAN FD Lite->Transmit Interrupts: Enable TXMB 0

●Module CAN FD Lite->Reception->Message Buffer->Number of Buffer: 1

7d34fc0c-730a-11ee-939d-92fbcf53809c.png

点击Generate Project Content按键

7d38c8fa-730a-11ee-939d-92fbcf53809c.png

3.20 要使用CANFD Lite堆栈,您需要先初始化CANFD模块。

为此,在hal_entry()函数中添加以下内容:

左右滑动查看更多

  /* Initialize CANFD Lite driver*/
  err = R_CANFD_Open(&g_canfd0_ctrl, &g_canfd0_cfg);
  if(FSP_SUCCESS != err)
  {
    APP_ERR_TRAP();
  }

3.21 须将AFL条目设置为在应用中接收消息。

本实例需求如下:

●CANFD Bus

●Standard ID (11 bits)

●Message FIFO Buffer 0 (接收0x60 ~ 0x6F的消息ID)

在hal_entry.c文件中hal_entry()函数前复制以下const来设置AFL:

左右滑动查看更多

const canfd_afl_entry_t p_canfd0_afl[CANFD_CFG_AFL_CH0_RULE_NUM] =
{
{
   .id =
   {
     .id     = 0x60,
     .frame_type = CAN_FRAME_TYPE_DATA,
     .id_mode  = CAN_ID_MODE_STANDARD,
   },
   .mask =
   {
     .mask_id     = 0x7F0,
     .mask_frame_type = 0,
     .mask_id_mode  = 1,
   },
   .destination =
   {
     .minimum_dlc = CANFD_MINIMUM_DLC_0,
     .fifo_select_flags = CANFD_RX_FIFO_0,
   },
 },
};

注意

RA CANFD使用AFL条目来过滤接收到的消息。我们回顾一下AFL的主要参数:

7d3c4052-730a-11ee-939d-92fbcf53809c.jpg

点击查看大图

3.22 在hal_entry.c文件中hal_entry()函数前添加几个变量声明和一个宏定义:

左右滑动查看更多

/* Flags to be set in Callback function */
bool b_canfd_tx_complete = false;
bool b_canfd_rx_complete = false;
bool b_canfd_err_status = false;


/* CANFD RX and TX variables */
can_frame_t g_can_tx_frame;
can_frame_t g_can_rx_frame;
can_frame_t g_can_rx_frame_fifo;


uint8_t tx_data[64];
#define DATA_LENGTH         (64) 

3.23 添加Callback函数(也可以使用拖拽的方式进行添加):

左右滑动查看更多

/* Callback function */
void canfd0_callback(can_callback_args_t *p_args)
{
  /* TODO: add your own code here */
  switch (p_args->event)
  {
    case CAN_EVENT_TX_COMPLETE:
    {
      b_canfd_tx_complete = true;    //set flag bit
      break;
    }
    case CAN_EVENT_RX_COMPLETE: // Currently driver don't support this. This is unreachable code for now.
    {
      b_canfd_rx_complete = true;
      break;
    }
    case CAN_EVENT_ERR_WARNING:       //error warning event
    case CAN_EVENT_ERR_PASSIVE:       //error passive event
    case CAN_EVENT_ERR_BUS_OFF:       //error Bus Off event
    case CAN_EVENT_BUS_RECOVERY:      //Bus recovery error event
    case CAN_EVENT_MAILBOX_MESSAGE_LOST:  //overwrite/overrun error event
    case CAN_EVENT_ERR_BUS_LOCK:      // Bus lock detected (32 consecutive dominant bits).
    case CAN_EVENT_ERR_CHANNEL:       // Channel error has occurred.
    case CAN_EVENT_TX_ABORTED:       // Transmit abort event.
    case CAN_EVENT_ERR_GLOBAL:       // Global error has occurred.
    case CAN_EVENT_FIFO_MESSAGE_LOST:   // Transmit FIFO is empty.
    case CAN_EVENT_TX_FIFO_EMPTY:      // Transmit FIFO is empty.
    {
      b_canfd_err_status = true;     //set flag bit
      break;
    }
  }
}

3.24 若传送CANFD数据,需用到CAN传输函数的选项参数。

有三个仅限CANFD的位可以启用一些独有的 CANFD 功能:

●CANFD_FRAME_OPTION_ERROR

= Error state set (ESI).

●CANFD_FRAME_OPTION_BRS

= Bit Rate Switching (BRS) enabled.

●CANFD_FRAME_OPTION_FD

= Flexible Data frame (FDF).

另外,CANFD可以增加到64字节,所以我们将DLC(数据长度代码)设为64。

在按键user_irq_callback函数if(9 == p_args->channel)中添加以下代码以发送标准数据(11 位 ID)CANFD frame

左右滑动查看更多

/* Callback function */
void user_irq_callback(external_irq_callback_args_t *p_args)
{
  /* TODO: add your own code here */
  /* Make sure it's the right interrupt*/
  if(9 == p_args->channel)
  {
    fsp_err_t err = FSP_SUCCESS;
    for( uint16_t i = 0; i < DATA_LENGTH; i++)
        {
            tx_data[i]          = (uint8_t) (i + 1);
        }
        memcpy((uint8_t*)&g_can_tx_frame.data[0], (uint8_t*)&tx_data[0], DATA_LENGTH);
        g_can_tx_frame.id               = 0x60;
        g_can_tx_frame.id_mode          = CAN_ID_MODE_STANDARD;
        g_can_tx_frame.type             = CAN_FRAME_TYPE_DATA;
        g_can_tx_frame.data_length_code = 64;
        g_can_tx_frame.options          = CANFD_FRAME_OPTION_FD | CANFD_FRAME_OPTION_BRS;


        /* Write some data to the transmit frame */
        err = R_CANFD_Write(&g_canfd0_ctrl, 0, &g_can_tx_frame);
        /* Handle error */
        if(FSP_SUCCESS != err)
        {
            APP_ERR_TRAP();
        }
    }
}

注意

在R_CANFD_Write函数中,如果传输消息缓冲区 (TXMB) 已在使用中,则传输消息将排队。CANFD_B外围设备自动传输排队的消息,并按消息缓冲区编号或消息ID确定其优先级(请参阅 CANFD Lite堆栈传输优先级属性)。

3.25 对工程进行编译7d54c956-730a-11ee-939d-92fbcf53809c.png和调试7d61e97e-730a-11ee-939d-92fbcf53809c.png

3.26 运行代码7d6c071a-730a-11ee-939d-92fbcf53809c.png,并按下FPB板上的S1,可以正常发送CANFD数据。

如果有CAN总线数据采集工具PCAN可以在这里进行验证,如果没有,请在下节完成后使用两块FPB板进行验证。

3.27 按下断开按钮7d74140a-730a-11ee-939d-92fbcf53809c.png

注意

这两张图片用于比较Classical CAN与CANFD frames。第一张图显示CAN帧以500Kb/s的速度传输8Bytes,第二张图显示CANFD以两个比特率(标称速率为500Kb/s,FD数据速率为2Mb/s)传输64Bytes。

Classical CAN Frame:

7d7e3746-730a-11ee-939d-92fbcf53809c.png

CANFD Frame:

7d89f75c-730a-11ee-939d-92fbcf53809c.png

4

CANFD:使用FIFO接收数据

本节要点:

本节学习如何通过FIFO接收CAN消息。当对方FPB板按下S1,发送CANFD数据,可以使用FIFO正常接收CANFD数据。

4.1 打开fpb_ra6e2_canfd_lab工程中FSP配置:

7d9a6326-730a-11ee-939d-92fbcf53809c.png

4.2 切到Stacks选项卡,选择CANFD Lite,然后转到Properties选项卡(确保当前为FSP配置透视图)。

Reception FIFO 0默认为启用状态,并配置为每帧触发一次中断。您可在FSP配置器中检查配置。(Module g_canfd0 CAN FD Lite (r_canfdlite)->Reception->FIFOs->FIFO 0)

并更改如下RX FIFO参数以确保其可以接收64字节的数据。

●Reception->FIFO->FIFO 0->Payload Size: 64 Bytes

●Reception->FIFO->FIFO 0->Depth: 8 Stages

7daa9200-730a-11ee-939d-92fbcf53809c.png

点击Generate Project Content7d38c8fa-730a-11ee-939d-92fbcf53809c.png按钮。

注意

CANFD外设具有一个有限数量的缓冲池RAM,可用于分配RX MB和FIFO等级。就RA6E2和RA4E2而言:

●最大64-byte 存储:16则消息

●最大8-byte 存储:60则消息

4.3 在canfd0_callback中添加以下代码以便从FIFO获取数据:

左右滑动查看更多

    case CAN_EVENT_RX_COMPLETE: // Currently driver don't support this. This is unreachable code for now.
    {
      b_canfd_rx_complete = true;
      memcpy(&g_can_rx_frame, &p_args->frame, sizeof(can_frame_t));
      break;
    }

注意

FIFO缓冲区中有帧时,FSP ISR Handler将会多次调用CANFD回调函数。

4.4 对工程进行编译7d54c956-730a-11ee-939d-92fbcf53809c.png和调试7d61e97e-730a-11ee-939d-92fbcf53809c.png

4.5 运行代码7d6c071a-730a-11ee-939d-92fbcf53809c.png,并按下对方FPB板上的S1,能够正确接收到CANFD数据。

7dd13ab8-730a-11ee-939d-92fbcf53809c.png

4.6 按下断开按钮。

审核编辑:汤梓红

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • mcu
    mcu
    +关注

    关注

    146

    文章

    16022

    浏览量

    343694
  • 模块
    +关注

    关注

    7

    文章

    2486

    浏览量

    46548
  • 锁相环
    +关注

    关注

    35

    文章

    551

    浏览量

    87254
  • pll
    pll
    +关注

    关注

    6

    文章

    741

    浏览量

    134577
  • CANFD
    +关注

    关注

    0

    文章

    43

    浏览量

    4803

原文标题:RA MCU CANFD应用实例(下)

文章出处:【微信号:瑞萨MCU小百科,微信公众号:瑞萨MCU小百科】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    RA MCU CANFD的应用实例(上)

    本篇文章将以RA6E2为例,介绍如何使用瑞萨电子FSP CAN-FD lite的堆栈来设计和实现基于CAN的简易系统。最后,使用两套FPB-RA6E2和CAN收发器模块通过CAN实现相互通信,按下一块板上的按键S1会发送CANFD
    的头像 发表于 10-25 15:53 478次阅读
    <b class='flag-5'>RA</b> <b class='flag-5'>MCU</b> <b class='flag-5'>CANFD</b>的应用<b class='flag-5'>实例</b>(上)

    构建RA MCU生态圈!RA MCU 生态1.0发布

    瑞萨电子联合深圳欣瑞利科技发起的RA生态工作室共同举办了RA MCU 生态1.0发布会。在发布会上,RA生态工作室正式发布了基于采用 Arm Cortex-M 内核的
    的头像 发表于 10-21 10:17 2821次阅读

    如何使用M460系列MCU周期性传送CANFD信息

    应用:本示例代码使用M460系列MCU周期性传送CANFD信息。 BSP 版本: M460_Series_BSP_CMSIS_V3.00.001.001 硬件: NuMaker-M467HJ
    发表于 08-29 07:14

    瑞萨电子推出9款全新RA6M4 MCU产品 RA产品家族的MCU增至42款

    瑞萨电子物联网及基础设施事业本部高级副总裁Roger Wendelken表示:“我非常高兴地宣布RA6M4 MCU产品群扩充了RA产品线,兑现了我们在去年10月发布RA
    发表于 10-09 15:52 1675次阅读

    使用RA2E1 MCU和FSP实现超低设计

      RA2E1 MCU 组评估套件 FPB-RA2E1实施各种连接器,允许访问 RA2E1 MCU、板载 E2 仿真器、用户开关、LED 上
    的头像 发表于 04-25 10:10 1567次阅读
    使用<b class='flag-5'>RA</b>2E1 <b class='flag-5'>MCU</b>和FSP实现超低设计

    RA MCU快速设计指南

    RA MCU快速设计指南
    发表于 11-07 19:50 0次下载
    <b class='flag-5'>RA</b> <b class='flag-5'>MCU</b>快速设计指南

    瑞萨RA系列MCU选型指南

    RA系列MCU产品基于Arm Cortex-M内核,与瑞萨自有内核RL78和RX系列一起,成为瑞萨MCU产品线齐头并进的三驾马车。RA2、RA
    发表于 11-08 13:51 1730次阅读

    RA MCU CAN和CANFD IP介绍

    瑞萨RA MCU(Renesas RA Microcontroller Unit)是一种高性能且多功能的微控制器单元,由瑞萨电子公司推出。它是基于ARM Cortex-M内核的先进微控制器系列,专为
    的头像 发表于 07-28 12:15 997次阅读
    <b class='flag-5'>RA</b> <b class='flag-5'>MCU</b> CAN和<b class='flag-5'>CANFD</b> IP介绍

    CAN和CANFD协议简介(下)

    前篇内容请点击查看: RA MCU CAN和CANFD IP介绍 CAN和CANFD协议简介(上) 2. CAN协议 2.2 协议层 前文 讲述了CAN的物理层标准,约定了电气特性,以
    的头像 发表于 08-02 12:15 1483次阅读
    CAN和<b class='flag-5'>CANFD</b>协议简介(下)

    瑞萨RA MCU串口通信空闲中断

    瑞萨RA MCU串口通信空闲中断
    的头像 发表于 09-26 16:59 573次阅读
    瑞萨<b class='flag-5'>RA</b> <b class='flag-5'>MCU</b>串口通信空闲中断

    RA MCU CANFD在FSP中的配置详解

    在瑞萨RA系列MCU产品中,目前RA4E2、RA4T1、RA6E2、RA6T2和
    的头像 发表于 10-20 14:46 636次阅读
    <b class='flag-5'>RA</b> <b class='flag-5'>MCU</b> <b class='flag-5'>CANFD</b>在FSP中的配置详解

    使用VSCODE+GNU+J-Link开发瑞萨RA MCU(上)

    使用VSCODE+GNU+J-Link开发瑞萨RA MCU
    的头像 发表于 09-04 16:23 389次阅读
    使用VSCODE+GNU+J-Link开发瑞萨<b class='flag-5'>RA</b> <b class='flag-5'>MCU</b>(上)

    RA MCU CAN和CANFD IP介绍

    瑞萨RA MCU(Renesas RA Microcontroller Unit)是一种高性能且多功能的微控制器单元,由瑞萨电子公司推出。它是基于ARM Cortex-M内核的先进微控制器系列,专为满足广泛的嵌入式应用需求而设计
    的头像 发表于 12-26 08:06 184次阅读
    <b class='flag-5'>RA</b> <b class='flag-5'>MCU</b> CAN和<b class='flag-5'>CANFD</b> IP介绍

    瑞萨电子RA家族推出RA8系列高算力通用MCU

    瑞萨电子RA家族推出RA8系列高算力通用MCU,是业界首款基于Arm® Cortex®-M85(CM85)内核的32位MCU,主频高达480Mhz,超过3000 CoreMark跑分。
    的头像 发表于 04-02 14:14 278次阅读
    瑞萨电子<b class='flag-5'>RA</b>家族推出<b class='flag-5'>RA</b>8系列高算力通用<b class='flag-5'>MCU</b>

    瑞萨RA MCU家族推出集成Arm® Cortex®-M23内核的全新RA0系列

    瑞萨RA MCU家族推出全新的RA0系列,RA0E1产品组是入门级简易MCU,具有出色的成本效益和超低功耗。
    的头像 发表于 04-10 14:32 427次阅读
    瑞萨<b class='flag-5'>RA</b> <b class='flag-5'>MCU</b>家族推出集成Arm® Cortex®-M23内核的全新<b class='flag-5'>RA</b>0系列