class CAN – 컨트롤러 영역 네트워크 통신 버스¶
CAN은 클래식 CAN(bxCAN, OpenMV Cam M4 및 M7에서 사용)과 CAN FD(FDCAN, OpenMV Cam H7, H7 Plus 및 Pure Thermal에서 사용) 컨트롤러를 모두 지원합니다. 물리 계층에서 CAN 버스는 RX와 TX 두 개의 신호선으로 구성됩니다. OpenMV Cam을 CAN 버스에 연결하려면 MCU의 CAN 로직 신호를 버스에 맞는 올바른 전압 레벨로 변환하기 위해 CAN 트랜시버를 사용해야 합니다.
루프백(트랜시버 없는) 모드의 클래식 CAN:
from pyb import CAN
can = CAN(1, CAN.LOOPBACK)
# Accept messages with id 123, 124, 125 or 126.
can.setfilter(0, CAN.LIST16, 0, (123, 124, 125, 126))
can.send("message!", 123) # send a message with id 123
can.recv(0) # receive a message on FIFO 0
모든 선택 기능을 활성화한 CAN FD(FD 프레임, 비트 레이트 전환, 확장 프레임 ID, 500 kbit/s 중재 단계, 1 Mbit/s 데이터 단계):
from pyb import CAN
can = CAN(
1,
CAN.NORMAL,
baudrate=500_000,
brs_baudrate=1_000_000,
sample_point=80,
)
# Accept any id in the range 0xFFF0 .. 0xFFFF.
can.setfilter(0, CAN.RANGE, 0, (0xFFF0, 0xFFFF))
can.send(b"a" * 64, 0xFFFF, fdf=True, brs=True, extframe=True)
can.recv(0)
다음 CAN 모듈 함수와 그 인자는 별도로 명시하지 않는 한 클래식 CAN과 FD CAN 컨트롤러 모두에서 사용할 수 있습니다.
생성자¶
- class pyb.CAN(bus: int | str, *args, **kwargs)¶
주어진
bus(정수 주변장치 인덱스, 예를 들어CAN1은1,CAN2는2)에 CAN 객체를 생성합니다. 추가 매개변수가 없으면 객체는 생성되지만 초기화되지는 않습니다(있는 경우 이전 버스 설정을 유지합니다). 추가 인자가 주어지면 버스가 초기화됩니다. 사용 가능한 매개변수는CAN.init()을 참조하세요.CAN(2)는pyb.CAN을 노출하는 모든 OpenMV Cam(M4 / M7 / H7 / H7 Plus / Pure Thermal)에서 동일한 헤더 핀에 연결됩니다:신호
헤더 핀
참고
RXP3TXP2CAN 주변장치는 로직 레벨 신호만 제공합니다. 실제 CAN 버스를 구동하려면 외부 CAN 트랜시버가 필요합니다.
pyb.CAN은 OpenMV Cam N6에서 사용할 수 없습니다.메서드¶
- init(mode: int, prescaler: int = 100, *, sjw: int = 1, bs1: int = 6, bs2: int = 8, auto_restart: bool = False, baudrate: int = 0, sample_point: int = 75, num_filter_banks: int = 14, brs_sjw: int = 1, brs_bs1: int = 8, brs_bs2: int = 3, brs_baudrate: int = 0, brs_sample_point: int = 75) None¶
주어진 매개변수로 CAN 버스를 초기화합니다:
mode는 다음 중 하나입니다: NORMAL, LOOPBACK, SILENT, SILENT_LOOPBACK
prescaler는 공칭 비트 시간 퀀텀을 생성하기 위해 CAN 입력 클럭을 나누는 값입니다. 프리스케일러는 클래식 CAN의 경우 1에서 1024 사이(포함), CAN FD의 경우 1에서 512 사이(포함)의 값일 수 있습니다.
sjw는 공칭 비트의 시간 퀀텀 단위로 표현한 재동기화 점프 폭입니다. 클래식 CAN의 경우 1에서 4 사이(포함), CAN FD의 경우 1에서 128 사이(포함)의 값일 수 있습니다.
bs1은 공칭 비트의 시간 퀀텀 단위로 샘플 포인트의 위치를 정의합니다. 클래식 CAN의 경우 1에서 16 사이(포함), CAN FD의 경우 2에서 256 사이(포함)의 값일 수 있습니다.
bs2는 공칭 비트의 시간 퀀텀 단위로 전송 포인트의 위치를 정의합니다. 클래식 CAN의 경우 1에서 8 사이(포함), CAN FD의 경우 2에서 128 사이(포함)의 값일 수 있습니다.
auto_restart는 컨트롤러가 버스 오프 상태에 진입한 후 자동으로 통신을 재시작하려고 시도할지 여부를 설정합니다. 이 기능을 비활성화하면
restart()를 사용하여 버스 오프 상태에서 벗어날 수 있습니다baudrate 0이 아닌 보드 레이트가 제공되면, 이 함수는 baudrate(0.1% 이내)와 원하는 sample_point(가장 가까운 1%까지)를 모두 만족하는 CAN 공칭 비트 시간을 자동으로 계산하려고 시도합니다(prescaler, bs1, bs2를 덮어씁니다). CAN 타이밍을 더 정밀하게 제어하려면 prescaler, bs1, bs2 매개변수를 직접 설정하세요.
sample_point는 전체 공칭 비트 시간에 대한 비트 샘플의 위치를 공칭 비트 시간의 정수 백분율로 표현하여 지정합니다. 기본 sample_point는 75%입니다. 이 매개변수는 baudrate가 설정되지 않으면 무시됩니다.
num_filter_banks 클래식 CAN의 경우, 이는 CAN(1)에 할당될 뱅크 수이며, 나머지 28개 중 나머지는 CAN(2)에 할당됩니다.
나머지 매개변수는 CAN FD를 지원하는 보드에만 존재하며, 선택적인 CAN FD 비트 레이트 전환(BRS) 기능을 구성합니다:
brs_prescaler는 데이터 비트 시간 퀀텀을 생성하기 위해 CAN FD 입력 클럭을 나누는 값입니다. 프리스케일러는 1에서 32 사이(포함)의 값일 수 있습니다.
brs_sjw는 데이터 비트의 시간 퀀텀 단위로 표현한 재동기화 점프 폭입니다. 1에서 16 사이(포함)의 값일 수 있습니다
brs_bs1은 데이터 비트의 시간 퀀텀 단위로 샘플 포인트의 위치를 정의합니다. 1에서 32 사이(포함)의 값일 수 있습니다
brs_bs2는 데이터 비트의 시간 퀀텀 단위로 전송 포인트의 위치를 정의합니다. 1에서 16 사이(포함)의 값일 수 있습니다
brs_baudrate 0이 아닌 보드 레이트가 제공되면, 이 함수는 brs_baudrate(0.1% 이내)와 원하는 brs_sample_point(가장 가까운 1%까지)를 모두 만족하는 CAN 데이터 비트 시간을 자동으로 계산하려고 시도합니다(brs_prescaler, brs_bs1, brs_bs2를 덮어씁니다). BRS 타이밍을 더 정밀하게 제어하려면 brs_prescaler, brs_bs1, brs_bs2 매개변수를 직접 설정하세요.
brs_sample_point는 전체 공칭 비트 시간에 대한 비트 샘플의 위치를 공칭 비트 시간의 정수 백분율로 표현하여 지정합니다. 기본 brs_sample_point는 75%입니다. 이 매개변수는 brs_baudrate가 설정되지 않으면 무시됩니다.
시간 퀀텀 tq는 CAN 버스의 기본 시간 단위입니다. tq는 CAN 프리스케일러 값을 PCLK1(내부 주변장치 버스 1의 주파수)로 나눈 값입니다. PCLK1을 확인하려면
pyb.freq()를 참조하세요.단일 비트는 항상 1 tq인 동기화 세그먼트로 구성됩니다. 그 다음에 비트 세그먼트 1, 이어서 비트 세그먼트 2가 옵니다. 샘플 포인트는 비트 세그먼트 1이 끝난 후입니다. 전송 포인트는 비트 세그먼트 2가 끝난 후입니다. 보드 레이트는 1/bittime이 되며, 여기서 bittime은 1 + BS1 + BS2에 시간 퀀텀 tq를 곱한 값입니다.
예를 들어 OpenMV Cam H7(PCLK1 = 100 MHz)에서 75% 샘플 포인트를 갖는 250 kbps CAN은
prescaler=25, sjw=1, bs1=11, bs2=4로 구성할 수 있습니다:tq = 25 / 100 MHz = 250 ns,bittime = (1 + 11 + 4) × 250 ns = 4 µs, 샘플 포인트 =(1 + 11) / 16 = 75%, 그리고 보드 레이트는1 / 4 µs = 250 kHz입니다.자세한 내용은 OpenMV Cam의 MCU에 대한 STM32 레퍼런스 매뉴얼의 bxCAN / FDCAN 섹션을 참조하세요.
- restart() None¶
구성을 재설정하지 않고 CAN 컨트롤러의 소프트웨어 재시작을 강제합니다.
컨트롤러가 버스 오프 상태에 진입하면 더 이상 버스 활동에 참여하지 않습니다. 컨트롤러가 자동으로 재시작하도록 구성되지 않은 경우(
init()참조), 이 메서드를 사용하여 재시작을 트리거할 수 있으며, 컨트롤러는 CAN 프로토콜에 따라 버스 오프 상태에서 벗어나 에러 액티브 상태로 진입합니다.
- state() int¶
컨트롤러의 상태를 반환합니다. 반환 값은 다음 중 하나일 수 있습니다:
CAN.STOPPED– 컨트롤러가 완전히 꺼져 있고 리셋된 상태;CAN.ERROR_ACTIVE– 컨트롤러가 켜져 있고 에러 액티브 상태(TEC와 REC가 모두 96 미만);CAN.ERROR_WARNING– 컨트롤러가 켜져 있고 에러 워닝 상태(TEC 또는 REC 중 적어도 하나가 96 이상);CAN.ERROR_PASSIVE– 컨트롤러가 켜져 있고 에러 패시브 상태(TEC 또는 REC 중 적어도 하나가 128 이상);CAN.BUS_OFF– 컨트롤러가 켜져 있지만 버스 활동에 참여하지 않는 상태(TEC가 255를 초과하여 오버플로됨).
- info(list: list | None = None) list¶
컨트롤러의 에러 상태와 TX 및 RX 버퍼에 대한 정보를 가져옵니다. list가 제공되면, 적어도 8개의 항목을 가진 리스트 객체여야 하며, 여기에 정보가 채워집니다. 그렇지 않으면 새 리스트가 생성되어 채워집니다. 두 경우 모두 메서드의 반환 값은 채워진 리스트입니다.
리스트의 값은 다음과 같습니다:
TEC 값
REC 값
컨트롤러가 에러 워닝 상태에 진입한 횟수(65535를 넘으면 0으로 되돌아감)
컨트롤러가 에러 패시브 상태에 진입한 횟수(65535를 넘으면 0으로 되돌아감)
컨트롤러가 버스 오프 상태에 진입한 횟수(65535를 넘으면 0으로 되돌아감)
대기 중인 TX 메시지 수
fifo 0에서 대기 중인 RX 메시지 수
fifo 1에서 대기 중인 RX 메시지 수
- setfilter(bank: int, mode: int, fifo: int, params: Tuple[int, ...], *, rtr: Tuple[bool, ...] | None = None, extframe: bool = False) None¶
필터 뱅크를 구성합니다:
bank는 구성할 클래식 CAN 컨트롤러 필터 뱅크 또는 CAN FD 필터 인덱스입니다.
mode는 필터가 동작해야 하는 모드입니다. 아래 표를 참조하세요.
fifo는 이 필터에 의해 메시지가 수락될 경우 메시지를 저장할 fifo(0 또는 1)입니다.
params는 필터를 정의하는 값의 배열입니다. 배열의 내용은 mode 인자에 따라 다릅니다.
클래식 CAN 컨트롤러(OpenMV Cam M4 / M7)의 params 배열 내용:
mode
params의 내용
CAN.LIST16수락될 네 개의 16비트 ID.
CAN.LIST32수락될 두 개의 32비트 ID.
CAN.MASK16두 개의 16비트 id/mask 쌍, 예:
(1, 3, 4, 4). 첫 번째 쌍(1, 3)은 비트 0 = 1 및 비트 1 = 0인 모든 ID를 수락합니다. 두 번째 쌍(4, 4)은 비트 2 = 1인 모든 ID를 수락합니다.CAN.MASK32하나의 32비트 id/mask 쌍(그 외에는
CAN.MASK16과 동일).CAN FD 컨트롤러(OpenMV Cam H7 / H7 Plus / Pure Thermal)의 params 배열 내용:
mode
params의 내용
CAN.RANGE수락되는 ID 범위를 형성하는 두 개의 ID.
CAN.DUAL수락될 두 개의 ID(예:
(1, 2)).CAN.MASK하나의
(id, mask)쌍(예:(0x111, 0x7FF)).rtr 클래식 CAN 컨트롤러의 경우, 이는 필터가 원격 전송 요청 메시지를 수락해야 하는지를 나타내는 불리언 배열입니다. 이 인자가 주어지지 않으면 모든 항목에 대해
False로 기본 설정됩니다. 길이는 mode에 따라 다릅니다:mode
len(rtr)참고
CAN.LIST164
CAN.LIST322
CAN.MASK162
CAN.MASK321
CAN FD의 경우 이 인자는 무시됩니다.
extframe True이면 프레임은 확장 식별자(29비트)를 가지며, 그렇지 않으면 표준 식별자(11비트)가 사용됩니다.
- clearfilter(bank: int, extframe: bool = False) None¶
필터 뱅크를 지우고 비활성화합니다:
bank는 지울 클래식 CAN 컨트롤러 필터 뱅크 또는 CAN FD 필터 인덱스입니다.
extframe CAN FD 컨트롤러의 경우, True이면 확장 필터(extframe=True로 구성됨)를 지우고, 그렇지 않으면 표준 식별자(extframe=False로 구성됨)를 지웁니다.
- recv(fifo: int, list: list | None = None, *, timeout: int = 5000) list¶
버스에서 데이터를 수신합니다:
fifo는 수신할 FIFO를 나타내는 정수입니다
list는 반환 값으로 사용할 선택적 리스트 객체입니다
timeout은 수신을 기다리는 타임아웃(밀리초)입니다.
반환 값: 다섯 개의 값을 포함하는 리스트.
메시지의 id.
메시지 ID가 표준인지 확장인지 나타내는 불리언.
메시지가 RTR 메시지인지 나타내는 불리언.
FMI(Filter Match Index) 값.
데이터를 포함하는 배열.
list가
None이면 새 리스트가 할당되고, 데이터를 담을 새 bytes 객체도 (리스트의 다섯 번째 요소로) 할당됩니다.list가
None이 아니면, 적어도 다섯 개의 요소를 가진 리스트 객체여야 합니다. 다섯 번째 요소는 ‘B’ 또는 ‘b’ 타입의 bytearray 또는 array로부터 생성된 memoryview 객체여야 하며, 이 배열은 적어도 8바이트를 담을 충분한 공간이 있어야 합니다. 그러면 리스트 객체는 위의 처음 네 개의 반환 값으로 채워지고, memoryview 객체는 데이터 크기에 맞게 제자리에서 크기가 조정되어 해당 데이터로 채워집니다. 동일한 리스트와 memoryview 객체는 이 메서드의 후속 호출에서 재사용할 수 있으며, 힙을 사용하지 않고 데이터를 수신하는 방법을 제공합니다. 예:buf = bytearray(8) lst = [0, 0, 0, 0, memoryview(buf)] # No heap memory is allocated in the following call can.recv(0, lst)
- send(data: int | bytes | bytearray, id: int, *, timeout: int = 0, rtr: bool = False, extframe: bool = False, fdf: bool = False, brs: bool = False) None¶
버스에서 메시지를 전송합니다:
data는 전송할 데이터입니다(전송할 정수 또는 buffer 객체).
id는 전송할 메시지의 id입니다.
timeout은 전송을 기다리는 타임아웃(밀리초)입니다.
rtr는 메시지를 원격 전송 요청으로 전송할지 지정하는 불리언입니다. rtr이 True이면 data의 길이만 프레임의 DLC 슬롯을 채우는 데 사용되며, data의 실제 바이트는 사용되지 않습니다.
extframe True이면 프레임은 확장 식별자(29비트)를 가지며, 그렇지 않으면 표준 식별자(11비트)가 사용됩니다.
fdf CAN FD 컨트롤러의 경우, True로 설정하면 프레임은 최대 64바이트의 데이터 페이로드를 지원하는 FD 프레임 형식을 갖습니다.
brs CAN FD 컨트롤러의 경우, True로 설정하면 비트레이트 전환 모드가 활성화되어 데이터 단계가 다른 비트레이트로 전송됩니다. 데이터 비트 타이밍 구성 매개변수는
CAN.init()을 참조하세요.
timeout이 0이면 메시지는 세 개의 하드웨어 버퍼 중 하나에 배치되고 메서드는 즉시 반환됩니다. 세 개의 버퍼가 모두 사용 중이면 예외가 발생합니다. timeout이 0이 아니면, 메서드는 메시지가 전송될 때까지 대기합니다. 지정된 시간 내에 메시지를 전송할 수 없으면 예외가 발생합니다.
반환 값:
None.
- rxcallback(fifo: int, fun: Callable[[CAN, int], None] | None) None¶
비어 있는 FIFO에 메시지가 수락될 때 호출될 함수를 등록합니다:
fifo는 수신 FIFO입니다.
fun은 FIFO가 비어 있지 않게 될 때 호출될 함수입니다.
콜백 함수는 두 개의 인자를 받습니다: 첫 번째는 CAN 객체 자체이고, 두 번째는 콜백의 이유를 나타내는 정수입니다:
이유
의미
0비어 있는 FIFO에 메시지가 수락되었습니다.
1FIFO가 가득 찼습니다.
2FIFO가 가득 차서 메시지가 손실되었습니다.
rxcallback 사용 예:
def cb0(bus, reason): print('cb0') if reason == 0: print('pending') if reason == 1: print('full') if reason == 2: print('overflow') can = CAN(1, CAN.LOOPBACK) can.rxcallback(0, cb0)
상수¶
버스 모드 상수(
init()의mode인자):컨트롤러 상태 상수(
state()가 반환):클래식 CAN 필터 모드(OpenMV Cam M4 / M7에서
setfilter()의mode인자):CAN FD 필터 모드(OpenMV Cam H7 / H7 Plus / Pure Thermal에서
setfilter()의mode인자):