IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 嵌入式 -> STM32H7 CANFD -> 正文阅读

[嵌入式]STM32H7 CANFD

一、组成

????? FDCAN1, FDCAN2, CANRAM

二、CANRAM 组成

??? 11 位滤波器、 29 位滤波器、 RX FIFO0、 RX FIFO1、 RX 缓冲区、 TX FIFO、 TX 缓冲区、 触发存储器

三、配置(完整代码见官方例程)

1、选择通道????????hfdcan.Instance = FDCANx;

2、选择协议????????hfdcan.Init.FrameFormat = FDCAN_FRAME_FD_BRS;

3、选择模式????????hfdcan.Init.Mode = FDCAN_MODE_NORMAL;

4、是否重发????????hfdcan.Init.AutoRetransmission = ENABLE;

5、是否暂停????????hfdcan.Init.TransmitPause = DISABLE;

6、异常处理????????hfdcan.Init.ProtocolException = ENABLE;

7、时钟相关????????hfdcan.Init.NominalPrescaler = 0x1; /* tq = NominalPrescaler x (1/fdcan_ker_ck) */
? hfdcan.Init.NominalSyncJumpWidth = 0x8;
? hfdcan.Init.NominalTimeSeg1 = 0x1F; /* NominalTimeSeg1 = Propagation_segment + Phase_segment_1 */
? hfdcan.Init.NominalTimeSeg2 = 0x8;

8、硬件协议相关????????hfdcan.Init.DataPrescaler = 0x1;
? hfdcan.Init.DataSyncJumpWidth = 0x4;
? hfdcan.Init.DataTimeSeg1 = 0x5; /* DataTimeSeg1 = Propagation_segment + Phase_segment_1 */
? hfdcan.Init.DataTimeSeg2 = 0x4;

9、内存分布????????hfdcan.Init.MessageRAMOffset = 0;

????? 每个通道,都可以配置? CANRAM 组成中每个的 起始地址 和 结束地址,且顺序无关,但不能通过HAL库API实现,因为HAL库API FDCAN_CalcultateRamBlockAddresses 按如下顺序组织:

????? 11 位滤波器、 29 位滤波器、 RX FIFO0、 RX FIFO1、 RX 缓冲区、 TX FIFO、 TX 缓冲区、 触发存储器,具体代码如下:

hfdcan->msgRam.StandardFilterSA = SRAMCAN_BASE + (hfdcan->Init.MessageRAMOffset * 4U);
? hfdcan->msgRam.ExtendedFilterSA = hfdcan->msgRam.StandardFilterSA + (hfdcan->Init.StdFiltersNbr * 4U);
? hfdcan->msgRam.RxFIFO0SA = hfdcan->msgRam.ExtendedFilterSA + (hfdcan->Init.ExtFiltersNbr * 2U * 4U);
? hfdcan->msgRam.RxFIFO1SA = hfdcan->msgRam.RxFIFO0SA + (hfdcan->Init.RxFifo0ElmtsNbr * hfdcan->Init.RxFifo0ElmtSize * 4U);
? hfdcan->msgRam.RxBufferSA = hfdcan->msgRam.RxFIFO1SA + (hfdcan->Init.RxFifo1ElmtsNbr * hfdcan->Init.RxFifo1ElmtSize * 4U);
? hfdcan->msgRam.TxEventFIFOSA = hfdcan->msgRam.RxBufferSA + (hfdcan->Init.RxBuffersNbr * hfdcan->Init.RxBufferSize * 4U);
? hfdcan->msgRam.TxBufferSA = hfdcan->msgRam.TxEventFIFOSA + (hfdcan->Init.TxEventsNbr * 2U * 4U);
? hfdcan->msgRam.TxFIFOQSA = hfdcan->msgRam.TxBufferSA + (hfdcan->Init.TxBuffersNbr * hfdcan->Init.TxElmtSize * 4U);

即只是偏移了而已,除非自己重写或改HAL库代码;

10、CANRAM 组成中每个的 起始地址 和 结束地址

?11 位滤波器 个数???????? hfdcan.Init.StdFiltersNbr = 1;
? 29 位滤波器 个数??????? hfdcan.Init.ExtFiltersNbr = 0;
? RX FIFO0 个数?????????? hfdcan.Init.RxFifo0ElmtsNbr = 2;
? RX FIFO0? 大小????????? hfdcan.Init.RxFifo0ElmtSize = FDCAN_DATA_BYTES_8;
? RX FIFO1 个数 ????????? hfdcan.Init.RxFifo1ElmtsNbr = 0;
? RX 缓冲区 个数????????? hfdcan.Init.RxBuffersNbr = 0;
? TX FIFO 个数???????????? hfdcan.Init.TxEventsNbr = 0;
? TX 缓冲区 个数????????? hfdcan.Init.TxBuffersNbr = 0;
?? TX 大小???????????????????? hfdcan.Init.TxElmtSize = FDCAN_DATA_BYTES_8;

四、接收配置

? 滤波器类型????????sFilterConfig.IdType = FDCAN_STANDARD_ID;
? 滤波器编号????????sFilterConfig.FilterIndex = 0;
? 滤波器类型????????sFilterConfig.FilterType = FDCAN_FILTER_MASK;
? 匹配存储位置???? sFilterConfig.FilterConfig = FDCAN_FILTER_TO_RXFIFO0;
? 匹配 ID?????????????? sFilterConfig.FilterID1 = 0x111;
? 匹配 ID?????????????? sFilterConfig.FilterID2 = 0x7FF;
? 增加滤波器????????HAL_FDCAN_ConfigFilter(&hfdcan, &sFilterConfig);

HAL_FDCAN_GetRxMessage(&hfdcan, FDCAN_RX_FIFO0, &RxHeader, RxData);

五、发送配置

? ID????????????????TxHeader.Identifier = 0x111;
? ID 类型????????TxHeader.IdType = FDCAN_STANDARD_ID;
? 发送类型???? TxHeader.TxFrameType = FDCAN_DATA_FRAME;
? 数据大小???? TxHeader.DataLength = FDCAN_DLC_BYTES_8;
? 异常处理???? TxHeader.ErrorStateIndicator = FDCAN_ESI_ACTIVE;
? 速率可变???? TxHeader.BitRateSwitch = FDCAN_BRS_ON;
? 协议类型???? TxHeader.FDFormat = FDCAN_FD_CAN;
? 发送控制???? TxHeader.TxEventFifoControl = FDCAN_NO_TX_EVENTS;
? 发送标记???? TxHeader.MessageMarker = 0;

HAL_FDCAN_AddMessageToTxFifoQ(&hfdcan, &TxHeader, &TxData[0]);

六、空间分配合法性

??????? 特别注意:具体的划分由软件编写者自行决定,检查,硬件和HAL库不管是否合适。

?
?
?
?
?
?
?

  嵌入式 最新文章
基于高精度单片机开发红外测温仪方案
89C51单片机与DAC0832
基于51单片机宠物自动投料喂食器控制系统仿
《痞子衡嵌入式半月刊》 第 68 期
多思计组实验实验七 简单模型机实验
CSC7720
启明智显分享| ESP32学习笔记参考--PWM(脉冲
STM32初探
STM32 总结
【STM32】CubeMX例程四---定时器中断(附工
上一篇文章      下一篇文章      查看所有文章
加:2021-08-18 12:52:01  更:2021-08-18 12:53:42 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/25 20:40:10-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码