作者:文武
文章链接:介绍
主要功能
可以实现接收can总线数据收发功能,从can总线发送到usb上位机或者从usb上位机发送到can总线。
可以设置can波特率,支持扩展帧和远程帧。
slcan通用协议,ascii字符可以直接通过串口查看数据,linux工具can-utils中的slcan_attach、slcand、slcanpty可以直接驱动此协议转换成linux下的socketcan。
usb cdc免驱可以实现win10、linux即插即用。
同时还有 python-can 、cantact-app等多种工具实现can数据采集分析。
硬件 | 描述 |
芯片型号 | N32G457VEL7 |
CPU | ARM Cortex M4 |
主频 | 144M 180DMIPS |
片内SRAM | 144K |
片内FLASH | 512K |
串口 | 7路 (UART4路 USART3路) |
USB | 全速USB 2.0接口 |
CAN | 2路 CAN 2.0A/B总线接口 |
USB作为USB device设备,实现一个全速的usb cdc功能,再通过rtthread的device框架注册成为一个字符设备 vcom 。上层应用可以通过vcom设备直接与PC上位机通信。
CAN接口,原本N32G457应该有两路can接口,但是由于使用了usb device,can1和usb是公用fifo和中断号的所以没法同时使用。所以只使用了can2,同样can2也是注册到rtthread的device框架上的。可以直接通过rtdevice的api进行读写配置波特率等操作,这也方便后面的slcan进行配置can参数。同时slcan的核心代码可移植性更高。
第一个字节 | 格式 | 描述 |
t | <cmd> <id> <dlc> <data><time> | 发送11bit ID的数据帧 |
r | <cmd> <id> <dlc><time> | 发送11bit ID的远程帧 |
T | <cmd> <id> <dlc> <data><time> | 发送29bit ID的数据帧 |
R | <cmd> <id> <dlc><time> | 发送29bit ID的远程帧 |
O | <cmd> | 打开can |
C | <cmd> | 关闭can |
V | <cmd> | 显示版本号 |
N | <cmd> | 显示串口号 |
F | <cmd> | 读取can状态 |
s | <cmd><value> | 设置can波特率 0 - 8 |
Z | <cmd><value> | 设置ascii数据是否带时间 |
ascii命令 | 描述 |
t123166 | 标准canid 0x123, 长度1, 数据 0x66 |
T123456783112233 | 扩展canid 0x12345678, 长度3, 数据 0x11 0x22 0x33 |
r1260 | 标准canid 0x126, 长度 0, 远程请求帧 |
T12345679 | 扩展canid 0x12345679, 长度0, 远程请求帧 |
python程序采集can数据。通过python-can库可以很方便打开slcan协议的设备获取数据,还可以将采集到的数据保存到日志文件中。脚本放在git仓库的test目录,安装号库就可以使用了。 复制
import can
import threading
import time
import random
def print_message(msg):
print(msg)
if __name__ == "__main__":
# RX part
#bus_rx = can.inteRF ace.Bus('virtual_ch', bustype='virtual')
canbus = can.interface.Bus('COM32', bustype='slcan')
logger = can.Logger("logfile.asc") # save log to asc file
listeners = [
print_message, # Callback function, print the received messages
logger, # save received messages to asc file
]
notifier = can.Notifier(canbus, listeners)
running = True
while running:
input()
running = False
# It's important to stop the notifier in order to finish the writting of asc file
notifier.stop()
# stops the bus
canbus.shutdown()
演示视频 https://www.bilibili.com/video/BV1iT4y1U7wJ/ 代码地址 gitee仓库地址https://gitee.com/cazure/n32g457vel7-usb2can