首先,简单介绍一下FSP。瑞萨的Flexibility Software Package(FSP)是一种嵌入式软件和开发工具包,提供了集成的软件平台,帮助开发者快速设计、开发和部署嵌入式系统。FSP提供了一系列软件组件、设备驱动程序、操作系统抽象层和中间件,以及与瑞萨微控制器相配套的开发工具。通过使用FSP,开发者可以减少开发时间和成本,快速构建高度可靠、高性能的嵌入式系统。
通过FSP的图形化界面可以设置RA CANFD Lite模块的引脚和功能,使用FSP生成的函数可以执行CANFD Lite模块的初始化,发送&接收数据,这样可以加快项目完成,缩短用户开发时间。
而使用FSP如何设置RA CANFD Lite功能,将从以下几个方面进行说明:
添加CANFD Lite模块
在e2 studio双击工程中的configuraion.xml文件,在Stacks选项卡中,点击New Stack,选择CANFD Lite (r_canfdlite)。
设置时钟
CANFD时钟默认为禁用状态。选择Clocks选项卡,将CANFDCLK设置为40MHz:
● 将PLL(锁相环)分频器改为Div / 2
● 将PLL乘法器改为Mul x16.0
● 将CANFDCLK改为Src: PLL
● 将CANFDCLK分频器改为Div /4
设置引脚
选择Pins Tab,点击CANFD0,Pin Group Selection选择Mixed的情况下,Operation Mode选择Enabled,CRX0自动选择P102、CTX0自动选择P103,也可以通过右侧的下拉箭头根据用户需要选择其他可用引脚。
设置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, }, }, };
CANFD相关API
点击查看大图
用户代码中添加初始化函数、发送函数、接收函数和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函数
/* 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为嵌入式系统开发者提供了一种快速、灵活和可靠的软件开发平台,帮助使用者快速将创意转化为端产品,并满足不同市场的需求。
-
mcu
+关注
关注
146文章
17152浏览量
351262 -
FSP
+关注
关注
0文章
34浏览量
7141 -
CANFD
+关注
关注
0文章
58浏览量
4962
发布评论请先 登录
相关推荐
评论