NXP RT1060學習總結 - CANFD功能

1、RT1060-CAN FD功能簡介

這里使用RT1060系列的1064芯片進行開發,測試板是官方提供的開發板;RT1060系列支持3路CAN功能,CAN1和CAN2只能最為普通的CAN外設,支持CAN2.0,而CAN3支持CAN-FD功能;CAN-FD功能這里就不做詳細介紹,百度上很多該方面資料,核心點是普通CAN只能傳輸8字節數據,而CAN-FD最大支持傳輸64字節數據。
注意事項:使用CANFD功能的時候,用于測試的CAN工具需要支持CANFD功能。

2、各類宏定義和全局變量

#define EXAMPLE_CAN CAN3								//使用的CAN外設 - CAN3
#define RX_MESSAGE_BUFFER_NUM (10)		//接收郵箱
#define TX_MESSAGE_BUFFER_NUM (9)			//發送郵箱#define EXAMPLE_CAN_CLK_SOURCE (kFLEXCAN_ClkSrc1)	//CAN時鐘/* 選擇60M時鐘除以USB1 PLL (480mhz)作為flexcan主時鐘源 */
#define FLEXCAN_CLOCK_SOURCE_SELECT (0U)
/* Clock divider for master flexcan clock source */
#define FLEXCAN_CLOCK_SOURCE_DIVIDER (2U)#define DLC         (15)
#define BYTES_IN_MB kFLEXCAN_64BperMB	//每個消息區選擇64字節數據
#define EXAMPLE_CAN_CLK_FREQ ((CLOCK_GetFreq(kCLOCK_Usb1PllClk) / 8) / (FLEXCAN_CLOCK_SOURCE_DIVIDER + 1U))	//時鐘頻率flexcan_handle_t flexcanHandle;
volatile bool txComplete = false;			//發送完成標志
volatile bool rxComplete = false;			//接收完成標志
volatile bool wakenUp    = false;			//喚醒標識
flexcan_mb_transfer_t txXfer, rxXfer;	//郵箱
flexcan_fd_frame_t frame;uint32_t txIdentifier;		//收發ID標識符
uint32_t rxIdentifier;uint16_t t_Count = 0;	//用于測試

3、CAN FD IO初始化

static void can2_gpio_config(void)
{//設置GPIO的時鐘CLOCK_EnableClock(kCLOCK_Iomuxc);//配置IO的復用模式 設置為CAN3的TX和RX功能IOMUXC_SetPinMux(IOMUXC_GPIO_AD_B0_14_FLEXCAN3_TX, 1U); IOMUXC_SetPinMux(IOMUXC_GPIO_AD_B0_15_FLEXCAN3_RX, 1U);//配置GPIO功能IOMUXC_SetPinConfig(IOMUXC_GPIO_AD_B0_14_FLEXCAN3_TX, 0x10B0U); IOMUXC_SetPinConfig(IOMUXC_GPIO_AD_B0_15_FLEXCAN3_RX, 0x10B0U); 
}

4、CAN FD功能配置

