PwrCAN

PwrCAN Module 13.2是一款针对PwrCAN总线设计的多功能模块,集成了隔离CAN通信和直流9-24V电源总线。模块同时具备带隔离的Pwr485总线功能,并可为M5主机提供隔离5V电源。CAN通信部分采用CA-IS3050G隔离型收发器,RS485部分采用CA-IS3082W隔离型收发器。与CAN和RS485通信相关的GPIO可通过拨码开关选择,CAN与RS485输出端的120欧姆终端电阻也可通过拨码开关选择。模块的电源总线支持直流9-24V宽压输入,DC插座与HT3.96及XT30电源端直接相连。内置的隔离电源模块F0505S-2WR3为M5主机供电。本模块适用于机器人控制、协议转换、工业自动化、汽车通信系统、智能交通及楼宇自动化等领域。

支持的产品:

PwrCANModule

UiFlow2 示例

简易 CAN 与 RS485 通信

在UiFlow2中打开 pwrcan_cores3_example.m5f2 项目。

该示例演示如何使用 PwrCAN 模块。

触摸屏幕即可发送CAN报文和RS485数据,接收到的RS485数据会显示在标签上。

UiFlow2 代码块:

example.png

示例输出:

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

MicroPython 示例

简易 CAN 与 RS485 通信

该示例展示如何在 MicroPython 中使用 PwrCAN 模块。

触摸屏幕即可发送CAN报文和RS485数据,接收到的RS485数据会显示在标签上。

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 module import PwrCANModule
 9from module import PwrCANModuleRS485
10from unit import RS485Unit
11import time
12
13
14title0 = None
15label3 = None
16label0 = None
17label1 = None
18label2 = None
19pwrcan_0 = None
20pwrcan_1 = None
21rs485_0 = None
22
23
24def setup():
25    global title0, label3, label0, label1, label2, pwrcan_0, pwrcan_1, rs485_0
26
27    M5.begin()
28    Widgets.fillScreen(0x222222)
29    title0 = Widgets.Title(
30        "PwrCANModule CoreS3 Example", 3, 0xFFFFFF, 0x0000FF, Widgets.FONTS.DejaVu18
31    )
32    label3 = Widgets.Label("CAN Rec:", 0, 95, 1.0, 0xFFFFFF, 0x222222, Widgets.FONTS.DejaVu18)
33    label0 = Widgets.Label(
34        "CAN Message State: ", 0, 49, 1.0, 0xFFFFFF, 0x222222, Widgets.FONTS.DejaVu18
35    )
36    label1 = Widgets.Label(
37        "RS485 Message State: ", 0, 138, 1.0, 0xFFFFFF, 0x222222, Widgets.FONTS.DejaVu18
38    )
39    label2 = Widgets.Label("RS485 Rec:", 0, 179, 1.0, 0xFFFFFF, 0x222222, Widgets.FONTS.DejaVu18)
40
41    pwrcan_0 = PwrCANModule(0, 17, 18, PwrCANModule.NORMAL, baudrate=1000000)
42    pwrcan_1 = PwrCANModuleRS485(1, baudrate=115200, bits=8, parity=None, stop=1, tx=13, rx=7)
43    rs485_0 = RS485Unit(
44        2,
45        port=(1, 2),
46        baudrate=115200,
47        bits=8,
48        parity=None,
49        stop=1,
50        txbuf=256,
51        rxbuf=256,
52        timeout=0,
53        timeout_char=0,
54        invert=0,
55        flow=0,
56    )
57
58
59def loop():
60    global title0, label3, label0, label1, label2, pwrcan_0, pwrcan_1, rs485_0
61    M5.update()
62    if M5.Touch.getCount():
63        pwrcan_0.send("uiflow2", 0, timeout=0, rtr=False, extframe=False)
64        label0.setText(str("CAN Message State: Send"))
65        pwrcan_1.write("RS485_uiflow2" + "\r\n")
66        label1.setText(str("RS485 Message State: Send"))
67        time.sleep(1)
68    else:
69        label0.setText(str("CAN Message State: Not Send"))
70        label1.setText(str("RS485 Message State: Not Send"))
71    if pwrcan_0.any(0):
72        label3.setText(str((str("CAN Rec:") + str((pwrcan_0.recv(0, timeout=5000))))))
73    if rs485_0.any():
74        label2.setText(str((str("RS485 Rec:") + str((rs485_0.read())))))
75
76
77if __name__ == "__main__":
78    try:
79        setup()
80        while True:
81            loop()
82    except (Exception, KeyboardInterrupt) as e:
83        try:
84            from utility import print_error_msg
85
86            print_error_msg(e)
87        except ImportError:
88            print("please update to latest firmware")

示例输出:

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

API参考

