前篇您可點擊上方的文章合集或文末的“上一篇 · RA MCU CANFD應用實例(上)”查看相關文章。
3.14 設置Stack
點擊New Stack,選擇CAN FD Lite。

3.15 它會變為紅色,表示FSP配置器發現模塊有錯誤
將鼠標指針懸停在 CAN FD lite框上并檢查錯誤:

3.16 CANFD時鐘默認為禁用狀態。
切換到Clocks選項卡,將CANFDCLK設置為40MHz:
●將PLL(鎖相環)分頻器改為Div / 2
●將PLL乘法器改為 Mul x16.0
●將CANFDCLK改為 Src: PLL
●將CANFDCLK分頻器改為 Div /4

3.17 切回Stacks選項卡,選擇CANFD lite,轉至Properties選項卡
(確保當前為FSP 配置透視圖 – 點擊右上方

)。打開屬性檢查比特率。
本實例將使用自動比特率生成器的默認比特率配置。您可在Bitrate->Automatic中檢查比特率。確保已禁用了“使用手動設置”。

3.18 檢查實際采樣點和比特率(hal_data.c)是否與應用程序的要求相匹配。

注意
●為了獲得最佳時鐘容差,檢查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上的error
就沒有了)
●Module CAN FD Lite->Transmit Interrupts: Enable TXMB 0
●Module CAN FD Lite->Reception->Message Buffer->Number of Buffer: 1

點擊Generate Project Content按鍵

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的主要參數:

點擊查看大圖
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 對工程進行編譯
和調試
。
3.26 運行代碼
,并按下FPB板上的S1,可以正常發送CANFD數據。
如果有CAN總線數據采集工具PCAN可以在這里進行驗證,如果沒有,請在下節完成后使用兩塊FPB板進行驗證。
3.27 按下斷開按鈕
。
注意
這兩張圖片用于比較Classical CAN與CANFD frames。第一張圖顯示CAN幀以500Kb/s的速度傳輸8Bytes,第二張圖顯示CANFD以兩個比特率(標稱速率為500Kb/s,FD數據速率為2Mb/s)傳輸64Bytes。
Classical CAN Frame:

CANFD Frame:

4
CANFD:使用FIFO接收數據
本節要點:
本節學習如何通過FIFO接收CAN消息。當對方FPB板按下S1,發送CANFD數據,可以使用FIFO正常接收CANFD數據。
4.1 打開fpb_ra6e2_canfd_lab工程中FSP配置:

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

點擊Generate Project Content
按鈕。
注意
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 對工程進行編譯
和調試
。
4.5 運行代碼
,并按下對方FPB板上的S1,能夠正確接收到CANFD數據。

4.6 按下斷開按鈕。
審核編輯:湯梓紅
-
mcu
+關注
關注
147文章
18924瀏覽量
397979 -
模塊
+關注
關注
7文章
2837瀏覽量
53282 -
鎖相環
+關注
關注
36文章
634瀏覽量
91104 -
pll
+關注
關注
6文章
981瀏覽量
138151 -
CANFD
+關注
關注
0文章
105瀏覽量
5896
發布評論請先 登錄
瑞薩RA系列MCU的外部引腳中斷詳解
RA MCU CANFD的應用實例(上)
構建RA MCU生態圈!RA MCU 生態1.0發布
如何使用M460系列MCU周期性傳送CANFD信息
RA MCU CAN和CANFD IP介紹
CAN和CANFD協議簡介(下)
RA MCU CAN和CANFD IP介紹
RA MCU CANFD的應用實例(下)
評論