Skip to content

Commit cc608b0

Browse files
committed
add BitTiming parameter to Usb2canBus
1 parent f004edb commit cc608b0

File tree

1 file changed

+37
-7
lines changed

1 file changed

+37
-7
lines changed

can/interfaces/usb2can/usb2canInterface.py

Lines changed: 37 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -4,9 +4,17 @@
44

55
import logging
66
from ctypes import byref
7-
from typing import Optional
8-
9-
from can import BusABC, CanInitializationError, CanOperationError, Message
7+
from typing import Optional, Union
8+
9+
from can import (
10+
BitTiming,
11+
BitTimingFd,
12+
BusABC,
13+
CanInitializationError,
14+
CanOperationError,
15+
Message,
16+
)
17+
from can.util import check_or_adjust_timing_clock
1018

1119
from .serial_selector import find_serial_devices
1220
from .usb2canabstractionlayer import (
@@ -78,6 +86,13 @@ class Usb2canBus(BusABC):
7886
Bitrate of channel in bit/s. Values will be limited to a maximum of 1000 Kb/s.
7987
Default is 500 Kbs
8088
89+
:param timing:
90+
Optional :class:`~can.BitTiming` instance to use for custom bit timing setting.
91+
If this argument is set then it overrides the bitrate argument. The
92+
`f_clock` value of the timing instance must be set to 32_000_000 (32MHz)
93+
for standard CAN.
94+
CAN FD and the :class:`~can.BitTimingFd` class are not supported.
95+
8196
:param flags:
8297
Flags to directly pass to open function of the usb2can abstraction layer.
8398
@@ -99,6 +114,7 @@ def __init__(
99114
flags: int = 0x00000008,
100115
*_,
101116
bitrate: int = 500000,
117+
timing: Optional[Union[BitTiming, BitTimingFd]] = None,
102118
serial: Optional[str] = None,
103119
**kwargs,
104120
):
@@ -114,12 +130,26 @@ def __init__(
114130
raise CanInitializationError("could not automatically find any device")
115131
device_id = devices[0]
116132

117-
# convert to kb/s and cap: max rate is 1000 kb/s
118-
baudrate = min(int(bitrate // 1000), 1000)
119-
120133
self.channel_info = f"USB2CAN device {device_id}"
121134

122-
connector = f"{device_id}; {baudrate}"
135+
if isinstance(timing, BitTiming):
136+
timing = check_or_adjust_timing_clock(timing, valid_clocks=[32_000_000])
137+
connector = (
138+
f"{device_id};"
139+
"0;"
140+
f"{timing.tseg1};"
141+
f"{timing.tseg2};"
142+
f"{timing.sjw};"
143+
f"{timing.brp}"
144+
)
145+
elif isinstance(timing, BitTimingFd):
146+
raise NotImplementedError(
147+
f"CAN FD is not supported by {self.__class__.__name__}."
148+
)
149+
else:
150+
# convert to kb/s and cap: max rate is 1000 kb/s
151+
baudrate = min(int(bitrate // 1000), 1000)
152+
connector = f"{device_id};{baudrate}"
123153
self.handle = self.can.open(connector, flags)
124154

125155
super().__init__(channel=channel, **kwargs)

0 commit comments

Comments
 (0)