CANUnit

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

CAN Unit

MiniCAN Unit

UiFlow2 示例

发送示例

在UiFlow2中打开 stickc_plus2_can_tx_example.m5f2 项目。

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

按下BtnA可切换待发送的数据。

UiFlow2 代码块:

tx_example.png

示例输出:

None

接收示例

在UiFlow2中打开 dial_can_rx_example.m5f2 项目。

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

UiFlow2 代码块:

rx_example.png

示例输出:

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

MicroPython 示例

发送示例

该示例演示如何使用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

接收示例

该示例演示如何使用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输入时钟分频以生成名义位时间量化值的分频数,经典CAN取值范围为1至1024。

  • sjw (int) – 名义位时间量化单位中的重同步跳转宽度,经典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