CAN总线学习(五):外设
外设基本结构

发送部分
-
设备在等待总线空闲时,报文在邮箱滞留,下一个报文到来时,CPU只能被迫等待邮箱空闲再存入报文
为了避免短暂的拥堵,造成CPU等待,STM32设计了三个发送邮箱
-
三个发送邮箱的两种发送策略
-
先请求先发送
-
ID优先级高的先发送
-
接收部分
-
接收过滤器:对报文的ID号进行过滤筛选
-
接收队列FIFO:不同筛选规则过滤的报文进入不同FIFO队列进行排队等待CPU读取
两个FIFO队列是对报文进行分流策略:重要队列放入FIFO1,不重要的放入FIFO0,当FIFO中队列溢出时,两种丢失策略
-
丢失新来的报文
-
新来的报文覆盖上一个报文,队伍末尾的报文丢失
-
收发流程
发送流程
基本流程:选择一个空置邮箱→写入报文 →请求发送

接收流程
基本流程:接收到一个报文→匹配过滤器后进入FIFO 0或FIFO 1→CPU读取

发送和接收配置位
-
NART:置1,关闭自动重传,CAN报文只被发送1次,不管发送的结果如何(成功、出错或仲裁丢失);置0,自动重传,CAN硬件在发送报文失败时会一直自动重传直到发送成功
-
TXFP:置1,优先级由发送请求的顺序来决定,先请求的先发送;置0,优先级由报文标识符来决定,标识符值小的先发送(标识符值相等时,邮箱号小的报文先发送)
-
RFLM:置1,接收FIFO锁定,FIFO溢出时,新收到的报文会被丢弃;置0,禁用FIFO锁定,FIFO溢出时,FIFO中最后收到的报文被新报文覆盖
标识符过滤器
-
每个过滤器的核心由两个32位寄存器组成:R1[31:0]和R2[31:0]
其中FSCx、FBMx控制R1、R0中位段作用
-
FSCx:位宽设置
置0,16位;置1,32位——含IDE过滤拓展格式
-
FBMx:模式设置
置0,屏蔽模式——R1用作掩码,筛选位
置1,列表模式——R0、R1均用作过滤ID
-
FFAx:关联设置
置0,FIFO 0;置1,FIFO
-
FACTx:激活设置
置0,禁用;置1,启用
-

过滤器配置示例
测试模式
-
静默模式:用于分析CAN总线的活动,不会对总线造成影响
-
环回模式:用于自测试,同时发送的报文可以在CAN_TX引脚上检测到
-
环回静默模式:用于热自测试,自测的同时不会影响CAN总线
工作模式
-
初始化模式:用于配置CAN外设,禁止报文的接收和发送
-
正常模式:配置CAN外设后进入正常模式,以便正常接收和发送报文
-
睡眠模式:低功耗,CAN外设时钟停止,可使用软件唤醒或者硬件自动唤醒
-
AWUM:置1,自动唤醒,一旦检测到CAN总线活动,硬件就自动清零SLEEP,唤醒CAN外设;置0,手动唤醒,软件清零SLEEP,唤醒CAN外设

CAN中断
CAN外设占用4个专用的中断向量
-
发送中断:发送邮箱空时产生
-
发送邮箱 0 变为空,CAN_TSR 寄存器的 RQCP0 位被置 '1'
-
发送邮箱 1 变为空,CAN_TSR 寄存器的 RQCP1 位被置 '1'
-
发送邮箱 2 变为空,CAN_TSR 寄存器的 RQCP2 位被置 '1'
-
-
FIFO 0中断:收到一个报文/FIFO 0满/FIFO 0溢出时产生
-
FIFO0 接收到一个新报文,CAN_RF0R 寄存器的 FMP0 位不再是 '00'
-
FIFO0 变为满,CAN_RF0R 寄存器的 FULL0 位被置 '1'
-
FIFO0 发生溢出,CAN_RF0R 寄存器的 FOVR0 位被置 '1'
-
-
FIFO 1中断:收到一个报文/FIFO 1满/FIFO 1溢出时产生
-
状态改变错误中断:出错/唤醒/进入睡眠时产生
-
出错情况(详细信息请参考 CAN 错误状态寄存器 CAN_ESR)
-
唤醒情况(在 CAN 接收引脚上监视到帧起始位 SOF)
-
CAN 进入睡眠模式
-

更多推荐


所有评论(0)