micropython/tests/extmod_hardware/machine_can2.py
Angus Gratton 6cac2d275d stm32: Add machine.CAN implementation.
Implemented according to API docs in a parent comment.

Adds new multi_extmod/machine_can_* tests which pass when testing between
NUCLEO_G474RE, NUCLEO_H723ZG and PYBDV11.

This work was mostly funded through GitHub Sponsors.

Signed-off-by: Angus Gratton <angus@redyak.com.au>
2026-03-19 17:36:50 +11:00

45 lines
1.1 KiB
Python

# Test machine.CAN(1) and machine.CAN(2) using loopback
#
# Single device test, assumes support for loopback and no connections to the CAN pins
#
# This test is ported from tests/ports/stm32/pyb_can2.py
try:
from machine import CAN
CAN(2, 125_000)
except (ImportError, ValueError):
print("SKIP")
raise SystemExit
import time
# Setting up each CAN peripheral independently is deliberate here, to catch
# catch cases where initialising CAN2 breaks CAN1
can1 = CAN(1, 125_000, mode=CAN.MODE_LOOPBACK)
can1.set_filters([(0x100, 0x700, 0)])
can2 = CAN(2, 125_000, mode=CAN.MODE_LOOPBACK)
can2.set_filters([(0x000, 0x7F0, 0)])
# Drain any old messages in RX FIFOs
for can in (can1, can2):
while can.recv():
pass
for id, can in ((1, can1), (2, can2)):
print("testing", id)
# message1 should only receive on can1, message2 on can2
can.send(0x123, b"message1", 0)
can.send(0x003, "message2", 0)
time.sleep_ms(10)
did_recv = False
while res := can.recv():
did_recv = True
print(hex(res[0]), bytes(res[1]), res[2], res[3])
if not did_recv:
print("no rx!")
print("done")