首页 > 其他分享 >CAN--CAN例程中的参数解释

CAN--CAN例程中的参数解释

时间:2023-07-03 11:44:50浏览次数:35  
标签:存储 例程 成员 ID -- 参数 设置 筛选 报文

typedef struct
{

 uint16_t CAN_Prescaler; /*配置CAN外设的时钟分频,可设置为1-1024*/

 uint8_t CAN_Mode; /*配置CAN的工作模式,回环或正常模式*/

 uint8_t CAN_SJW; /*配置SJW极限值 */

 uint8_t CAN_BS1; /*配置BS1段长度*/

 uint8_t CAN_BS2; /*配置BS2段长度 */

 FunctionalState CAN_TTCM; /*是否使能TTCM时间触发功能*/

 FunctionalState CAN_ABOM; /*是否使能ABOM自动离线管理功能*/

 FunctionalState CAN_AWUM; /*是否使能AWUM自动唤醒功能 */

 FunctionalState CAN_NART; /*是否使能NART自动重传功能*/

 FunctionalState CAN_RFLM; /*是否使能RFLM锁定FIFO功能*/

 FunctionalState CAN_TXFP; /*配置TXFP报文优

} CAN_InitTypeDef;

成员说明如下:

CAN初始化结构体:

(1)    CAN_Prescaler

本成员设置CAN外设的时钟分频,它可控制时间片Tq的时间长度,这里设置的值最终会减1后再写入BRP寄存器位

(2)    CAN_Mode

本成员设置CAN的工作模式,可设置为正常模式(CAN_Mode_Normal)、回环模式(CAN_Mode_LoopBack)、静默模式(CAN_Mode_Silent)以及回环静默模式(CAN_Mode_Silent_LoopBack)。

(3)    CAN_SJW

本成员可以配置SJW的极限长度,即CAN重新同步时单次可增加或缩短的最大长度,它可以被配置为1-4Tq(CAN_SJW_1/2/3/4tq)。

(4)    CAN_BS1

本成员用于设置CAN位时序中的BS1段的长度,它可以被配置为1-16个Tq长度(CAN_BS1_1/2/3…16tq)。

(5)    CAN_BS2

本成员用于设置CAN位时序中的BS2段的长度,它可以被配置为1-8个Tq长度(CAN_BS2_1/2/3…8tq)。

SYNC_SEG、BS1段及BS2段的长度加起来即一个数据位的长度,即前面介绍的原来计算公式:

T1bit =1Tq+TS1+TS2 =1+ (TS1[3:0] + 1)+ (TS2[2:0] + 1)

等效于:T1bit = 1Tq+CAN_BS1+CAN_BS2

(6)    CAN_TTCM

本成员用于设置是否使用时间触发功能(ENABLE/DISABLE),时间触发功能在某些CAN标准中会使用到。

(7)    CAN_ABOM

本成员用于设置是否使用自动离线管理(ENABLE/DISABLE),使用自动离线管理可以在节点出错离线后适时自动恢复,不需要软件干预。

(8)    CAN_ AWUM

本成员用于设置是否使用自动唤醒功能(ENABLE/DISABLE),使能自动唤醒功能后它会在监测到总线活动后自动唤醒。

(9)    CAN_ABOM

本成员用于设置是否使用自动离线管理功能(ENABLE/DISABLE),使用自动离线管理可以在出错时离线后适时自动恢复,不需要软件干预。

(10)    CAN_NART

本成员用于设置是否使用自动重传功能(ENABLE/DISABLE),使用自动重传功能时,会一直发送报文直到成功为止。

(11)    CAN_RFLM

本成员用于设置是否使用锁定接收FIFO(ENABLE/DISABLE),锁定接收FIFO后,若FIFO溢出时会丢弃新数据,否则在FIFO溢出时以新数据覆盖旧数据。

(12)    CAN_TXFP

本成员用于设置发送报文的优先级判定方法(ENABLE/DISABLE),使能时,以报文存入发送邮箱的先后顺序来发送,否则按照报文ID的优先级来发送。

 

配置完这些结构体成员后,我们调用库函数CAN_Init即可把这些参数写入到CAN控制寄存器中,实现CAN的初始化。

CAN发送和接收结构体:

 typedef struct {

 uint32_t StdId; /*存储报文的标准标识符11位,0-0x7FF. */
 uint32_t ExtId; /*存储报文的扩展标识符29位,0-0x1FFFFFFF. */
 uint8_t IDE; /*存储IDE扩展标志 */
 uint8_t RTR; /*存储RTR远程帧标志*/
 uint8_t DLC; /*存储报文数据段的长度,0-8 */
 uint8_t Data[8]; /*存储报文数据段的内容 */
  } CanTxMsg;

