Skip to content

Commit 835b943

Browse files
committed
port/esp32: Add CAN(TWAI) class.
Signed-off-by: IhorNehrutsa <[email protected]>
1 parent 30acb16 commit 835b943

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

+24
Original file line numberDiff line numberDiff line change
@@ -651,6 +651,30 @@ users is encouraged. Based on this feedback, the I2S class API and implementati
651651

652652
ESP32 has two I2S buses with id=0 and id=1
653653

654+
CAN bus
655+
-------
656+
657+
See :ref:`machine.CAN <machine.CAN>` ::
658+
659+
The CAN driver is based on hardware implementation.
660+
Any available output-capablepins can be used for TX, RX, BUS-OFF, and CLKOUT signal lines.
661+
662+
.. image:: img/twai_blockdiag.png
663+
664+
The driver is accessed via the :ref:`machine.CAN <machine.CAN>` class::
665+
666+
from machine import CAN
667+
can = CAN(0, tx=5, rx=4, mode=CAN.NORMAL, baudrate=500000)
668+
can.setfilter(0, CAN.FILTER_ADDRESS, [0x102]) # set a filter to receive messages with id = 0x102
669+
can.send([1,2,3], 0x102) # send a message with id 123
670+
can.recv() # receive message
671+
672+
can.any() # returns True if there are any message to receive
673+
can.info() # get information about the controller’s error states and TX and RX buffers
674+
can.deinit() # turn off the can bus
675+
can.clear_rx_queue() # clear messages in the FIFO
676+
can.clear_tx_queue() # clear messages in the transmit buffer
677+
654678
Real time clock (RTC)
655679
---------------------
656680

examples/esp32_can.py

+73
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)