在瑞薩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)。
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, }, }, };
6CANFD相關API
點擊查看大圖
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為嵌入式系統開發者提供了一種快速、靈活和可靠的軟件開發平臺,幫助使用者快速將創意轉化為端產品,并滿足不同市場的需求。
審核編輯:湯梓紅
-
微控制器
+關注
關注
48文章
7552瀏覽量
151423 -
mcu
+關注
關注
146文章
17148瀏覽量
351197 -
嵌入式系統
+關注
關注
41文章
3593瀏覽量
129473 -
瑞薩
+關注
關注
35文章
22309瀏覽量
86307 -
FSP
+關注
關注
0文章
34瀏覽量
7141
原文標題:RA MCU CANFD在FSP中的配置詳解
文章出處:【微信號:瑞薩MCU小百科,微信公眾號:瑞薩MCU小百科】歡迎添加關注!文章轉載請注明出處。
發布評論請先 登錄
相關推薦
評論