uint8_t FMI; /*存储了本报文是由经过筛选器存储进FIFO的,0-0xFF */

注:发送结构体与接收结构体是类似的,只是接收结构体多了一个FMI成员

(1)    StdId

本成员存储的是报文的11位标准标识符,范围是0-0x7FF。

(2)    ExtId

本成员存储的是报文的29位扩展标识符,范围是0-0x1FFFFFFF。ExtId与StdId这两个成员根据下面的IDE位配置,只有一个是有效的。

(3)    IDE

本成员存储的是扩展标志IDE位,当它的值为宏CAN_ID_STD时表示本报文是标准帧,使用StdId成员存储报文ID;当它的值为宏CAN_ID_EXT时表示本报文是扩展帧,使用ExtId成员存储报文ID。

(4)    RTR

本成员存储的是报文类型标志RTR位,当它的值为宏CAN_RTR_Data时表示本报文是数据帧;当它的值为宏CAN_RTR_Remote时表示本报文是遥控帧,由于遥控帧没有数据段,所以当报文是遥控帧时,下面的Data[8]成员的内容是无效的。

(5)    DLC

本成员存储的是数据帧数据段的长度,它的值的范围是0-8,当报文是遥控帧时DLC值为0。

(6)    Data[8]

本成员存储的就是数据帧中数据段的数据。

(7)    FMI

本成员只存在于接收结构体,它存储了筛选器的编号,表示本报文是经过哪个筛选器存储进接收FIFO的,可以用它简化软件处理

 

CAN过滤器配置结构体:

typedef struct {
 uint16_t CAN_FilterIdHigh; /*CAN_FxR1寄存器的高16位 */
 uint16_t CAN_FilterIdLow; /*CAN_FxR1寄存器的低16位*/
 uint16_t CAN_FilterMaskIdHigh; /*CAN_FxR2寄存器的高16位*/
 uint16_t CAN_FilterMaskIdLow; /*CAN_FxR2寄存器的低16位 */
 uint16_t CAN_FilterFIFOAssignment; /*设置经过筛选后数据存储到哪个接收FIFO */
 uint8_t CAN_FilterNumber; /*筛选器编号,范围0-27*/
 uint8_t CAN_FilterMode; /*筛选器模式 */
 uint8_t CAN_FilterScale; /*设置筛选器的尺度 */
 FunctionalState CAN_FilterActivation; /*是否使能本筛选器*/
 } CAN_FilterInitTypeDef;

(1)    CAN_FilterIdHigh

CAN_FilterIdHigh成员用于存储要筛选的ID,若筛选器工作在32位模式,它存储的是所筛选ID的高16位;若筛选器工作在16位模式,它存储的就是一个完整的要筛选的ID。

(2)    CAN_FilterIdLow

类似地,CAN_FilterIdLow成员也是用于存储要筛选的ID,若筛选器工作在32位模式,它存储的是所筛选ID的低16位;若筛选器工作在16位模式,它存储的就是一个完整的要筛选的ID。

(3)    CAN_FilterMaskIdHigh

CAN_FilterMaskIdHigh存储的内容分两种情况,当筛选器工作在标识符列表模式时,它的功能与CAN_FilterIdHigh相同,都是存储要筛选的ID;而当筛选器工作在掩码模式时,它存储的是CAN_FilterIdHigh成员对应的掩码,与CAN_FilterIdLow组成一组筛选器。

(4)    CAN_FilterMaskIdLow

类似地,CAN_FilterMaskIdLow存储的内容也分两种情况,当筛选器工作在标识符列表模式时,它的功能与CAN_FilterIdLow相同,都是存储要筛选的ID;而当筛选器工作在掩码模式时,它存储的是CAN_FilterIdLow成员对应的掩码,与CAN_FilterIdLow组成一组筛选器。

上面四个结构体的存储的内容很容易让人糊涂,请结合前面的图 4014和下面的表 407理解,如果还搞不清楚,再结合库函数CAN_FilterInit的源码来分析。

对这些结构体成员赋值的时候,还要注意寄存器位的映射,即注意哪部分代表STID,哪部分代表EXID以及IDE、RTR位。

(5)    CAN_FilterFIFOAssignment

本成员用于设置当报文通过筛选器的匹配后,该报文会被存储到哪一个接收FIFO,它的可选值为FIFO0或FIFO1(宏CAN_Filter_FIFO0/1)。

(6)    CAN_FilterNumber

本成员用于设置筛选器的编号,即本过滤器结构体配置的是哪一组筛选器,CAN一共有28个筛选器,所以它的可输入参数范围为0-27。

(7)    CAN_FilterMode

