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主机供电。本模块适用于机器人控制、协议转换、工业自动化、汽车通信系统、智能交通及楼宇自动化等领域。
支持的产品:
UiFlow2 示例
简易 CAN 与 RS485 通信
在UiFlow2中打开 pwrcan_cores3_example.m5f2 项目。
该示例演示如何使用 PwrCAN 模块。
触摸屏幕即可发送CAN报文和RS485数据,接收到的RS485数据会显示在标签上。
UiFlow2 代码块:
示例输出:
屏幕会显示接收到的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 代码块:

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对象。
- 参数:
UiFlow2 代码块:

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

MicroPython 代码块:
rs485.init(baudrate=9600, bits=8, parity=None, stop=1)
- deinit()
关闭UART总线。
备注
调用``deinit()``后将无法再对该对象调用``init()``,如需继续使用需新建实例。
UiFlow2 代码块:

MicroPython 代码块:
rs485.deinit()
- any()
返回可在非阻塞情况下读取的字符数量(整数)。
- 返回:
int
UiFlow2 代码块:

MicroPython 代码块:
rs485.any()
- read([nbytes])
读取字符。
- 参数:
nbytes (int) – 指定时最多读取相应字节数,否则尽可能多地读取数据。
- 返回:
bytes
UiFlow2 代码块:


MicroPython 代码块:
data = rs485.read()
- readinto(buf[, nbytes])
将字节读入``buf``。
UiFlow2 代码块:

MicroPython 代码块:
buf = bytearray(10) rs485.readinto(buf)
- readline()
读取一行数据,以换行符结尾。
- 返回:
bytes
UiFlow2 代码块:

MicroPython 代码块:
line = rs485.readline()
- write(buf)
将字节缓冲区写入总线。
- 参数:
buf (bytes) – 要写入的缓冲区/字节。
- 返回:
int
UiFlow2 代码块:



MicroPython 代码块:
rs485.write(b'data')
- sendbreak()
在总线上发送一个break条件。
UiFlow2 代码块:

MicroPython 代码块:
rs485.sendbreak()
- flush()
等待所有数据发送完成。
UiFlow2 代码块:

MicroPython 代码块:
rs485.flush()
- txdone()
指示所有数据是否已发送。
- 返回:
bool
UiFlow2 代码块:

MicroPython 代码块:
rs485.txdone()

