CANUnit

CAN Unit 用于通过 CAN 总线进行通信。支持以下产品:

CAN Unit

MiniCAN Unit

UiFlow2 应用示例

TX 示例

在 UiFlow2 中打开 stickc_plus2_can_tx_example.m5f2 项目。

该示例演示如何使用 CAN Unit 发送数据。

点击 BtnA 以更改要发送的数据。

UiFlow2 代码块:

tx_example.png

示例输出:

None

RX 示例

在 UiFlow2 中打开 dial_can_rx_example.m5f2 项目。

该示例演示如何使用 CAN Unit 接收数据。

UiFlow2 代码块:

rx_example.png

示例输出:

屏幕将显示接收到的 CAN 数据。

MicroPython 应用示例

TX 示例

该示例演示如何使用 CAN Unit 发送数据。

MicroPython 代码块:

 1# SPDX-FileCopyrightText: 2024 M5Stack Technology CO LTD
 2#
 3# SPDX-License-Identifier: MIT
 4
 5import os, sys, io
 6import M5
 7from M5 import *
 8from unit import CANUnit
 9from hardware import *
10
11
12label0 = None
13label1 = None
14label2 = None
15label3 = None
16label4 = None
17label5 = None
18label6 = None
19label7 = None
20label8 = None
21can_0 = None
22
23
24import random
25
26id2 = None
27payload = None
28
29
30def setup():
31    global \
32        label0, \
33        label1, \
34        label2, \
35        label3, \
36        label4, \
37        label5, \
38        label6, \
39        label7, \
40        label8, \
41        can_0, \
42        id2, \
43        payload
44
45    M5.begin()
46    label0 = Widgets.Label("Master", 35, 4, 1.0, 0xFFFFFF, 0x222222, Widgets.FONTS.DejaVu18)
47    label1 = Widgets.Label("ID:", 4, 39, 1.0, 0xF5A41D, 0x080808, Widgets.FONTS.DejaVu18)
48    label2 = Widgets.Label("RTR:", 4, 90, 1.0, 0xF5A41D, 0x000000, Widgets.FONTS.DejaVu18)
49    label3 = Widgets.Label("Ext:", 4, 141, 1.0, 0xF5A41D, 0x000000, Widgets.FONTS.DejaVu18)
50    label4 = Widgets.Label("Msg:", 3, 192, 1.0, 0xF5A41D, 0x000000, Widgets.FONTS.DejaVu18)
51    label5 = Widgets.Label("label5", 3, 64, 1.0, 0xFFFFFF, 0x222222, Widgets.FONTS.DejaVu18)
52    label6 = Widgets.Label("label6", 4, 115, 1.0, 0xFFFFFF, 0x222222, Widgets.FONTS.DejaVu18)
53    label7 = Widgets.Label("label7", 4, 166, 1.0, 0xFFFFFF, 0x222222, Widgets.FONTS.DejaVu18)
54    label8 = Widgets.Label("label8", 4, 217, 1.0, 0xFFFFFF, 0x222222, Widgets.FONTS.DejaVu18)
55
56    can_0 = CANUnit((33, 32), CANUnit.NORMAL, baudrate=25000)
57    id2 = 123
58    payload = "uiflow2"
59    label5.setText(str(id2))
60    label6.setText(str(False))
61    label7.setText(str(False))
62    label0.setText(str(payload))
63
64
65def loop():
66    global \
67        label0, \
68        label1, \
69        label2, \
70        label3, \
71        label4, \
72        label5, \
73        label6, \
74        label7, \
75        label8, \
76        can_0, \
77        id2, \
78        payload
79    M5.update()
80    can_0.send(payload, id2, timeout=0, rtr=False, extframe=False)
81    if BtnA.wasClicked():
82        id2 = random.randint(1, 100)
83        label5.setText(str(id2))
84        payload = str((random.randint(32, 126)))
85        label8.setText(str(payload))
86
87
88if __name__ == "__main__":
89    try:
90        setup()
91        while True:
92            loop()
93    except (Exception, KeyboardInterrupt) as e:
94        try:
95            from utility import print_error_msg
96
97            print_error_msg(e)
98        except ImportError:
99            print("please update to latest firmware")

示例输出:

None

RX 示例

该示例演示如何使用 CAN Unit 接收数据。

MicroPython 代码块:

 1# SPDX-FileCopyrightText: 2024 M5Stack Technology CO LTD
 2#
 3# SPDX-License-Identifier: MIT
 4
 5import os, sys, io
 6import M5
 7from M5 import *
 8from unit import MiniCANUnit
 9
