English
English
简体中文
日本語

UiFlow Tutorial

UiFlow1 Development Guide

Project Management

Use LTE network

UiFlow1 Blockly

Event

Unit

CAN

Example

Use ESP32 internal CAN controller resources to realize CAN bus data sending and receiving, Note: Before using, you need to access CAN UNIT for the device.

from m5stack import *
from m5ui import *
from uiflow import *
from machine import CAN
import time

setScreenColor(0x222222)

frame = None

label0 = M5TextBox(16, 53, "Device State: ", lcd.FONT_Default, 0x00ff7c, rotate=0)
label1 = M5TextBox(126, 53, "Text", lcd.FONT_Default, 0xFFFFFF, rotate=0)
label2 = M5TextBox(16, 97, "message: ", lcd.FONT_Default, 0x00ff7c, rotate=0)
label3 = M5TextBox(16, 132, "Text", lcd.FONT_Default, 0xFFFFFF, rotate=0)
label4 = M5TextBox(16, 162, "Text", lcd.FONT_Default, 0xFFFFFF, rotate=0)
label5 = M5TextBox(16, 192, "Text", lcd.FONT_Default, 0xFFFFFF, rotate=0)

def buttonA_wasPressed():
  global frame
  can.send([0, 1, 2, 3, 4, 5, 6, 7], 0)
  pass
btnA.wasPressed(buttonA_wasPressed)

def buttonB_wasPressed():
  global frame
  can.clear_tx_queue()
  can.clear_rx_queue()
  pass
btnB.wasPressed(buttonB_wasPressed)

def buttonC_wasPressed():
  global frame
  can.restart()
  pass
btnC.wasPressed(buttonC_wasPressed)


can = CAN(0, extframe=True, mode=CAN.NORMAL, baudrate=CAN.BAUDRATE_25K, tx_io=17, rx_io=16, auto_restart=False)
while True:
  label1.setText(str(can.state()))
  if can.any():
    frame = can.recv()
    label3.setText(str(frame[0]))
    label4.setText(str(frame[1]))
    label5.setText(str(frame[3]))
  wait_ms(30)
  wait_ms(2)

API

from machine import CAN
can = CAN(0, extframe=True, mode=CAN.NORMAL, baudrate=CAN.BAUDRATE_25K, tx_io=17, rx_io=16, auto_restart=False)
  • Initialize CAN bus, configure frame expansion mode, operating mode (normal mode, loopback mode, etc.) and baud rate setting.
can.any()
  • Check for unread data in FIFOs
frame = can.recv()
  • receive data
can.send([0, 1, 2, 3, 4, 5, 6, 7], id)
  • Sends a piece of data and specifies the ID of the data frame, the ID length is 1 byte, the incoming data type is required to be list or tuple, and the data length of the data frame is required to be 8 bytes.
can.setfilter(0, CAN.FILTER_RAW_SINGLE, [])
  • Setting up filter groups
can.state()
  • Get CAN controller status
can.clear_rx_queue()
  • Clear the receive queue
can.clear_tx_queue()
  • Clearing the send queue
can.clearfilter()
  • Clear Filter Groups
can.restart()
  • Reboot CAN bus
can.deinit()
  • Stop CAN bus
Page Tools
PDF
On This Page