canio – CAN 总线访问

canio模块包含支持 CAN 总线协议的低级类。

CAN 和 Listener 类更改硬件状态,如果程序在使用后继续,则在不再需要它们时应取消初始化。为此,请调用deinit() 或使用上下文管理器。有关更多信息,请参阅 Lifetime 和 ContextManagers

例如:

import canio
from board import *

can = canio.CAN(board.CAN_RX, board.CAN_TX, baudrate=1000000)
message = canio.Message(id=0x0408, data=b"adafruit")
can.send(message)
can.deinit()

此示例将数据“adafruit”写入到 CAN 总线上的任何侦听消息 ID 0x0408 的设备。

CAN 总线涉及一个收发器,它通常是一个带有“待机”引脚的独立芯片。如果您的电路板有 CAN_STANDBY 引脚,请确保将其设置为值为 False 的输出以启用收发器。

可能存在 CAN 设备的其他实现(例如,通过 SPI 总线连接)。如果是这样,它们的构造函数参数可能会有所不同,但除此之外,我们鼓励实现者遵循核心使用的 API。

在这些板上可用
  • ATMegaZero ESP32-S2
  • Adafruit Feather M4 CAN
  • Adafruit Feather STM32F405 Express
  • Adafruit FunHouse
  • Adafruit MagTag
  • Adafruit Metro ESP32S2
  • Artisense Reference Design RD00
  • BastWiFi
  • CrumpS2
  • ESP 12k NodeMCU
  • Feather ESP32S2 without PSRAM
  • FeatherS2
  • FeatherS2 Neo
  • FeatherS2 PreRelease
  • Franzininho WIFI w/Wroom
  • Franzininho WIFI w/Wrover
  • Gravitech Cucumber M
  • Gravitech Cucumber MS
  • Gravitech Cucumber R
  • Gravitech Cucumber RS
  • HMI-DevKit-1.1
  • Kaluga 1
  • LILYGO TTGO T8 ESP32-S2 w/Display
  • MORPHEANS MorphESP-240
  • Oak Dev Tech PixelWing ESP32S2
  • PyboardV1_1
  • S2Mini
  • SAM E54 Xplained Pro
  • STM32F4_DISCO
  • Saola 1 w/Wroom
  • Saola 1 w/Wrover
  • SparkFun STM32 MicroMod Processor
  • Targett Module Clip w/Wroom
  • Targett Module Clip w/Wrover
  • TinyS2
  • microS2
  • nanoESP32-S2 w/Wrover
  • nanoESP32-S2 w/Wroom

class canio.BusState

CAN总线状态

ERROR_ACTIVE :object

总线处于正常(活动)状态

ERROR_WARNING :object

总线处于正常(活动)状态,但最近发生了中等数量的错误。

笔记

并非所有实现都可以使用ERROR_WARNING. 不要依赖看到ERROR_WARNING 之前ERROR_PASSIVE.

ERROR_PASSIVE :object

由于最近发生的错误数量,总线处于被动状态。

该设备将确认它收到的数据包,但不能传输消息。如果出现其他错误,该设备可能会进入 BUS_OFF。如果它成功确认总线上的其他数据包,它可以返回到 ERROR_WARNING 或 ERROR_ACTIVE 并传输数据包。

BUS_OFF :object

由于最近发生的错误数量,总线已关闭。它必须重新启动才能发送或接收数据包。该设备不会在总线上发送或确认数据包。

class canio.CAN(tx: microcontroller.Pin, rx: microcontroller.Pin, *, baudrate: int = 250000, loopback: bool = False, silent: bool = False, auto_restart: bool = False)

CAN总线协议

通用共享总线协议。rx 和 tx 引脚通常连接到一个收发器,该收发器控制共享总线上的 H 和 L 引脚。

参数
  • rx (Pin) – 要接收的引脚

  • tx (Pin) – 传输的引脚

  • baudrate (int) – 以赫兹为单位的总线比特率。总线上的所有设备都必须同意此值。

  • loopback (bool) – 当为 True 时,rx pin 的值被忽略,设备接收它发送的数据包。

  • silent (bool) – 当为 True 时,tx 引脚总是被驱动到高逻辑电平。此模式可用于“嗅探”CAN 总线而不会产生干扰。

  • auto_restart (bool) –如果为 True,将在进入总线关闭状态后重新启动通信

auto_restart :bool

如果为 True,将在进入总线关闭状态后重新开始通信

baudrate :int

波特率(只读)

transmit_error_count :int

传输错误的数量(只读)。检测到传输错误时增加,成功传输时减少。限制在 0 到 255 的范围内。也称为 TEC。

receive_error_count :int

接收错误的数量(只读)。检测到接收错误时增加,成功接收时减少。限制在 0 到 255 的范围内。也称为 REC。

state :BusState

总线的当前状态。(只读)

loopback :bool

如果设备是在环回模式下创建的,则为 True,否则为 False(只读)

silent :bool

