Skip to content

Commit 38cbfa9

Browse files
committed
port/esp32: Add CAN(TWAI) class.
Signed-off-by: IhorNehrutsa <[email protected]>
1 parent 00a926e commit 38cbfa9

File tree

9 files changed

+1195
-1
lines changed

9 files changed

+1195
-1
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
@@ -724,6 +724,30 @@ users is encouraged. Based on this feedback, the I2S class API and implementati
724724

725725
ESP32 has two I2S buses with id=0 and id=1
726726

727+
CAN bus
728+
-------
729+
730+
See :ref:`machine.CAN <machine.CAN>` ::
731+
732+
The CAN driver is based on hardware implementation.
733+
Any available output-capablepins can be used for TX, RX, BUS-OFF, and CLKOUT signal lines.
734+
735+
.. image:: img/twai_blockdiag.png
736+
737+
The driver is accessed via the :ref:`machine.CAN <machine.CAN>` class::
738+
739+
from machine import CAN
740+
can = CAN(0, tx=5, rx=4, mode=CAN.NORMAL, baudrate=500000)
741+
can.setfilter(0, CAN.FILTER_ADDRESS, [0x102]) # set a filter to receive messages with id = 0x102
742+
can.send([1,2,3], 0x102) # send a message with id 123
743+
can.recv() # receive message
744+
745+
can.any() # returns True if there are any message to receive
746+
can.info() # get information about the controller’s error states and TX and RX buffers
747+
can.deinit() # turn off the can bus
748+
can.clear_rx_queue() # clear messages in the FIFO
749+
can.clear_tx_queue() # clear messages in the transmit buffer
750+
727751
Real time clock (RTC)
728752
---------------------
729753

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=22, rx=23, mode=CAN.SILENT_LOOPBACK, bitrate=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.set_filters(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.set_filters(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=18,
55+
rx=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)

ports/esp32/esp32_common.cmake

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -112,6 +112,7 @@ list(APPEND MICROPY_SOURCE_PORT
112112
fatfs_port.c
113113
help.c
114114
machine_bitstream.c
115+
machine_can.c
115116
machine_timer.c
116117
machine_pin.c
117118
machine_touchpad.c

0 commit comments

Comments
 (0)