void can2_function_config(void)
{flexcan_config_t flexcanConfig;					//CAN配置flexcan_rx_mb_config_t mbConfig;				//接收郵箱配置flexcan_timing_config_t timing_config;		//時間配置/* FLEXCAN時鐘配置 */CLOCK_SetMux(kCLOCK_CanMux, FLEXCAN_CLOCK_SOURCE_SELECT);CLOCK_SetDiv(kCLOCK_CanDiv, FLEXCAN_CLOCK_SOURCE_DIVIDER);/* 設置發送和接收的幀ID */txIdentifier = 0x321;rxIdentifier = 0x123;/* Get FlexCAN module default Configuration. *//** flexcanConfig.clkSrc                 = kFLEXCAN_ClkSrc0;* flexcanConfig.bitRate               = 1000000U;* flexcanConfig.bitRateFD             = 2000000U;* flexcanConfig.maxMbNum               = 16;* flexcanConfig.enableLoopBack         = false;* flexcanConfig.enableSelfWakeup       = false;* flexcanConfig.enableIndividMask      = false;* flexcanConfig.disableSelfReception   = false;* flexcanConfig.enableListenOnlyMode   = false;* flexcanConfig.enableDoze             = false;*/FLEXCAN_GetDefaultConfig(&flexcanConfig);flexcanConfig.clkSrc = EXAMPLE_CAN_CLK_SOURCE;flexcanConfig.bitRate = 500000U;			//這里使用的是**bitRate**,bit位的波特率memset(&timing_config, 0, sizeof(flexcan_timing_config_t));if (FLEXCAN_FDCalculateImprovedTimingValues(EXAMPLE_CAN, flexcanConfig.bitRate, flexcanConfig.bitRateFD,EXAMPLE_CAN_CLK_FREQ, &timing_config)){/* 更新修改后的定時配置 */memcpy(&(flexcanConfig.timingConfig), &timing_config, sizeof(flexcan_timing_config_t));}FLEXCAN_FDInit(EXAMPLE_CAN, &flexcanConfig, EXAMPLE_CAN_CLK_FREQ, BYTES_IN_MB, true);/* 創建CAN句柄 并建立回調函數 */FLEXCAN_TransferCreateHandle(EXAMPLE_CAN, &flexcanHandle, flexcan_callback, NULL);/* 設置接收屏蔽機制 后面來仔細研究一下該屏蔽機制 */FLEXCAN_SetRxMbGlobalMask(EXAMPLE_CAN, FLEXCAN_RX_MB_STD_MASK(rxIdentifier, 0, 0));/* 設置接收消息緩存 */mbConfig.format = kFLEXCAN_FrameFormatStandard;		//標準幀mbConfig.type   = kFLEXCAN_FrameTypeData;			//數據幀mbConfig.id     = FLEXCAN_ID_STD(rxIdentifier);		//設置幀IDFLEXCAN_SetFDRxMbConfig(EXAMPLE_CAN, RX_MESSAGE_BUFFER_NUM, &mbConfig, true);/* 設置發送消息緩存 */FLEXCAN_SetFDTxMbConfig(EXAMPLE_CAN, TX_MESSAGE_BUFFER_NUM, true);
}

流程與基礎CAN功能類似,在波特率配置的時候使用的是bitRate ,這里需要注意以下;
從源碼上看bitRate 和 baudRate的注釋,好像也沒有什么不同,如下圖所示:(有了解的伙伴可以下面評論留言)
CAN外設文件源碼中的配置結構體
配置的接收是輪詢接收,中斷接收后面再測試一下,配合官方SDK的例程探索,難度不大。
這里還配置了一個回調函數,用于判斷接收和發送是否完成。

5、CAN FD收發

//發送數據
void can2_send_data(void)
{frame.id = FLEXCAN_ID_STD(txIdentifier);frame.format = (uint8_t)kFLEXCAN_FrameFormatStandard;frame.type   = (uint8_t)kFLEXCAN_FrameTypeData;frame.length = (uint8_t)DLC;frame.brs = 1U;	//靈活的數據率格式與比特率開關frame.edl = 1U;	//靈活的數據速率格式擴展數據長度frame.dataWord[0] = 0x12345678;frame.dataWord[2] = 0x12345678;frame.dataWord[15] = t_Count;txXfer.mbIdx = (uint8_t)TX_MESSAGE_BUFFER_NUM;	//用于傳輸消息的消息緩沖區的索引。txXfer.framefd = &frame;(void)FLEXCAN_TransferFDSendNonBlocking(EXAMPLE_CAN, &flexcanHandle, &txXfer);//FLEXCAN_WriteFDTxMb(EXAMPLE_CAN, TX_MESSAGE_BUFFER_NUM, &frame);
}/*!* @brief FlexCAN Call Back function*/
static FLEXCAN_CALLBACK(flexcan_callback)
{switch (status){case kStatus_FLEXCAN_RxIdle:if (RX_MESSAGE_BUFFER_NUM == result){rxComplete = true;}break;case kStatus_FLEXCAN_TxIdle:if (TX_MESSAGE_BUFFER_NUM == result){txComplete = true;}break;case kStatus_FLEXCAN_WakeUp:wakenUp = true;break;default:break;}
}//輪詢接收
void can2_receive_data(void)
{rxXfer.mbIdx = (uint8_t)RX_MESSAGE_BUFFER_NUM;rxXfer.framefd = &frame;//無阻塞接收 利用回調函數進行接收數據(void)FLEXCAN_TransferFDReceiveNonBlocking(EXAMPLE_CAN, &flexcanHandle, &rxXfer);if (rxComplete == true){t_Count++; rxComplete = false;}
}

