8000 port/esp32: Add CAN(TWAI) class. · micropython/micropython@be0679d · GitHub
[go: up one dir, main page]

Skip to content

Commit be0679d

Browse files
committed
port/esp32: Add CAN(TWAI) class.
Signed-off-by: IhorNehrutsa <Ihor.Nehrutsa@gmail.com>
1 parent 0e490b7 commit be0679d

File tree

5 files changed

+980
-0
lines changed

5 files changed

+980
-0
lines changed

docs/esp32/img/twai_blockdiag.png

9.92 KB
Loading

docs/esp32/quickref.rst

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -568,6 +568,30 @@ users is encouraged. Based on this feedback, the I2S class API and implementati
568568

569569
ESP32 has two I2S buses with id=0 and id=1
570570

571+
CAN bus
572+
-------
573+
574+
See :ref:`machine.CAN <machine.CAN>` ::
575+
576+
The CAN driver is based on hardware implementation.
577+
Any available output-capablepins can be used for TX, RX, BUS-OFF, and CLKOUT signal lines.
578+
579+
.. image:: img/twai_blockdiag.png
580+
581+
The driver is accessed via the :ref:`machine.CAN <machine.CAN>` class::
582+
583+
from machine import CAN
584+
can = CAN(0, tx=5, rx=4, mode=CAN.NORMAL, baudrate=500000)
585+
can.setfilter(0, CAN.FILTER_ADDRESS, [0x102]) # set a filter to receive messages with id = 0x102
586+
can.send([1,2,3], 0x102) # send a message with id 123
587+
can.recv() # receive message
588+
589+
can.any() # returns True if there are any message to receive
590+
can.info() # get information about the controller’s error states and TX and RX buffers
591+
can.deinit() # turn off the can bus
592+
can.clear_rx_queue() # clear messages in the FIFO
593+
can.clear_tx_queue() # clear messages in the transmit buffer
594+
571595
Real time clock (RTC)
572596
---------------------
573597

examples/esp32_can.py

Lines changed: 73 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,73 @@
1+
from machine import CAN
2+
import time
3+
4+
5+
def send_and_check(can_bus, name, id, expected_result=True, extended=False):
6+
can_bus.clear_tx_queue()
7+
can_bus.clear_rx_queue()
8+
can_bus.send([], id, extframe=extended)
9+
time.sleep_ms(100)
10+
if can_bus.any() == expected_result:
11+
print("{}: OK".format(name))
12+
if expected_result:
13+
can_bus.recv()
14+
else:
15+
print("{}: FAILED".format(name))
16+
17+
18+
# 4 and 5 pins must be connected to each other, see documentation
19+
dev = CAN(
20+
0, extframe=False, tx=5, rx=4, mode=CAN.SILENT_LOOPBACK, baudrate=50000, auto_restart=False
21+
)
22+
23+
# Test send/receive message
24+
print("Loopback Test: no filter - STD")
25+
send_and_check(dev, "No filter", 0x100, True)
26+
27+
# Set filter1
28+
print("Loopback Test: one filter - STD")
29+
dev.setfilter(0, CAN.FILTER_ADDRESS, [0x101, 0])
30+
send_and_check(dev, "Passing Message", 0x101, True)
31+
send_and_check(dev, "Blocked Message", 0x100, False)
32+
33+
# Set filter2
34+
print("Loopback Test: second filter - STD")
35+
dev.setfilter(0, CAN.FILTER_ADDRESS, [0x102, 0])
36+
send_and_check(dev, "Passing Message - Bank 1", 0x102, True)
37+
send_and_check(dev, "Passing Message - Bank 0", 0x101, True)
38+
send_and_check(dev, "Blocked Message", 0x100, False)
39+
40+
# Remove filter
41+
print("Loopback Test: clear filter - STD")
42+
dev.clearfilter()
43+
send_and_check(dev, "Passing Message - Bank 1", 0x102, True)
44+
send_and_check(dev, "Passing Message - Bank 0", 0x101, True)
45+
send_and_check(dev, "Passing any Message", 0x100, True)
46+
47+
# Extended message tests
48+
# Move to Extended
49+
dev = CAN(
50+
0,
51+
extframe=True,
52+
mode=CAN.SILENT_LOOPBACK,
53+
baudrate=CAN.BAUDRATE_500k,
54+
tx_io=18,
55+
rx_io=19,
56+
auto_restart=False,
57+
)
58+
59+
# Test send/receive message
60+
print("Loopback Test: no filter - Extd")
61+
send_and_check(dev, "No filter", 0x100, True, extended=True)
62+
63+
# Set filter1
64+
print("Loopback Test: one filter - Extd")
65+
dev.setfilter(0, CAN.FILTER_ADDRESS, [0x101, 0], extframe=True)
66+
send_and_check(dev, "Passing Message", 0x101, True, extended=True)
67+
send_and_check(dev, "Blocked Message", 0x100, False, extended=True)
68+
69+
# Remove filter
70+
print("Loopback Test: clear filter - Extd")
71+
dev.clearfilter()
72+
send_and_check(dev, "Passing Message - Bank 0", 0x101, True, extended=True)
73+
send_and_check(dev, "Passing any Message", 0x100, True, extended=True)

0 commit comments

Comments
 (0)
0