bxCAN是STM32的CAN接口,全称为基本扩展CAN (Basic Extended CAN),它支持CAN协议2.0A(只支持标准帧格式)和2.0B(还支持拓展帧格式)。bxCAN的设计目标是,以最小的CPU负荷来高效处理大量收到的报文。它也支持报文发送的优先级要求 (优先级特性可软件配置)。对于安全紧要的应用,bxCAN提供所有支持时间触发通信模式所需的硬件功能。
bxCAN有3个主要的工作模式:初始化模式、正常模式和睡眠模式。此外,bxCAN还有3种测试模式:静默模式、环回模式和环回静默模式。
bxCAN的接收处理是通过FIFO来实现的,接收到的报文被存储在3级邮箱深度的FIFO中。FIFO完全由硬件来管理,从而节省了CPU的处理负荷,简化了软件并保证了数据的一致性。
此外,bxCAN还提供了28个位宽可变的、可配置的过滤器组,以便只接收那些软件需要的报文。硬件过滤的做法节省了CPU开销,否则就必须由软件过滤从而占用一定的CPU开销。
总的来说,bxCAN是一个功能强大的CAN接口,它能够有效地处理大量的报文,同时还提供了多种工作模式和测试模式,以满足不同的应用需求。
初始化模式:当硬件处于初始化模式时,可以进行软件初始化。进入初始化模式的方法是软件将CAN_MCR寄存器的INRQ位置1,并等待硬件通过将CAN_MCR寄存器的INAK位置1来确认请求。退出初始化模式的方法是软件将INQR位清零。一旦硬件将INAK位清零,bxCAN即退出初始化模式。
正常模式:当NAK = 0 和 SLAK = 0时,bxCAN将处于正常模式。进入正常模式之前,bxCAN必须始终在CAN总线上实现同步。为了进行同步,bxCAN将等待CAN总线空闲(即,已监测到CANRX上的11个隐性位)。初始化完成后,软件必须向硬件请求进入正常模式,这样才能在CAN总线上进行同步,并开始接收和发送。
睡眠模式:bxCAN进入睡眠模式以降低功耗,同时CANTX上的内部上拉电阻激活。软件将CAN_MCR寄存器的INRQ或SLEEP位置1,以请求bxCAN进入初始化或睡眠模式。
测试模式:
静默模式(监测总线流量):bxCAN可以接收有效数据帧和有效遥控帧,但仅在CAN总线上发送隐性位,并且无法启动发送。如果bxCAN必须发送一个显性位(ACK位、溢出标志、活动错误标志),该位将在内部被改道发送,以便CAN内核可以监视该显性位,但CAN总线可以保持隐性状态。
环回模式(自检):在环回模式下,bxCAN可以发送和接收。发送的帧不会被发送到CAN总线上,而是直接从发送邮箱路由到接收FIFO。这种模式允许在不影响实际网络的情况下测试发送过程。
环回静默模式(自检且不影响总线):这是静默模式和环回模式的组合。在这种模式下,bxCAN处于静默状态,但是发送的帧会被路由到接收FIFO。
关于bxCAN的接收处理和过滤机制:
FIFO(先进先出):bxCAN的接收处理是通过FIFO来实现的。这意味着,当报文(即CAN总线上的数据包)被接收时,它们会被存储在一个叫做FIFO的数据结构中。FIFO的特点是先进入的数据先出去,后进入的数据后出去。这就像一个管道,数据从一端进入,从另一端出去。
3级邮箱深度的FIFO:这里的“3级邮箱深度”指的是FIFO可以存储3个报文。当新的报文被接收时,如果FIFO已满(即已经存储了3个报文),那么最早接收的报文将被新的报文替换。
硬件管理的FIFO:FIFO的管理(即数据的存储和读取)完全由硬件来完成,而不需要CPU的参与。这样可以减轻CPU的负担,简化软件的设计,并且保证数据的一致性(即防止在数据读取和写入过程中发生错误)。
28个位宽可变的、可配置的过滤器组:bxCAN提供了28个过滤器,这些过滤器可以被配置来只接收特定的报文。每个过滤器的位宽(即可以识别的数据位数)是可变的,这意味着过滤器可以被设置来识别不同长度的报文。
硬件过滤:过滤器的工作是由硬件来完成的,而不需要CPU的参与。这样可以减轻CPU的负担,因为如果过滤工作由软件来完成,那么就需要CPU来处理大量的数据,这将占用CPU的资源。
bxCAN的发送处理过程主要包括以下步骤:
发送请求:当需要发送数据时,应用程序选择一个空闲的发送邮箱,并设置标识符、数据长度和待发送的数据。然后,通过将CAN_TIxR->TXRQ置1来请求发送。此时,邮箱不再是空闲的,软件对此邮箱不再具有写权限。
发送状态:当CAN总线变为空闲后,被安排好的邮箱中的消息即开始发送(进入发送状态)。
发送成功:一旦邮箱中的消息被成功发送,邮箱即恢复为空状态。硬件通过将发送状态寄存器(CAN_TSR—CAN transmit status register)中的邮箱 x (x=0,1,2) 请求完成标志位(RQCPx—Request completed mailbox x)和 邮箱 x (x=0,1,2) 发送成功标志位(TXOKx—Transmission OK of mailbox x)置 1,来表示发送成功。
发送失败:如果发送操作失败了,无论是由于仲裁丢失还是出错,硬件都不会再自动发送该报文。
禁止自动重传模式:通过CAN_MCR->NART置1,可以让硬件工作在禁止自动重传模式。在该模式下,发送操作只会执行一次。
发送优先级由邮箱中的报文标识符决定,标识符数值越低,优先级越高. 如果标识符相同,邮箱小的先被发送