10
11label0 = None
12label1 = None
13label2 = None
14label3 = None
15label4 = None
16label5 = None
17label6 = None
18label7 = None
19label8 = None
20minican_0 = None
21
22
23frame = None
24
25
26def setup():
27    global label0, label1, label2, label3, label4, label5, label6, label7, label8, minican_0, frame
28
29    M5.begin()
30    label0 = Widgets.Label("Slaver", 90, 13, 1.0, 0xFFFFFF, 0x222222, Widgets.FONTS.DejaVu18)
31    label1 = Widgets.Label("ID:", 35, 60, 1.0, 0xFFFFFF, 0x222222, Widgets.FONTS.DejaVu18)
32    label2 = Widgets.Label("Ext:", 25, 150, 1.0, 0xFFFFFF, 0x222222, Widgets.FONTS.DejaVu18)
33    label3 = Widgets.Label("RTR:", 20, 120, 1.0, 0xFFFFFF, 0x222222, Widgets.FONTS.DejaVu18)
34    label4 = Widgets.Label("Msg:", 18, 90, 1.0, 0xFFFFFF, 0x222222, Widgets.FONTS.DejaVu18)
35    label5 = Widgets.Label("label5", 72, 60, 1.0, 0xFFFFFF, 0x222222, Widgets.FONTS.DejaVu18)
36    label6 = Widgets.Label("label6", 72, 89, 1.0, 0xFFFFFF, 0x222222, Widgets.FONTS.DejaVu18)
37    label7 = Widgets.Label("label7", 72, 120, 1.0, 0xFFFFFF, 0x222222, Widgets.FONTS.DejaVu18)
38    label8 = Widgets.Label("label8", 72, 150, 1.0, 0xFFFFFF, 0x222222, Widgets.FONTS.DejaVu18)
39
40    minican_0 = MiniCANUnit((1, 2), MiniCANUnit.NORMAL, baudrate=25000)
41
42
43def loop():
44    global label0, label1, label2, label3, label4, label5, label6, label7, label8, minican_0, frame
45    M5.update()
46    if minican_0.any(0):
47        frame = minican_0.recv(0, timeout=5000)
48        label5.setText(str(frame[0]))
49        label6.setText(str(frame[4]))
50        label7.setText(str(frame[2]))
51        label8.setText(str(frame[1]))
52
53
54if __name__ == "__main__":
55    try:
56        setup()
57        while True:
58            loop()
59    except (Exception, KeyboardInterrupt) as e:
60        try:
61            from utility import print_error_msg
62
63            print_error_msg(e)
64        except ImportError:
65            print("please update to latest firmware")

示例输出:

屏幕将显示接收到的 CAN 数据。

API参考

CANUnit

class unit.CANUnit(port, mode, baudrate=125000)

创建一个 CANUnit 对象。

参数:
  • id (int) – CAN ID。

  • port (tuple) – 端口引脚(tx、rx)。

  • mode (int) – CAN.NORMAL、CAN.NO_ACKNOWLEDGE、CAN.LISTEN_ONLY 之一。

  • baudrate (int) – CANUnit 的波特率。

UiFlow2 代码块:

init.png

MicroPython 代码块:

from unit import CANUnit

can = CANUnit(id=0, port=(13, 14), mode=CANUnit.NORMAL, baudrate=125000)

备注

CANUnit 类继承自 CAN 类。更多详情请参阅 hardware.CAN

class unit.CANUnit(tx, rx, mode, prescaler=32, sjw=3, bs1=15, bs2=4, triple_sampling=False)

使用给定参数初始化 CAN 总线。

参数:
  • id (int) – CAN ID。

  • port (tuple) – 端口引脚(tx、rx)。

  • mode (int) – CAN.NORMAL、CAN.NO_ACKNOWLEDGE、CAN.LISTEN_ONLY 之一。

  • prescaler (int) – CAN 输入时钟被分频以生成标称位时间量子(time quanta)的分频值。对于经典 CAN,预分频器的取值范围为 1 到 1024(含)。

  • sjw (int) – 用于标称位(nominal bits)的重同步跳宽(resynchronisation jump width),单位为时间量子(time quanta);对于经典 CAN,其取值范围为 1 到 4(含)之间。

  • bs1 (int) – 定义标称位中采样点的位置,单位为时间量子;对于经典 CAN,其取值范围为 1 到 16(含)。

  • bs2 (int) – 以标称位的时间量子为单位定义发送点的位置;对于经典 CAN,其取值范围为 1 到 8(含)。

  • triple_sampling (bool) – 启用三重采样,当 TWAI 控制器对一个位进行采样时。

UiFlow2 代码块:

init1.png

MicroPython 代码块:

from unit import CANUnit

can = CANUnit(id=0, port=(13, 14), mode=CANUnit.NORMAL, prescaler=128, sjw=3, bs1=16, bs2=8, triple_sampling=False)

备注

CANUnit 类继承自 CAN 类。更多详情请参阅 hardware.CAN