笔者来聊聊can的认识以及can接收数据的驱动编写
1、STM32 Can 外设的认识
Can的特性就不多说了,主要来聊聊can的一些标识符以及收发状态。can有一套收发机制,发送和接收都有硬件缓存,叫邮箱,通过下面的图可以看出,下面这张图很经典,被各大网站和博客上面引用。
发送时,有三个报文邮箱缓存,接收时有两个fifo缓存,每个fifo有三个邮箱。
从上面图还可以看出,can数据接收到fifo,是经过滤波器过滤才可以到fifo,总共有27个过滤器(互联型,其他只有13个)每个标识符经过一个滤波器后就可以到接收fifo。
1.1、发送过程
3个发送报文缓存邮箱,发送时如果有之前的报文没发送出去,会缓存在邮箱里面,等待发送。
之所以用邮箱,是因为邮箱不仅可以有优先级发送,也可以顺序发送(fifo)
发送时的几个状态:
- 空状态(TME=1):邮箱空闲状态,此时肯定能请求成功,假如此时3个邮箱都不空闲,可能请求失败
- 挂起状态(TME=0 RQCP=0 TXOK=0):TXRQ=1,请求发送数据,此时等待邮箱成为最高优先级然后发送数据(can标识符低的优先发送),因为可能存在多个邮箱数据等待发送;此时也有情况发生邮箱已满,此时就只能等待,后面发