這里的接收和發送有一個聯動的功能,就是CAN FD接收到正確的幀ID后,會將t_Count++;,然后再發送的地方frame.dataWord[15] = t_Count;這樣就可以檢測這個CAN FD的發送后接收是否都正確。
另外需要注意的是,使用CAN FD一定需要將flexcan_fd_frame_t 中的brs 、edl 置1;
CAN FD 發送配置

6、涉及的函數及標志位解釋

6.1……

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/bicheng/21043.shtml
繁體地址,請注明出處:http://hk.pswp.cn/bicheng/21043.shtml
英文地址,請注明出處:http://en.pswp.cn/bicheng/21043.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

【LeetCode 77. 組合】

1. 題目 2. 分析 本題有個難點在于如何保存深搜得到的結果?總結了一下,深搜處理的代碼,關于返回值有三大類。 第一類:層層傳遞,將最深層的結果傳上來;這類題有:【反轉鏈表】 第二類&#xff1…

域名/子域名接管漏洞

域名/子域名接管漏洞 1.域接管2.子域接管子域接管概述使用BBOT掃描可劫持的子域通過DNS通配符生成子域接管 3.利用子域接管4.子域名接管防御手段 1.域接管 如果您發現某個域名被某個服務使用,但公司已經失去了對其的所有權,您可以嘗試注冊它&#xff08…

默認路由,直接路由,靜態路由,動態路由

對于華為設備,如華為路由器或交換機,設置這些路由類型需要通過設備的管理界面或命令行界面進行配置。以下是一般情況下如何在華為設備上設置這些路由類型的指導: 默認路由: 使用命令行界面(CLI)&#xff0c…

QMatrix詳解

一、定義 QMatrix是Qt框架中的一個類,它表示一個2x3的變換矩陣,通常用于進行二維圖形的幾何變換。這個類允許你對圖形進行平移、縮放、旋轉和剪切等操作。 二、功能 QMatrix的主要功能是提供一個便捷的方式來對二維圖形進行線性變換。通過構建一個變換…

CS和msf的權限傳遞,利用mimikatz抓取win10明文密碼

一、Cobaltstrike的安裝 http://t.csdnimg.cn/yhZin 安裝CobaltStrike,瀏覽博主的上篇文章即可!!! 這里我在自己的本機win11上執行了Client去連接kali中的Server端,直接執行.cmd文件即可!!&…

【vscode】ctrl+shift+end選中以下所有行刪除

總結,ctrlshiftend選中以下所有行 以下由chatgpt生成 在 Visual Studio Code(VS Code)中,如果你想要選中當前光標所在的一行及之后的所有行并刪除它們,可以通過組合鍵操作來實現。這種功能在編輯大型文件時特別有用&am…

【計算機畢業設計】基于SSM++jsp的校園驛站管理系統【源碼+lw+部署文檔】

目錄 第1章 緒論 1.1 課題背景 1.2 課題意義 1.3 研究內容 第2章 開發環境與技術 2.1 MYSQL數據庫 2.2 JSP技術 2.3 SSM框架 第3章 系統分析 3.1 可行性分析 3.1.1 技術可行性 3.1.2 經濟可行性 3.1.3 操作可行性 3.2 系統流程 3.2.1 操作流程 3.2.2 登錄流程 3.2.3 刪除信息流…

node會話管理詳解(cookie、session、token)

在Node.js中,cookie、session和token都是用于會話管理的機制,但它們各自有不同的使用場景和特性。 一、cookie 命令:npm install cookie-parser -save -save 參數表示將這個模塊添加到項目的 package.json 文件的 dependencies 部分&#x…

C語言| 輸出菱形*

C語言| 輸出*三角形-CSDN博客 輸出菱形。 【分析思路】 學會輸出*的三角形之后輸出菱形就很簡單了。我們分析一下,菱形是由兩個對稱的三角形組成的,也因為是對稱的,所以輸出的菱形的行數肯定是一個奇數。 1 我們在編程的時候,要…

基于卷積-小波神經網絡的SAR圖像海冰變化檢測方法(MATLAB R2018A)

海冰是冰凍圈的重要組成部分,海冰的變化信息對航行安全和自然資源開采等非常重要,許多船舶沒有加固防冰設備,因此,必須避開所有的冰區。尤其當冰壓很高時,即使破冰船也很難在冰層中前行。為了安全航行,獲取…