如果设备是在静默模式下创建的,则为 True,否则为 False(只读)

restart(self)None

如果设备处于总线关闭状态,请重新启动它。

listen(self, matches: Optional[Sequence[Match]] = None, *, timeout: float = 10)Listener

开始接收与任一过滤器匹配的消息。

创建侦听器是一项代价高昂的操作,并且会干扰其他侦听器对消息的接收。

存在实现定义的最大侦听器数量和过滤器复杂性的限制。

如果硬件不能支持所有请求的匹配项,则会引发 ValueError。请注意,通常在所有 fifo 之间共享一定数量的硬件过滤器。

一条消息最多可以被一个 Listener 接收。如果有多个侦听器匹配一条消息,则不确定哪个侦听器实际接收到它。

空过滤器列表会导致接受所有消息。

超时决定了 receive() 和 next() 将阻塞多长时间。

平台特定说明:

SAM E5x 支持两个监听器。过滤器块在两个侦听器之间共享。有4个标准过滤器块和4个扩展过滤器块。每个块可以匹配 2 个单个地址或地址掩码。通过重建 CircuitPython,可以将过滤器块的数量增加到硬件最大值,但这会减少 CircuitPython 可用内存,即使不使用 canio。

STM32F405 支持两个监听器。过滤器块在两个侦听器之间共享。有 14 个过滤块。每个块可以匹配 2 个带掩码的标准地址或 1 个带掩码的扩展地址。

ESP32S2 支持 1 个 Listener。有一个过滤器块,它可以匹配带掩码的标准地址或带掩码的扩展地址。

send(self, message: Union[RemoteTransmissionRequest, Message])None

使用给定的数据和 ID 在总线上发送消息。如果由于完整的 fifo 或总线错误条件而无法发送消息,则会引发 RuntimeError。

deinit(self)None

取消初始化这个对象,释放它的硬件资源

__enter__(self)CAN

返回self,允许对象在资源控制语句中使用 The with statement

__exit__(self, unused1: Optional[Type[BaseException]], unused2: Optional[BaseException], unused3: Optional[types.TracebackType])None

调用 deinit()

class canio.Listener

侦听 CAN 消息

canio.Listener不是直接构造的,而是通过调用 canio.CAN.listen.

除了使用该receive 方法检索消息或in_waiting 检查可用消息的方法之外,侦听器还可以用作可迭代的,产生消息,直到self.timeout 几秒钟内没有消息到达。

timeout :float
receive(self)Optional[Union[RemoteTransmissionRequest, Message]]

等待self.timeout 数秒后阅读消息

如果没有及时收到消息,None 则返回。否则,返回一个 MessageRemoteTransmissionRequest

in_waiting(self)int

返回等待的消息数(包括远程传输请求)

__iter__(self)Listener

返回自身

此方法存在以便 Listener可以用作可迭代

__next__(self)Union[RemoteTransmissionRequest, Message]

在等待 self.timeout 秒后读取消息

如果没有及时收到消息,则引发 StopIteration。否则,返回 Message 或 。

此方法使Listener能够用作可迭代对象,例如在 for 循环中。

deinit(self)None

取消初始化这个对象,释放它的硬件资源

__enter__(self)CAN

返回self,允许对象在资源控制语句中使用The with statement

__exit__(self, unused1: Optional[Type[BaseException]], unused2: Optional[BaseException], unused3: Optional[types.TracebackType])None

调用 deinit()

class canio.Match(id: int, *, mask: Optional[int] = None, extended: bool = False)

描述要匹配的 CAN 总线消息

构造具有给定属性的 Match。

如果掩码不是无,则过滤器适用于匹配掩码中所有非零位的任何 id。否则,它与给定的 id 完全匹配。如果extended 为真,则只匹配扩展id,否则只匹配标准id。

id :int

要匹配的 id

mask :int

要匹配的可选 ID 掩码

extended :bool

True 匹配扩展 id,False 匹配标准 ide

class canio.Message(id: int, data: bytes, *, extended: bool = False)

构造要在 CAN 总线上发送的消息。

参数
  • id (int) – 消息的数字 ID

  • data (bytes) – 消息的内容

  • extended (bool) – 如果消息具有扩展标识符,则为 True,如果具有标准标识符,则为 False

在 CAN 中,消息的长度可以从 0 到 8 个字节。

id :int

消息的数字 ID

data :bytes

消息内容

extended :bool

如果消息的 id 是扩展 id,则为真

class canio.RemoteTransmissionRequest(id: int, length: int, *, extended: bool = False)

构造要在 CAN 总线上发送的 RemoteTransmissionRequest。

参数
  • id (int) – 请求消息的数字 ID

  • length (int) – 请求消息的长度

  • extended (bool) – 如果消息具有扩展标识符,则为 True,如果具有标准标识符,则为 False

在 CAN 中,消息的长度可以从 0 到 8 个字节。

id :int

消息的数字 ID

extended :bool

如果消息的 id 是扩展 id,则为真

length :int

请求消息的长度。