RA MCU CANFD在FSP中的配置详解

描述

 

在瑞萨RA系列MCU产品中,目前RA4E2、RA4T1、RA6E2、RA6T2和RA6T3搭载了CANFD Lite(硬件手册中成为CANFD_B)模块,相关的详细IP介绍,请参见之前的文章

本篇将为您介绍如何使用FSP配置CANFD Lite模块,请注意与RA6M5搭载的CANFD模块的配置略有区别,这里不详细讲述。

首先,简单介绍一下FSP。瑞萨的Flexibility Software Package(FSP)是一种嵌入式软件和开发工具包,提供了集成的软件平台,帮助开发者快速设计、开发和部署嵌入式系统。FSP提供了一系列软件组件、设备驱动程序、操作系统抽象层和中间件,以及与瑞萨微控制器相配套的开发工具。通过使用FSP,开发者可以减少开发时间和成本,快速构建高度可靠、高性能的嵌入式系统。

FSP具有以下特点和优势:

 灵活性和可扩展性:FSP支持瑞萨广泛的微控制器产品系列,使开发者能够选择适合其需求的合适解决方案。

 高度集成的软件平台:FSP提供了一整套软件组件,包括设备驱动程序、操作系统抽象层和中间件,简化了系统开发流程。

 快速上手和开发:FSP提供了丰富的示例代码、开发工具和文档,使开发者能够快速开始开发工作,并加速产品上市时间。

 兼容性和维护性:FSP基于开放标准,并与瑞萨的先进开发工具集成,可以轻松集成第三方软件和工具,同时享受瑞萨长期的技术支持和维护。

通过FSP的图形化界面可以设置RA CANFD Lite模块的引脚和功能,使用FSP生成的函数可以执行CANFD Lite模块的初始化,发送&接收数据,这样可以加快项目完成,缩短用户开发时间。

而使用FSP如何设置RA CANFD Lite功能,将从以下几个方面进行说明:

1添加CANFD Lite模块

在e2 studio双击工程中的configuraion.xml文件,在Stacks选项卡中,点击New Stack,选择CANFD Lite (r_canfdlite)

mcu

2设置时钟

CANFD时钟默认为禁用状态。选择Clocks选项卡,将CANFDCLK设置为40MHz:

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

 将PLL乘法器改为Mul x16.0

 将CANFDCLK改为Src: PLL

 将CANFDCLK分频器改为Div /4

mcu

3设置引脚

选择Pins Tab,点击CANFD0,Pin Group Selection选择Mixed的情况下,Operation Mode选择Enabled,CRX0自动选择P102、CTX0自动选择P103,也可以通过右侧的下拉箭头根据用户需要选择其他可用引脚。

mcu

4设置CANFD Lite模块属性

切回Stacks选项卡,选择CANFD lite,转至Properties窗口(确保当前为FSP配置透视图的情况下,点击右上方:

mcu

打开Properties窗口。

或者通过Window→Show View→Other

mcu

搜索找到Properties窗口

mcu

4.1 设置标称比特率(Nominal Rate)和FD数据比特率(FD Data Rate)

可以选择自动生成比特率或者手动设置比特率

请注意,如果选择自动生成比特率,“Use manual settings”一项需要设置为No

mcu

4.2 修改AFL数量

由于RA6E2只有Channel 0,所以需要将“Channel 1 Rule Count”一项改为0

另外,RA6E2的CANFD Lite模块最多允许32个AFL条目。

mcu

4.3 设置使用的TX Mailbox 0(TX MB0)

例如通过TX Mailbox 0(TX MB0)发送数据,则勾选“TX MB0”一项。

mcu

4.4 设置发送优先级

发送优先级有可以选择CAN ID优先(Message ID)或者消息缓冲区编号优先(Buffer Number)。

mcu

4.5 设置接收MB的数量和大小

mcu

4.6 设置接收FIFO的中断模式、中断阈值、大小和深度

mcu

请注意,RX MB和FIFO位于有限的RAM区域中,所以在设置RX MB和FIFO时,大小和深度的最大值取决于可用的RAM区域。从FSP v4.3.0开始,如果超出CANFD RAM区域,FSP会提示错误。

4.7 设置Callback函数名和优先级

mcu

4.8 设置通道和全局错误中断,根据用户实际需要进行勾选

mcu

5添加AFL

RA CANFD使用AFL条目来过滤接收到的消息,AFL 的主要参数如下:

mcu

点击查看大图

例如想接收到以下要求的数据,那么在hal_entry.c文件中hal_entry()函数前需要复制以下const来设置AFL:

 Classical CAN Bus

 Standard ID (11 bits)

 RX MB 0 (to receive messages IDs 0x40 or 0x41)

左右滑动查看更多

 

const canfd_afl_entry_t p_canfd0_afl[CANFD_CFG_AFL_CH0_RULE_NUM] =
{
 {
     .id =
     {
         .id         = 0x40,
         .frame_type = CAN_FRAME_TYPE_DATA,
         .id_mode    = CAN_ID_MODE_STANDARD,
     },
     .mask =
     {
         .mask_id         = 0x7FE,
         .mask_frame_type = 0,
         .mask_id_mode    = 1,
     },
     .destination =
     {
         .minimum_dlc = CANFD_MINIMUM_DLC_0,
         .rx_buffer   = CANFD_RX_MB_0,
     },
 },
};

 

6CANFD相关API

mcu

点击查看大图

7用户代码中添加初始化函数、发送函数、接收函数和Callback函数

7.1 添加几个变量声明和一个宏定义

左右滑动查看更多

 

/* 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                  (8)  

 

7.2 添加初始化函数

左右滑动查看更多

 

    /* Initialize CANFD Lite driver*/
    R_CANFD_Open(&g_canfd0_ctrl, &g_canfd0_cfg);

 

7.3 添加发送函数

左右滑动查看更多

 

        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;//8;
        g_can_tx_frame.options          = CANFD_FRAME_OPTION_FD | CANFD_FRAME_OPTION_BRS;//0;
        g_can_tx_frame.options          = 0;


        /* Write some data to the transmit frame */
        R_CANFD_Write(&g_canfd0_ctrl, 0, &g_can_tx_frame);

 

7.4 当使用RX MB接收数据时,添加以下代码

左右滑动查看更多

 

        /* Get the status information for CAN transmission */
        R_CANFD_InfoGet(&g_canfd0_ctrl, &can_rx_info);


        /* Check if the data is received in FIFO */
        if((can_rx_info.rx_mb_status & (1<<0)) == (1<<0))
        {
            /* Read the input frame received */
            R_CANFD_Read(&g_canfd0_ctrl, 0, &g_can_rx_frame);
        }

 

7.5 添加Callback函数

左右滑动查看更多

使用FIFO接收时,需要在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;
            memcpy(&g_can_rx_frame, &p_args->frame, sizeof(can_frame_t));
            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;
        }
    }
}

 

通过以上内容,我们可以看到,瑞萨的FSP为嵌入式系统开发者提供了一种快速、灵活和可靠的软件开发平台,帮助使用者快速将创意转化为端产品,并满足不同市场的需求。

 

  审核编辑:汤梓红

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

全部0条评论

快来发表一下你的评论吧 !

×
20
完善资料,
赚取积分