本成员用于设置筛选器的工作模式,可以设置为列表模式(宏CAN_FilterMode_IdList)及掩码模式(宏CAN_FilterMode_IdMask)。

(8)    CAN_FilterScale

本成员用于设置筛选器的尺度,可以设置为32位长(宏CAN_FilterScale_32bit)及16位长(宏CAN_FilterScale_16bit)。

(9)    CAN_FilterActivation

本成员用于设置是否激活这个筛选器(宏ENABLE/DISABLE)。

 

注:至于过滤器的配置请参考本博客过滤器相关配置文章

 

标签:存储,例程,成员,ID,--,参数,设置,筛选,报文
From: https://www.cnblogs.com/wchmcu/p/17515210.html

相关文章

  • JavaScript 事件的传播
    <!DOCTYPEhtml><html> <head> <metacharset="UTF-8"> <title></title> <styletype="text/css"> #box1{ width:300px; height:300px; background-color:yellowgreen; } ......
  • 【JAVA基础】JSON转换
    JSON转换json字符串与dto转换publicJsonDataJtMdmResultDataDTOreceiveinfoMQ(StringreqContent){JtMdmMaterialReqDTOjtMdmMaterialReqDTO=newJtMdmMaterialReqDTO();List<JsonDataJtMdmResultDataInfosDTO>jsonDataJtMdmResultDataInfoDTOList......
  • ASL芯片CS5466方案设计|集睿致远CS5466代理商|Type-c转HDMI电路原理
    CS5466作为ASL集睿致远新推出的高性能Type-CtoHDMI2.1协议转换器,可以通过HDMI输出端口作为TMDS或FRL发射机进行操作。CS5466适配于多个配件市场和现实应用主板,例如:主板,显示端口,扩展坞等。CS5266还配备了最高级别的HDCP嵌入式秘钥,能够安全传输受保护的内容,作为集睿致远ASL的一......
  • LCP 与 height
    前言阅读此篇前,可先阅读后缀数组LCPLCP就是最长公共前缀,在后缀数组中,\(LCP(i,j)\)就代表从\(sa_i\)开始的后缀和从\(sa_j\)开始的后缀的最长公共前缀。height的定义\(height[i]=LCP(sa[i],sa[i-1])\),即从\(i\)开始的后缀与它前一个的后缀的最长公共前缀。一些性质......
  • MIT6.5840 lab2,3 记录
    参考链接课程地址如何Debug:没有它可怎么活,几万行的日志怎么看Students'GuidetoRaftraft算法可视化:直观展示raft可视化简单入门raft讲解视频:强烈推荐感想感觉理论+实践来学一个东西才学的深刻,特别是对于我这样对抽象理解不太行的,每次见识了一个算法或系统真正如何运行......
  • 非静态内部类newInstance
    https://stackoverflow.com/questions/25634542/newinstance-with-inner-classes Non-staticinnerclassesneedaninstanceoftheouterclasstoworkproperly.So,theydon't"really"haveadefaultconstructor,theyalwayshaveakindofhidd......
  • 帧数指的是每秒播放的图像帧数,单位为fps(Frames Per Second)。视频由一系列静止的图像帧
    视频的帧数指的是每秒播放的图像帧数,单位为fps(FramesPerSecond)。视频由一系列静止的图像帧组成,通过快速连续地播放这些图像帧,就能够呈现出连续的动态影像。帧数的概念源自电影行业。在电影制作中,通过连续播放一系列静态图像(称为帧),来创造出连贯的动画效果。每秒钟播放的帧数越多......
  • P2895(未解决)
    这是一道略复杂的常规BFS题,但我想用DFS来解决,结果写出代码却总是主函数异常返回,不知哪里错了,检查半天也没发现,以后再看看吧。Code#include<iostream>#include<cstdio>#include<string>#include<vector>#include<algorithm>#include<cstdlib>#include<cmath>usingnamesp......
  • 15-7 任务计划管理
    一、修改httpd服务配置文件  信号发送[root@centos8~]#vim/etc/httpd/conf/httpd.conf[root@centos8~]#systemctlstarthttpd重启服务[root@centos8~]#ss-ntl监听端口[root@centos8~]#kill-1进程号(重新读取配置文件)二、脚本重启不正常服务[root@centos8~]......
  • OutOfMemoryError: Java heap space/GC overhead limit exceeded 内存溢出问题排查
    一、背景我开发的给产线使用的工具时不时就无法登录,查看日志基本上都是内存溢出,查看实际内存基本上都占满了JVM设置的内存大小导致的现象就是SpringBoot项目无法登录,导致系统不可用。下面是我的java启动设置。javaw-Xmx6G-XX:+HeapDumpOnOutOfMemoryError-XX:HeapDumpPat......