STM32F1学习——CAN外设(上)
一、STM32中的CAN外设
STM32内置bxCAN外设(basic extended CAN),支持CAN2.0A和2.0B,可以自动发送CAN报文和按照过滤器自动接收指定CAN报文,程序只需处理报文数据而无需关注总线的电平细节。
CAN波特率最高可达1M bits / s 。
3个可配置优先级的发送邮箱。
2个3级深度的接收FIFO(first in first out)。
14个过滤器组(互联型28个)。
时间触发通信、自动离线恢复、自动唤醒、禁止自动重传、接收FIFO溢出处理方式可配置、发送优先级可配置、双CAN模式。
二、STM32中的CAN框图
这是双CAN模式的框图,在平时我们仅使用上半部分CAN1。
简单来说我们需要通过左边的控制/状态/配置来控制CAN的发送和接收模式,CAN总线发送只需往3个发送邮箱里面写数据即可,他们可以配置为先到先发或按照ID号小的来发。接收数据通过接受滤波器后才能选择进入两个FIFO中。
三、发送过程
发送邮箱默认的状态是左上角的空置状态,其中RQCP(Request Completed)表示请求完成;TXOK(Transmission OK)表示发送成功;TME(Transmit Mailbox Empty)发送邮箱空;
从默认状态接收到TXRQ(Transmit Request)发送请求,将会进入挂号状态,如果此时该邮箱相比其他邮箱是最高优先级将进入预定状态,在预定状态如果此时又来了一个更高优先级的邮件,且发送的模式是根据ID号优先级来的,则会退回挂号模式。他两状态在接收到ABRQ(Abort Request)中止请求的时候都会到中间的空置状态(发送失败状态)。
若一切正常,预定状态会在CAN总线 空闲的时候(IDLE) 进入发送状态,如果发送成功将进入左下角的空置状态。如果发送失败,NART若配置1则表示不用自动重传,则进入发送失败状态。否则回到预定状态进行重传。
四、接收过程
接收FIFO默认的状态是左上角的空状态,其中FMP(FIFO Message Pending)表示FIFO中挂起的消息数,FOVR(FIFO Overrun)表示FIFO溢出。
当接收到有效报文的时候进入挂号_1状态,若继续接到报文则继续转直到挂号_3,同时这里还会产生一个FULL = 1的标志位图上未画出,如果仍然接到有效报文则进入溢出状态。每当CPU拿走了FIFO中的数据,RFOM(Release FIFO Output Mailbox)表示释放FIFO输出邮箱 = 1,则向上倒退。
五、发送和接收配置位
NART:置1,关闭自动重传,CAN报文只被发送1次,不管发送的结果如何(成功、出错或仲裁丢失);置0,自动重传,CAN硬件在发送报文失败时会一直自动重传直到发送成功。
TXFP:置1,优先级由发送请求的顺序来决定,先请求的先发送;置0,优先级由报文标识符来决定,标识符最小的先发送(标识符值相等时,邮箱号小的报文先发送)。
RFLM:置1,接收FIFO锁定,FIFO溢出时,新收到的报文会被丢弃;置0,禁用FIFO锁定,FIFO溢出时,FIFO中最后收到的报文被新报文覆盖。
参考
[2-1] STM32 CAN外设(上)_哔哩哔哩_bilibili