打印
[N32G45x]

N32的CAN发送/接收结构体及过滤器结构体成员介绍

[复制链接]
771|2
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
心向朝阳|  楼主 | 2022-10-31 16:37 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
在N32的CAN模块封装库中,除了有对CAN初始化结构体的封装,还有发送/接收结构体和过滤器结构体,之前小编有列举过CAN初始化结构体的解释,接下来小编来补充一下另外两个结构体成员的含义

使用特权

评论回复
沙发
心向朝阳|  楼主 | 2022-10-31 16:38 | 只看该作者
在发送或接收报文时,需要往发送邮箱中写入报文信息或从接收FIFO 中读取报文信息,利用N32标准库的发送及接收结构体可以方便地完成这样的工作,它们的定义见代码清单:
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]; /*存储报文数据段的内容 */  
} CanTxMessage;  
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]; /*存储了报文数据段的内容 */  
uint8_t FMI; /*存储了 本报文是由经过筛选器存储进FIFO 的,0-0xFF */  

} CanRxMessage;
发送结构体与接收结构体是类似的,只是接收结构体多了一个FMI 成员,说明如下:

使用特权

评论回复
板凳
心向朝阳|  楼主 | 2022-10-31 16:39 | 只看该作者
(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 发送报文时,先定义一个上面发送类型的结构体,然后把报文的内容按成员赋值到该结构体中,最后调用库函数CAN_TransmitMessage 把这些内容写入到发送邮箱即可把报文发送出去。
接收报文时,通过检测标志位获知接收FIFO 的状态,若收到报文,可调用库函数CAN_ReceiveMessage 把接收FIFO 中的内容读取到预先定义的接收类型结构体中,然后再访问该结构体即可利用报文了

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

9

主题

60

帖子

2

粉丝