class CAN – 控制器局域网通信总线¶
此模块旨在为OpenMV CAM RT1062提供CAN支持,并将在MicroPython提供标准机器CAN模块后删除。此模块是STM32的PYB.CAN模块的副本。
CAN实现了对经典CAN控制器的支持。在物理层面上,CAN总线由2根线组成:RX和TX。请注意,要将板连接到CAN总线,必须使用CAN变换器将板上的CAN逻辑信号转换为总线上的正确电压水平。
经典 CAN 控制器在回环(无需收发器)模式下的示例用法:
from machine import CAN
can = CAN(0, CAN.LOOPBACK)
can.setfilter(0, CAN.DUAL, 0, (123, 124)) # set a filter to receive messages with id=123 and 124
can.send('message!', 123) # send a message with id 123
can.recv(0) # receive message on FIFO 0
以下CAN模块函数及其参数可用于经典CAN控制器,除非另有说明。
构造函数¶
- class machine.CAN(bus, ...)¶
在给定的总线上构造一个CAN对象。*bus*可以是0。如果没有额外的参数,则创建CAN对象但不进行初始化(如果有的话,它具有总线上次初始化的设置)。如果给出额外的参数,则初始化总线。有关初始化的参数,请参阅
CAN.init()
。CAN总线的物理引脚如下:
CAN(0)
:(RX, TX) = (P3, P1)
方法¶
- CAN.init(mode, *, auto_restart=False, baudrate=0)¶
使用给定参数初始化CAN总线:
- CAN.deinit()¶
关闭CAN总线。
- CAN.restart()¶
强制软件重新启动CAN控制器,而不是重置其配置。
如果控制器进入总线关闭状态,则它将不再参与总线活动。如果控制器未配置为自动重新启动(请参阅
init()
),则可以使用此方法触发重新启动,并且控制器将遵循 CAN 协议以离开总线关闭状态并进入错误激活状态。
- CAN.state()¶
返回控制器的状态。返回值可以是以下之一:
CAN.STOPPED
– 控制器完全关闭并重置;CAN.ERROR_ACTIVE
– 控制器开启且处于错误激活状态(TEC和REC都小于96);CAN.ERROR_WARNING
– 控制器开启且处于错误警告状态(TEC或REC至少为96);CAN.ERROR_PASSIVE
– 控制器开启且处于错误被动状态(TEC或REC至少为128);CAN.BUS_OFF
– 控制器开启但不参与总线活动(TEC溢出超过255)。
- CAN.info([list])¶
获取有关控制器的错误状态以及 TX 和 RX 缓冲区的信息。如果提供了 list,则应该是一个至少有 8 个条目的列表对象,将用信息填充其中。否则将创建一个新列表并填充其中。在两种情况下,方法的返回值是填充的列表。
列表中的值为:
TEC值
REC值
控制器进入错误警告状态的次数(在达到65535后环绕为0)
控制器进入错误被动状态的次数(在达到65535后环绕为0)
控制器进入总线关闭状态的次数(在达到65535后环绕为0)
待处理的TX消息数
FIFO 0 上待处理的 RX 消息数
总是0
- CAN.setfilter(bank, mode, fifo, params, *, rtr, extframe=False)¶
配置一个过滤器组:
*bank*是经典的CAN控制器滤波器组配置。
mode 是过滤器应该操作的模式,请参阅下表。
*fifo*表示如果消息被此过滤器接受,该消息应该存储在哪个fifo(0)中。
params 是定义过滤器的值数组。数组的内容取决于 mode 参数。
mode
经典 CAN 控制器所使用的 params 数组内容
CAN.LIST32
将被接受的两个32位ID
CAN.DUAL
将被接受的两个 ID。例如 (1, 2)
rtr 对于经典CAN控制器,这是一个布尔值数组,指定过滤器是否应接受远程传输请求消息。如果未给出此参数,则对于所有条目,默认为
False
。数组的长度取决于*mode*参数。
mode
rtr 数组的长度
CAN.LIST32
2
CAN.DUAL
2
extframe 如果为 True,则帧将具有扩展标识符(29 位),否则将使用标准标识符(11 位)。
- CAN.any(fifo)¶
如果 FIFO 上有任何消息等待,则返回
True
,否则返回False
。
- CAN.recv(fifo, list=None, *, timeout=5000)¶
在总线上接收数据:
*fifo*是一个整数,表示要接收的FIFO - 总是0
list 是一个可选的列表对象,用作返回值
timeout 是等待接收的超时时间(以毫秒为单位)。
返回值:包含五个值的元组。
消息的 ID。
一个布尔值,指示消息 ID 是否为标准或扩展。
一个布尔值,指示消息是否为 RTR 消息。
FMI(过滤器匹配索引)值。
包含数据的数组。
如果 list 是
None
,则将分配一个新的元组,以及一个新的字节对象来包含数据(作为元组的第五个元素)。如果 list 不是
None
,则它应该是一个列表对象,至少有五个元素。第五个元素应该是从 bytearray 或类型为 ‘B’ 或 ‘b’ 的数组创建的 memoryview 对象,此数组必须至少有 8 个字节的空间。然后列表对象将用上述前四个返回值填充,并且 memoryview 对象将被就地调整为数据的大小,并用该数据填充。可以在后续调用此方法时重用相同的列表和 memoryview 对象,从而提供了一种在不使用堆内存的情况下接收数据的方式。例如:buf = bytearray(8) lst = [0, 0, 0, 0, memoryview(buf)] # No heap memory is allocated in the following call can.recv(0, lst)
- CAN.send(data, id, *, timeout=0, rtr=False, extframe=False)¶
在总线上发送消息:
*data*是要发送的数据(要发送的整数或缓冲区对象)。
id 是要发送的消息的 ID。
timeout 是等待发送的超时时间(以毫秒为单位)。
rtr 是一个布尔值,指定消息是否应作为远程传输请求发送。如果 rtr 为 True,则只使用 data 的长度填充帧的 DLC 槽;data 中的实际字节不使用。
extframe 如果为 True,则帧将具有扩展标识符(29 位),否则将使用标准标识符(11 位)。
- 如果超时为0,则消息将放入缓冲区,并立即返回方法。
如果三个缓冲区都在使用中,则会抛出异常。如果超时不为0,该方法将等待消息发送。如果消息无法在指定时间内发送,则会抛出异常。
返回值:
None
。
- CAN.rxcallback(fifo, fun)¶
注册一个函数,在将消息接受到空的 fifo 时调用:
*fifo*是接收fifo - 总是0。
fun 是 fifo 变为非空时要调用的函数。
回调函数接受两个参数,第一个是 CAN 对象本身,第二个是表示回调原因的整数。
原因
0
消息已被接受到空的FIFO中。
1
FIFO已满
2
由于FIFO已满,消息已丢失
rxcallback的示例用法:
def cb0(bus, reason): print('cb0') if reason == 0: print('pending') if reason == 1: print('full') if reason == 2: print('overflow') can = CAN(0, CAN.LOOPBACK) can.rxcallback(0, cb0)