前篇您可點(diǎn)擊上方的文章合集或文末的“上一篇 · RA MCU CANFD應(yīng)用實(shí)例(上)”查看相關(guān)文章。
3.14 設(shè)置Stack
點(diǎn)擊New Stack,選擇CAN FD Lite。
3.15 它會變?yōu)榧t色,表示FSP配置器發(fā)現(xiàn)模塊有錯誤
將鼠標(biāo)指針懸停在 CAN FD lite框上并檢查錯誤:
3.16 CANFD時鐘默認(rèn)為禁用狀態(tài)。
切換到Clocks選項(xiàng)卡,將CANFDCLK設(shè)置為40MHz:
●將PLL(鎖相環(huán))分頻器改為Div / 2
●將PLL乘法器改為 Mul x16.0
●將CANFDCLK改為 Src: PLL
●將CANFDCLK分頻器改為 Div /4
3.17 切回Stacks選項(xiàng)卡,選擇CANFD lite,轉(zhuǎn)至Properties選項(xiàng)卡
(確保當(dāng)前為FSP 配置透視圖 – 點(diǎn)擊右上方
)。打開屬性檢查比特率。
本實(shí)例將使用自動比特率生成器的默認(rèn)比特率配置。您可在Bitrate->Automatic中檢查比特率。確保已禁用了“使用手動設(shè)置”。
3.18 檢查實(shí)際采樣點(diǎn)和比特率(hal_data.c)是否與應(yīng)用程序的要求相匹配。
注意
●為了獲得最佳時鐘容差,檢查Arbitration baud_rate_prescaler和Data baud_rate_prescaler是否相同至關(guān)重要。
●如果啟用了收發(fā)器Delay Compensation,請不要使Data baud_rate_prescaler位大于 1。
3.19 我們將傳輸CANFD消息(msg ID:0x60),通過TX Mailbox 0(TX MB0)。
為此,我們需要修改以下參數(shù):
●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
點(diǎn)擊Generate Project Content按鍵
3.20 要使用CANFD Lite堆棧,您需要先初始化CANFD模塊。
為此,在hal_entry()函數(shù)中添加以下內(nèi)容:
左右滑動查看更多
/* Initialize CANFD Lite driver*/ err = R_CANFD_Open(&g_canfd0_ctrl, &g_canfd0_cfg); if(FSP_SUCCESS != err) { APP_ERR_TRAP(); }
3.21 須將AFL條目設(shè)置為在應(yīng)用中接收消息。
本實(shí)例需求如下:
●CANFD Bus
●Standard ID (11 bits)
●Message FIFO Buffer 0 (接收0x60 ~ 0x6F的消息ID)
在hal_entry.c文件中hal_entry()函數(shù)前復(fù)制以下const來設(shè)置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的主要參數(shù):
點(diǎn)擊查看大圖
3.22 在hal_entry.c文件中hal_entry()函數(shù)前添加幾個變量聲明和一個宏定義:
左右滑動查看更多
/* 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函數(shù)(也可以使用拖拽的方式進(jìn)行添加):
左右滑動查看更多
/* 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數(shù)據(jù),需用到CAN傳輸函數(shù)的選項(xiàng)參數(shù)。
有三個僅限CANFD的位可以啟用一些獨(dú)有的 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字節(jié),所以我們將DLC(數(shù)據(jù)長度代碼)設(shè)為64。
在按鍵user_irq_callback函數(shù)if(9 == p_args->channel)中添加以下代碼以發(fā)送標(biāo)準(zhǔn)數(shù)據(jù)(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函數(shù)中,如果傳輸消息緩沖區(qū) (TXMB) 已在使用中,則傳輸消息將排隊(duì)。CANFD_B外圍設(shè)備自動傳輸排隊(duì)的消息,并按消息緩沖區(qū)編號或消息ID確定其優(yōu)先級(請參閱 CANFD Lite堆棧傳輸優(yōu)先級屬性)。
3.25 對工程進(jìn)行編譯和調(diào)試。
3.26 運(yùn)行代碼,并按下FPB板上的S1,可以正常發(fā)送CANFD數(shù)據(jù)。
如果有CAN總線數(shù)據(jù)采集工具PCAN可以在這里進(jìn)行驗(yàn)證,如果沒有,請?jiān)谙鹿?jié)完成后使用兩塊FPB板進(jìn)行驗(yàn)證。
3.27 按下斷開按鈕。
注意
這兩張圖片用于比較Classical CAN與CANFD frames。第一張圖顯示CAN幀以500Kb/s的速度傳輸8Bytes,第二張圖顯示CANFD以兩個比特率(標(biāo)稱速率為500Kb/s,F(xiàn)D數(shù)據(jù)速率為2Mb/s)傳輸64Bytes。
Classical CAN Frame:
CANFD Frame:
4
CANFD:使用FIFO接收數(shù)據(jù)
本節(jié)要點(diǎn):
本節(jié)學(xué)習(xí)如何通過FIFO接收CAN消息。當(dāng)對方FPB板按下S1,發(fā)送CANFD數(shù)據(jù),可以使用FIFO正常接收CANFD數(shù)據(jù)。
4.1 打開fpb_ra6e2_canfd_lab工程中FSP配置:
4.2 切到Stacks選項(xiàng)卡,選擇CANFD Lite,然后轉(zhuǎn)到Properties選項(xiàng)卡(確保當(dāng)前為FSP配置透視圖)。
Reception FIFO 0默認(rèn)為啟用狀態(tài),并配置為每幀觸發(fā)一次中斷。您可在FSP配置器中檢查配置。(Module g_canfd0 CAN FD Lite (r_canfdlite)->Reception->FIFOs->FIFO 0)
并更改如下RX FIFO參數(shù)以確保其可以接收64字節(jié)的數(shù)據(jù)。
●Reception->FIFO->FIFO 0->Payload Size: 64 Bytes
●Reception->FIFO->FIFO 0->Depth: 8 Stages
點(diǎn)擊Generate Project Content按鈕。
注意
CANFD外設(shè)具有一個有限數(shù)量的緩沖池RAM,可用于分配RX MB和FIFO等級。就RA6E2和RA4E2而言:
●最大64-byte 存儲:16則消息
●最大8-byte 存儲:60則消息
4.3 在canfd0_callback中添加以下代碼以便從FIFO獲取數(shù)據(jù):
左右滑動查看更多
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緩沖區(qū)中有幀時,F(xiàn)SP ISR Handler將會多次調(diào)用CANFD回調(diào)函數(shù)。
4.4 對工程進(jìn)行編譯和調(diào)試。
4.5 運(yùn)行代碼,并按下對方FPB板上的S1,能夠正確接收到CANFD數(shù)據(jù)。
4.6 按下斷開按鈕。
審核編輯:湯梓紅
-
mcu
+關(guān)注
關(guān)注
146文章
17148瀏覽量
351198 -
模塊
+關(guān)注
關(guān)注
7文章
2707瀏覽量
47474 -
鎖相環(huán)
+關(guān)注
關(guān)注
35文章
584瀏覽量
87767 -
pll
+關(guān)注
關(guān)注
6文章
776瀏覽量
135160 -
CANFD
+關(guān)注
關(guān)注
0文章
58瀏覽量
4948
原文標(biāo)題:RA MCU CANFD應(yīng)用實(shí)例(下)
文章出處:【微信號:瑞薩MCU小百科,微信公眾號:瑞薩MCU小百科】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。
發(fā)布評論請先 登錄
相關(guān)推薦
評論