在瑞萨RA系列MCU产品中,目前RA4E2、RA4T1、RA6E2、RA6T2和RA6T3搭载了CANFD Lite(硬件手册中成为CANFD_B)模块,相关的详细IP介绍,请参见之前的文章<RA MCU CAN和CANFD 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)。
2、设置时钟
CANFD时钟默认为禁用状态。选择Clocks选项卡,将CANFDCLK设置为40MHz:
● 将PLL(锁相环)分频器改为Div / 2
● 将PLL乘法器改为Mul x16.0
● 将CANFDCLK改为Src: PLL
● 将CANFDCLK分频器改为Div /4
3、设置引脚
选择Pins Tab,点击CANFD0,Pin Group Selection选择Mixed的情况下,Operation Mode选择Enabled,CRX0自动选择P102、CTX0自动选择P103,也可以通过右侧的下拉箭头根据用户需要选择其他可用引脚。
4、设置CANFD Lite模块属性
切回Stacks选项卡,选择CANFD lite,转至Properties窗口(确保当前为FSP配置透视图的情况下,点击右上方:
打开Properties窗口。
或者通过Window→Show View→Other
搜索找到Properties窗口
4.1 设置标称比特率(Nominal Rate)和FD数据比特率(FD Data Rate)
可以选择自动生成比特率或者手动设置比特率
请注意,如果选择自动生成比特率,“Use manual settings”一项需要设置为No。
4.2 修改AFL数量
由于RA6E2只有Channel 0,所以需要将“Channel 1 Rule Count”一项改为0。
另外,RA6E2的CANFD Lite模块最多允许32个AFL条目。
4.3 设置使用的TX Mailbox 0(TX MB0)
例如通过TX Mailbox 0(TX MB0)发送数据,则勾选“TX MB0”一项。
4.4 设置发送优先级
发送优先级有可以选择CAN ID优先(Message ID)或者消息缓冲区编号优先(Buffer Number)。
4.5 设置接收MB的数量和大小
4.6 设置接收FIFO的中断模式、中断阈值、大小和深度
请注意,RX MB和FIFO位于有限的RAM区域中,所以在设置RX MB和FIFO时,大小和深度的最大值取决于可用的RAM区域。从FSP v4.3.0开始,如果超出CANFD RAM区域,FSP会提示错误。
4.7 设置Callback函数名和优先级
4.8 设置通道和全局错误中断,根据用户实际需要进行勾选
5、添加AFL
RA CANFD使用AFL条目来过滤接收到的消息,AFL 的主要参数如下:
例如想接收到以下要求的数据,那么在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, }, },};
7、用户代码中添加初始化函数、发送函数、接收函数和Callback函数
/* 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为嵌入式系统开发者提供了一种快速、灵活和可靠的软件开发平台,帮助使用者快速将创意转化为端产品,并满足不同市场的需求。
来源:瑞萨嵌入式小百科
免责声明:本文为转载文章,转载此文目的在于传递更多信息,版权归原作者所有。本文所用视频、图片、文字如涉及作品版权问题,请联系小编进行处理(联系邮箱:cathy@eetrend.com)。