外设基本结构

发送部分

  • 设备在等待总线空闲时,报文在邮箱滞留,下一个报文到来时,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 进入睡眠模式

Logo

智能硬件社区聚焦AI智能硬件技术生态,汇聚嵌入式AI、物联网硬件开发者,打造交流分享平台,同步全国赛事资讯、开展 OPC 核心人才招募,助力技术落地与开发者成长。

更多推荐