PwrCANModule

class module.PwrCANModule(id, mode, tx, rx, prescaler=32, sjw=3, bs1=15, bs2=4, triple_sampling=False)

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

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

  • mode (int) – 取值为NORMAL、NO_ACKNOWLEDGE或LISTEN_ONLY之一。

  • tx (int) – 用于发送数据的引脚。

  • rx (int) – 用于接收数据的引脚。

  • 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 代码块:

init.png

MicroPython 代码块:

from module import PwrCANModule

can = PwrCANModule(0, PwrCANModule.NORMAL, 13, 14)

PwrCANModule类继承自CAN类,更多细节请参阅 hardware.CAN

PwrCANModuleRS485

class module.PwrCANModuleRS485(id, baudrate=9600, bits=8, parity=None, stop=1)

根据指定ID构造一个UART对象。

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

  • baudrate (int) – 时钟频率。

  • bits (int) – 每个字符的位数,可为7、8或9。

  • parity (int) – 奇偶校验,可为None、0(偶校验)或1(奇校验)。

  • stop (int) – 停止位数量,取1或2。

UiFlow2 代码块:

init_rs485.png

MicroPython 代码块:

from module import PwrCANModuleRS485
rs485 = PwrCANModuleRS485(1, baudrate=115200)
init(baudrate=9600, bits=8, parity=None, stop=1, *, tx=None, rx=None, rts=None, cts=None, txbuf=None, rxbuf=None, timeout=None, timeout_char=None, invert=None, flow=None)

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

参数:
  • baudrate (int) – 时钟频率。

  • bits (int) – 每个字符的位数,可为7、8或9。

  • parity (int) – 奇偶校验,可为``None``、0(偶校验)或1(奇校验)。

  • stop (int) – 停止位数量,取1或2。

  • tx (int) – 所用TX引脚。

  • rx (int) – 所用RX引脚。

  • rts (int) – 用于硬件接收流控的RTS(输出)引脚。

  • cts (int) – 用于硬件发送流控的CTS(输入)引脚。

  • txbuf (int) – TX缓冲区的字符长度。

  • rxbuf (int) – RX缓冲区的字符长度。

  • timeout (int) – 等待首个字符的时间(毫秒)。

  • timeout_char (int) – 字符间等待时间(毫秒)。

  • invert (int) – 指定需要反相的线路。

  • flow (int) – 指定需要使用的硬件流控信号。

备注

可以在同一对象上多次调用``init()``以便动态重新配置UART,从而用单个UART外设服务于接在不同GPIO引脚上的不同设备,但同一时间只能服务一个设备。此外不要调用``deinit()``,否则无法再次调用``init()``。

UiFlow2 代码块:

setup.png

MicroPython 代码块:

rs485.init(baudrate=9600, bits=8, parity=None, stop=1)
deinit()

关闭UART总线。

备注

调用``deinit()``后将无法再对该对象调用``init()``,如需继续使用需新建实例。

UiFlow2 代码块:

deinit.png

MicroPython 代码块:

rs485.deinit()
any()

返回可在非阻塞情况下读取的字符数量(整数)。

返回:

int

UiFlow2 代码块:

any.png

MicroPython 代码块:

rs485.any()
read([nbytes])

读取字符。

参数:

nbytes (int) – 指定时最多读取相应字节数,否则尽可能多地读取数据。

返回:

bytes

UiFlow2 代码块:

read_all.png

read_bytes.png

MicroPython 代码块:

data = rs485.read()
readinto(buf[, nbytes])

将字节读入``buf``。

参数:
  • buf (bytearray) – 要写入的缓冲区。

  • nbytes (int) – 指定时最多读取相应字节数,否则最多读取``len(buf)``个字节。

返回:

int

UiFlow2 代码块:

readinto.png

MicroPython 代码块:

buf = bytearray(10)
rs485.readinto(buf)
readline()

读取一行数据,以换行符结尾。

返回:

bytes

UiFlow2 代码块:

readline.png

MicroPython 代码块:

line = rs485.readline()
write(buf)

将字节缓冲区写入总线。

参数:

buf (bytes) – 要写入的缓冲区/字节。

返回:

int

UiFlow2 代码块:

write.png

write_line.png

write_list.png

MicroPython 代码块:

rs485.write(b'data')
sendbreak()

在总线上发送一个break条件。

UiFlow2 代码块:

sendbreak.png

MicroPython 代码块:

rs485.sendbreak()
flush()

等待所有数据发送完成。

UiFlow2 代码块:

flush.png

MicroPython 代码块:

rs485.flush()
txdone()

指示所有数据是否已发送。

返回:

bool

UiFlow2 代码块:

txdone.png

MicroPython 代码块:

rs485.txdone()