leetCode.89. 格雷編碼

leetCode.89. 格雷編碼 題目思路 代碼 class Solution { public:vector<int> grayCode(int n) {vector<int> res(1,0); // n 0時&#xff0c;之后一位0while (n--) {// 想要實現對象超下來&#xff0c;就從末尾開始&#xff0c;讓vector里面 加 元素for (int i …

Stable Diffusion Webui--安裝與使用

最近進行的課程匯報&#xff0c;學習了2023年的CVPR文章《DreamBooth: Fine Tuning Text-to-Image Diffusion Models for Subject-Driven Generation》&#xff0c;因此嘗試使用了幾種方法對這篇文章的工作進行了一定的復現。本文主要介紹Stable Diffusion Web UI(webui)的安裝…

【因果推斷python】10_分組和虛擬變量回歸1

目錄 分組數據回歸 分組數據回歸 并非所有數據點都是一樣的。 如果我們再次查看我們的 ENEM 數據集&#xff0c;相比小規模學校的分數&#xff0c;我們更相信規模較大的學校的分數。 這并不是說大型學校更好或什么&#xff0c; 而只是因為它們的較大規模意味著更小的方差。 i…

bootstrap5-學習筆記1-容器+布局+按鈕+工具

參考&#xff1a; Bootstrap5 教程 | 菜鳥教程 https://www.runoob.com/bootstrap5/bootstrap5-tutorial.html Spacing Bootstrap v5 中文文檔 v5.3 | Bootstrap 中文網 https://v5.bootcss.com/docs/utilities/spacing/ 之前用bootstrap2和3比較多&#xff0c;最近用到了5&a…

SRE視角下的DevOps構建之道

引言&#xff1a; 隨著數字化時代的飛速發展&#xff0c;軟件成為了企業競爭力的核心。為了更高效地交付高質量的軟件&#xff0c;DevOps&#xff08;Development和Operations的組合&#xff09;作為一種文化、實踐和工具集的集合&#xff0c;逐漸成為了行業內的熱門話題。然而…

OpenFHE 使用樣例

參考文獻&#xff1a; 編譯 OpenFHEOpenFHE 源碼解析&#xff1a;PKE 部分[ABB22] Al Badawi A, Bates J, Bergamaschi F, et al. Openfhe: Open-source fully homomorphic encryption library[C]//Proceedings of the 10th Workshop on Encrypted Computing & Applied Ho…

渲染100為什么是高性價比網渲平臺?渲染100邀請碼1a12

市面上主流的網渲平臺有很多&#xff0c;如渲染100、瑞云、炫云、渲云等&#xff0c;這些平臺各有特色和優勢&#xff0c;也都聲稱自己性價比高&#xff0c;以渲染100為例&#xff0c;我們來介紹下它的優勢有哪些。 1、渲染100對新用戶很友好&#xff0c;注冊填邀請碼1a12有3…

【CTF MISC】XCTF GFSJ0008 low Writeup(LSB隱寫+QR Code識別)

low 暫無 解法 用 StegSolve 打開&#xff0c;Green plane 1 中疑似隱藏有二維碼。 使用大佬寫的代碼&#xff1a; from PIL import Imageimg Image.open("./low.bmp") img_tmp img.copy() pix img_tmp.load() width, height img_tmp.size for w in range(wid…

每日一題——Python實現PAT甲級1046 Shortest Distance(舉一反三+思想解讀+逐步優化)

一個認為一切根源都是“自己不夠強”的INTJ 個人主頁&#xff1a;用哲學編程-CSDN博客專欄&#xff1a;每日一題——舉一反三Python編程學習Python內置函數 Python-3.12.0文檔解讀 目錄 我的寫法 專業點評 優點 改進建議 時間復雜度分析 空間復雜度分析 總結 我要更…

Python模塊導入的寫法

關于Python模塊導入的寫法有 相對路徑導入 和 絕對路徑導入 兩種不同的導入路徑的寫法。 文章目錄 相對路徑導入絕對路徑導入總結 相對路徑導入 from .utils import upblock2d, crossattn_upblock2d使用了相對導入&#xff0c;以&#xff08;“.”&#xff09;開頭這種導入方…