lớp CAN -- bus giao tiếp mạng điều khiển khu vực¶
CAN hỗ trợ cả hai loại bộ điều khiển CAN cổ điển (bxCAN, sử dụng trên OpenMV Cam M4 và M7) và CAN FD (FDCAN, sử dụng trên OpenMV Cam H7, H7 Plus và Pure Thermal). Ở cấp độ vật lý, bus CAN bao gồm hai đường truyền, RX và TX. Để kết nối OpenMV Cam với bus CAN, bạn phải sử dụng bộ thu phát CAN để chuyển đổi tín hiệu logic CAN từ MCU sang mức điện áp phù hợp trên bus.
CAN cổ điển ở chế độ loopback (không cần bộ thu phát):
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 với tất cả các tính năng tùy chọn được bật (khung FD, chuyển đổi tốc độ bit, ID khung mở rộng; pha phân xử 500 kbit/s, pha dữ liệu 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)
Các hàm và đối số của module CAN sau đây khả dụng cho cả bộ điều khiển CAN cổ điển và FD, trừ khi có ghi chú khác.
Hàm khởi tạo¶
- class pyb.CAN(bus: int | str, *args, **kwargs)¶
Tạo một đối tượng CAN trên
busđã cho (một chỉ số ngoại vi nguyên, ví dụ:1choCAN1,2choCAN2). Không có tham số bổ sung, đối tượng được tạo nhưng chưa được khởi tạo (nó giữ lại cài đặt bus trước đó, nếu có); nếu có thêm đối số, bus sẽ được khởi tạo. XemCAN.init()để biết các tham số khả dụng.CAN(2)được nối dây đến cùng các chân header trên mọi OpenMV Cam cópyb.CAN(M4 / M7 / H7 / H7 Plus / Pure Thermal):Tín hiệu
Chân header
Ghi chú
RXP3TXP2Ngoại vi CAN chỉ cung cấp tín hiệu ở mức logic; cần có bộ thu phát CAN ngoài để điều khiển bus CAN thực tế.
pyb.CANkhông khả dụng trên OpenMV Cam N6.Phương thức¶
- 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¶
Khởi tạo bus CAN với các tham số đã cho:
mode là một trong các chế độ: NORMAL, LOOPBACK, SILENT, SILENT_LOOPBACK
prescaler là giá trị mà xung nhịp đầu vào CAN được chia để tạo ra quanta thời gian bit danh định. Bộ chia tần có thể là giá trị từ 1 đến 1024 (bao gồm) cho CAN cổ điển, và từ 1 đến 512 (bao gồm) cho CAN FD.
sjw là độ rộng nhảy đồng bộ lại tính bằng đơn vị quanta thời gian cho các bit danh định; có thể là giá trị từ 1 đến 4 (bao gồm) cho CAN cổ điển, và từ 1 đến 128 (bao gồm) cho CAN FD.
bs1 xác định vị trí điểm lấy mẫu tính bằng đơn vị quanta thời gian cho các bit danh định; có thể là giá trị từ 1 đến 16 (bao gồm) cho CAN cổ điển, và từ 2 đến 256 (bao gồm) cho CAN FD.
bs2 xác định vị trí điểm truyền tính bằng đơn vị quanta thời gian cho các bit danh định; có thể là giá trị từ 1 đến 8 (bao gồm) cho CAN cổ điển, và từ 2 đến 128 (bao gồm) cho CAN FD.
auto_restart đặt xem bộ điều khiển có tự động cố gắng khởi động lại giao tiếp sau khi vào trạng thái bus-off hay không; nếu tính năng này bị tắt, có thể dùng
restart()để thoát khỏi trạng thái bus-offbaudrate nếu tốc độ baud khác 0 được cung cấp, hàm này sẽ cố gắng tự động tính toán thời gian bit danh định CAN (ghi đè prescaler, bs1 và bs2) thỏa mãn cả baudrate (trong phạm vi 0,1%) và sample_point mong muốn (đến 1% gần nhất). Để kiểm soát chính xác hơn việc định thời CAN, hãy đặt trực tiếp các tham số prescaler, bs1 và bs2.
sample_point xác định vị trí lấy mẫu bit so với toàn bộ thời gian bit danh định, được biểu thị bằng phần trăm nguyên của thời gian bit danh định. Giá trị mặc định của sample_point là 75%. Tham số này bị bỏ qua trừ khi baudrate được đặt.
num_filter_banks đối với CAN cổ điển, đây là số ngân hàng bộ lọc sẽ được gán cho CAN(1), phần còn lại trong số 28 được gán cho CAN(2).
Các tham số còn lại chỉ có trên các board hỗ trợ CAN FD, và cấu hình tính năng Chuyển Đổi Tốc Độ Bit (BRS) tùy chọn của CAN FD:
brs_prescaler là giá trị mà xung nhịp đầu vào CAN FD được chia để tạo ra quanta thời gian bit dữ liệu. Bộ chia tần có thể là giá trị từ 1 đến 32 (bao gồm).
brs_sjw là độ rộng nhảy đồng bộ lại tính bằng đơn vị quanta thời gian cho các bit dữ liệu; có thể là giá trị từ 1 đến 16 (bao gồm)
brs_bs1 xác định vị trí điểm lấy mẫu tính bằng đơn vị quanta thời gian cho các bit dữ liệu; có thể là giá trị từ 1 đến 32 (bao gồm)
brs_bs2 xác định vị trí điểm truyền tính bằng đơn vị quanta thời gian cho các bit dữ liệu; có thể là giá trị từ 1 đến 16 (bao gồm)
brs_baudrate nếu tốc độ baud khác 0 được cung cấp, hàm này sẽ cố gắng tự động tính toán thời gian bit dữ liệu CAN (ghi đè brs_prescaler, brs_bs1 và brs_bs2) thỏa mãn cả brs_baudrate (trong phạm vi 0,1%) và brs_sample_point mong muốn (đến 1% gần nhất). Để kiểm soát chính xác hơn việc định thời BRS, hãy đặt trực tiếp các tham số brs_prescaler, brs_bs1 và brs_bs2.
brs_sample_point xác định vị trí lấy mẫu bit so với toàn bộ thời gian bit danh định, được biểu thị bằng phần trăm nguyên của thời gian bit danh định. Giá trị mặc định của brs_sample_point là 75%. Tham số này bị bỏ qua trừ khi brs_baudrate được đặt.
Quanta thời gian tq là đơn vị thời gian cơ bản cho bus CAN. tq là giá trị bộ chia tần CAN chia cho PCLK1 (tần số bus ngoại vi nội tại 1); xem
pyb.freq()để xác định PCLK1.Một bit đơn bao gồm đoạn đồng bộ hóa, luôn là 1 tq. Tiếp theo là đoạn bit 1, rồi đến đoạn bit 2. Điểm lấy mẫu nằm sau khi đoạn bit 1 kết thúc. Điểm truyền nằm sau khi đoạn bit 2 kết thúc. Tốc độ baud sẽ là 1/bittime, trong đó bittime bằng 1 + BS1 + BS2 nhân với quanta thời gian tq.
Ví dụ: trên OpenMV Cam H7 (PCLK1 = 100 MHz), CAN 250 kbps với điểm lấy mẫu 75% có thể được cấu hình là
prescaler=25, sjw=1, bs1=11, bs2=4:tq = 25 / 100 MHz = 250 ns,bittime = (1 + 11 + 4) × 250 ns = 4 µs, điểm lấy mẫu =(1 + 11) / 16 = 75%, và tốc độ baud là1 / 4 µs = 250 kHz.Xem phần bxCAN / FDCAN trong sổ tay tham khảo STM32 của MCU OpenMV Cam để biết thêm chi tiết.
- restart() None¶
Buộc khởi động lại phần mềm bộ điều khiển CAN mà không đặt lại cấu hình của nó.
Nếu bộ điều khiển vào trạng thái bus-off thì nó sẽ không còn tham gia vào hoạt động bus nữa. Nếu bộ điều khiển không được cấu hình để tự động khởi động lại (xem
init()) thì phương thức này có thể được sử dụng để kích hoạt khởi động lại, và bộ điều khiển sẽ tuân theo giao thức CAN để thoát khỏi trạng thái bus-off và chuyển sang trạng thái lỗi hoạt động.
- state() int¶
Trả về trạng thái của bộ điều khiển. Giá trị trả về có thể là một trong các giá trị sau:
CAN.STOPPED-- bộ điều khiển hoàn toàn tắt và đặt lại;CAN.ERROR_ACTIVE-- bộ điều khiển đang bật và ở trạng thái Lỗi Hoạt Động (cả TEC và REC đều nhỏ hơn 96);CAN.ERROR_WARNING-- bộ điều khiển đang bật và ở trạng thái Cảnh Báo Lỗi (ít nhất một trong TEC hoặc REC bằng hoặc lớn hơn 96);CAN.ERROR_PASSIVE-- bộ điều khiển đang bật và ở trạng thái Lỗi Thụ Động (ít nhất một trong TEC hoặc REC bằng hoặc lớn hơn 128);CAN.BUS_OFF-- bộ điều khiển đang bật nhưng không tham gia vào hoạt động bus (TEC đã tràn quá 255).
- info(list: list | None = None) list¶
Lấy thông tin về trạng thái lỗi của bộ điều khiển và bộ đệm TX và RX. Nếu list được cung cấp thì nó phải là đối tượng danh sách có ít nhất 8 phần tử, sẽ được điền thông tin vào. Nếu không, một danh sách mới sẽ được tạo và điền vào. Trong cả hai trường hợp, giá trị trả về của phương thức là danh sách đã được điền.
Các giá trị trong danh sách là:
Giá trị TEC
Giá trị REC
số lần bộ điều khiển vào trạng thái Cảnh Báo Lỗi (quay vòng về 0 sau 65535)
số lần bộ điều khiển vào trạng thái Lỗi Thụ Động (quay vòng về 0 sau 65535)
số lần bộ điều khiển vào trạng thái Bus Off (quay vòng về 0 sau 65535)
số tin nhắn TX đang chờ
số tin nhắn RX đang chờ trên fifo 0
số tin nhắn RX đang chờ trên fifo 1
- setfilter(bank: int, mode: int, fifo: int, params: Tuple[int, ...], *, rtr: Tuple[bool, ...] | None = None, extframe: bool = False) None¶
Cấu hình một ngân hàng bộ lọc:
bank là ngân hàng bộ lọc bộ điều khiển CAN cổ điển, hoặc chỉ số bộ lọc CAN FD, cần cấu hình.
mode là chế độ mà bộ lọc hoạt động, xem các bảng bên dưới.
fifo là fifo (0 hoặc 1) mà một tin nhắn sẽ được lưu vào, nếu nó được bộ lọc này chấp nhận.
params là một mảng các giá trị định nghĩa bộ lọc. Nội dung của mảng phụ thuộc vào đối số mode.
Nội dung mảng params cho các bộ điều khiển CAN cổ điển (OpenMV Cam M4 / M7):
mode
Nội dung của params
CAN.LIST16Bốn ID 16-bit sẽ được chấp nhận.
CAN.LIST32Hai ID 32-bit sẽ được chấp nhận.
CAN.MASK16Hai cặp id/mask 16-bit, ví dụ:
(1, 3, 4, 4). Cặp đầu tiên (1, 3) chấp nhận tất cả các ID với bit 0 = 1 và bit 1 = 0; cặp thứ hai (4, 4) chấp nhận tất cả các ID với bit 2 = 1.CAN.MASK32Một cặp id/mask 32-bit (ngoài ra giống như
CAN.MASK16).Nội dung mảng params cho các bộ điều khiển CAN FD (OpenMV Cam H7 / H7 Plus / Pure Thermal):
mode
Nội dung của params
CAN.RANGEHai ID tạo thành một dải các ID được chấp nhận.
CAN.DUALHai ID sẽ được chấp nhận (ví dụ:
(1, 2)).CAN.MASKMột cặp
(id, mask)(ví dụ:(0x111, 0x7FF)).rtr Đối với các bộ điều khiển CAN cổ điển, đây là một mảng các giá trị boolean cho biết bộ lọc có chấp nhận tin nhắn yêu cầu truyền từ xa hay không. Nếu đối số này không được cung cấp, mặc định là
Falsecho tất cả các phần tử. Độ dài phụ thuộc vào mode:mode
len(rtr)Ghi chú
CAN.LIST164
CAN.LIST322
CAN.MASK162
CAN.MASK321
Đối với CAN FD, đối số này bị bỏ qua.
extframe Nếu True, khung sẽ có bộ định danh mở rộng (29 bit), ngược lại sẽ sử dụng bộ định danh tiêu chuẩn (11 bit).
- clearfilter(bank: int, extframe: bool = False) None¶
Xóa và vô hiệu hóa một ngân hàng bộ lọc:
bank là ngân hàng bộ lọc bộ điều khiển CAN cổ điển, hoặc chỉ số bộ lọc CAN FD, cần xóa.
extframe Đối với các bộ điều khiển CAN FD, nếu True, xóa một bộ lọc mở rộng (được cấu hình với extframe=True), ngược lại xóa bộ định danh tiêu chuẩn (được cấu hình với extframe=False).
- recv(fifo: int, list: list | None = None, *, timeout: int = 5000) list¶
Nhận dữ liệu trên bus:
fifo là một số nguyên, là FIFO để nhận dữ liệu trên đó
list là một đối tượng danh sách tùy chọn được sử dụng làm giá trị trả về
timeout là thời gian chờ tính bằng mili giây để chờ nhận.
Giá trị trả về: Một danh sách chứa năm giá trị.
ID của tin nhắn.
Một giá trị boolean cho biết ID tin nhắn là tiêu chuẩn hay mở rộng.
Một giá trị boolean cho biết tin nhắn có phải là tin nhắn RTR hay không.
Giá trị FMI (Chỉ Số Khớp Bộ Lọc).
Một mảng chứa dữ liệu.
Nếu list là
Nonethì một danh sách mới sẽ được cấp phát, cũng như một đối tượng bytes mới để chứa dữ liệu (là phần tử thứ năm trong danh sách).Nếu list không phải là
Nonethì nó phải là đối tượng danh sách có ít nhất năm phần tử. Phần tử thứ năm phải là đối tượng memoryview được tạo từ bytearray hoặc mảng kiểu 'B' hoặc 'b', và mảng này phải có đủ chỗ cho ít nhất 8 byte. Đối tượng danh sách sau đó sẽ được điền với bốn giá trị trả về đầu tiên ở trên, và đối tượng memoryview sẽ được thay đổi kích thước tại chỗ theo kích thước dữ liệu và được điền với dữ liệu đó. Cùng một đối tượng danh sách và memoryview có thể được tái sử dụng trong các lần gọi tiếp theo của phương thức này, cung cấp cách nhận dữ liệu mà không sử dụng heap. Ví dụ: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¶
Gửi một tin nhắn trên bus:
data là dữ liệu cần gửi (một số nguyên để gửi, hoặc một đối tượng buffer).
id là ID của tin nhắn cần gửi.
timeout là thời gian chờ tính bằng mili giây để chờ gửi.
rtr là một giá trị boolean xác định xem tin nhắn có được gửi như là một yêu cầu truyền từ xa hay không. Nếu rtr là True thì chỉ độ dài của data được sử dụng để điền vào khe DLC của khung; các byte thực tế trong data không được sử dụng.
extframe nếu True, khung sẽ có bộ định danh mở rộng (29 bit), ngược lại sẽ sử dụng bộ định danh tiêu chuẩn (11 bit).
fdf đối với các bộ điều khiển CAN FD, nếu đặt thành True, khung sẽ có định dạng khung FD, hỗ trợ tải trọng dữ liệu lên đến 64 byte.
brs đối với các bộ điều khiển CAN FD, nếu đặt thành True, chế độ chuyển đổi tốc độ bit được bật, trong đó pha dữ liệu được truyền với tốc độ bit khác nhau. Xem
CAN.init()để biết các tham số cấu hình định thời bit dữ liệu.
Nếu timeout là 0, tin nhắn được đặt vào một bộ đệm trong một trong ba bộ đệm phần cứng và phương thức trả về ngay lập tức. Nếu cả ba bộ đệm đều đang được sử dụng, một ngoại lệ sẽ được ném ra. Nếu timeout khác 0, phương thức chờ cho đến khi tin nhắn được truyền. Nếu tin nhắn không thể được truyền trong thời gian chỉ định, một ngoại lệ sẽ được ném ra.
Giá trị trả về:
None.
- rxcallback(fifo: int, fun: Callable[[CAN, int], None] | None) None¶
Đăng ký một hàm sẽ được gọi khi một tin nhắn được chấp nhận vào một FIFO trống:
fifo là FIFO nhận dữ liệu.
fun là hàm sẽ được gọi khi FIFO trở nên không trống.
Hàm gọi lại nhận hai đối số: đối số đầu tiên là chính đối tượng CAN; đối số thứ hai là một số nguyên cho biết lý do cho hàm gọi lại:
Lý do
Ý nghĩa
0Một tin nhắn đã được chấp nhận vào một FIFO trống.
1FIFO đầy.
2Một tin nhắn đã bị mất do FIFO đầy.
Ví dụ sử dụng 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)
Hằng số¶
Hằng số chế độ bus (đối số
modecủainit()):- NORMAL: int¶
Bộ điều khiển tham gia bình thường trên bus -- truyền các khung của nó và xác nhận các khung đã nhận hợp lệ.
- LOOPBACK: int¶
Chế độ loopback nội bộ: bộ điều khiển bị ngắt kết nối khỏi các chân và định tuyến các khung đã truyền thẳng trở lại đường nhận. Hữu ích cho các bài kiểm tra tự thân mà không cần bộ thu phát.
- SILENT: int¶
Chế độ chỉ lắng nghe: bộ điều khiển nhận các khung nhưng không bao giờ điều khiển bus (không có ACK, không có truyền dẫn). Hữu ích để theo dõi bus.
- SILENT_LOOPBACK: int¶
Kết hợp
SILENTvàLOOPBACK: không có hoạt động chân và không có xác nhận, với loopback nội bộ của TX vào RX.
Hằng số trạng thái bộ điều khiển (được trả về bởi
state()):- ERROR_ACTIVE: int¶
Bộ điều khiển đang bật và ở trạng thái Lỗi Hoạt Động (cả TEC và REC đều nhỏ hơn 96).
- ERROR_WARNING: int¶
Bộ điều khiển đang bật và ở trạng thái Cảnh Báo Lỗi (ít nhất một trong TEC hoặc REC bằng hoặc lớn hơn 96).
- ERROR_PASSIVE: int¶
Bộ điều khiển đang bật và ở trạng thái Lỗi Thụ Động (ít nhất một trong TEC hoặc REC bằng hoặc lớn hơn 128).
Chế độ bộ lọc CAN cổ điển (đối số
modecủasetfilter()trên OpenMV Cam M4 / M7):Chế độ bộ lọc CAN FD (đối số
modecủasetfilter()trên OpenMV Cam H7 / H7 Plus / Pure Thermal):