Toggle navigation
首页
问答
文章
积分商城
专家
专区
更多专区...
文档中心
返回主站
搜索
提问
会员
中心
登录
注册
国民技术_N32G45x
RT-Thread
RT-Thread活动
【N32G457 】基于RT-Thread和N32G457的USB2CAN调试器
1.00
发布于 2022-03-14 23:55:09 浏览:1403
订阅该版
[tocm] ### 介绍 一个简洁方便的的usb2can调试器,可用于can总线数据调试和一般的can总线故障排查。在基于RT-Thread和N32G457的软硬件平台的基础上,使用SLCAN协议配合USB CDC类通信可以实现将can数据转发到PC或者上位机上,供上位机软件进行分析。 #### 主要功能 - 可以实现接收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数据采集分析。 ### 硬件和软件框架 硬件上使用 国民技术提供的N32G45XVL-STB v1.1开发版加上一个TJA1050的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和CAN功能。 - 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的核心代码可移植性更高。 ##### 从软件到硬件 硬件部分实现好后,软件部分通过rtthread的api就可以完成大部分操作了。主要驱动代码和应用层代码,逻辑处理代码。 USB CDC驱动代码,主要是usb cdc的vcom驱动,因为暂时还没有N32G457的usb device驱动能注册到rtdevice去,所以直接用N32G457的SDK提供的例程做出来的USB CDC,然后在此基础上注册一个字符设备vcom到rtdevice框架上,提供对cdc的读写接口。 can驱动,还有就是can驱动。在做这个东西的时候发现没有can驱动,于是参考sdk的例程写了一个驱动注册到rtdevice框架上。 slcan代码,接下来就是最重要的slcan应用层代码了。 应用层代码主要通过一个rt_slcan_t结构体记录slcan的配置和上下文状态。然后通过启动一个线程用来监听vcom和can的数据,接收到数据立马处理。 如果是来自vcom端的数据,是以\r结尾ascii字符串,需要做一个帧完整性判断用来判断是不是接收到完整的一帧ascii字符数据包。接收完整性判断通过后再判断发送的哪些命令,然后根据具体的命令需要发送CAN数据包到CAN控制器的发送到can设备去,需要执行命令的执行命令然后返回ack。 主要的ascii命令格式是 | 第一个字节 | 格式 | 描述 | | ---------- | ----------------------------- | ----------------------- | | t |
| 发送11bit ID的数据帧 | | r |
| 发送11bit ID的远程帧 | | T |
| 发送29bit ID的数据帧 | | R |
| 发送29bit ID的远程帧 | | O |
| 打开can | | C |
| 关闭can | | V |
| 显示版本号 | | N |
| 显示串口号 | | F |
| 读取can状态 | | s |
| 设置can波特率 0 - 8 | | Z |
| 设置ascii数据是否带时间 | **
命令, 1个字节** **
can的id,标准帧3个字节,扩展帧8个字节,hex表示** **
can的dlc数据长度,1个字节,hex表示** **
数据,根据dlc长度从0字节到16字节变化,hex表示** **
时间,4个字节,hex表示** **常见slcan命令示例:** | ascii命令 | 描述 | | ---------------- | ------------------------------------------------ | | t123166 | 标准canid 0x123, 长度1, 数据 0x66 | | T123456783112233 | 扩展canid 0x12345678, 长度3, 数据 0x11 0x22 0x33 | | r1260 | 标准canid 0x126, 长度 0, 远程请求帧 | | T12345679 | 扩展canid 0x12345679, 长度0, 远程请求帧 | 如果是来自can设备端的数据,就直接打包成ascii通过vcom发送出去就可以了。 软硬件架构图 ![rtt-n32-slcan.jpg](https://oss-club.rt-thread.org/uploads/20220316/48180c69916587bf238b41472d43939d.jpg.webp) slcan逻辑图 ![rt-n32-slcan-loop.jpg](https://oss-club.rt-thread.org/uploads/20220317/47cbb3d630b67ac876e8fda08d0b1f05.jpg.webp) ### 演示图片 使用串口工具直接打开串口,就可以看到can总线发送的数据,并且已经十六进制ascii格式,很方便阅读。发送数据到can总线也只需要按格式发送即可,每个命令结尾必须是0x0d。 ![QQ20220317224933.jpg](https://oss-club.rt-thread.org/uploads/20220317/bb2c7573604008eb92f8d9f5330604c9.jpg.webp) python程序采集can数据。 通过python-can库可以很方便打开slcan协议的设备获取数据,还可以将采集到的数据保存到日志文件中。脚本放在git仓库的test目录,安装号库就可以使用了。 ```python import can import threading import time import random def print_message(msg): print(msg) if __name__ == "__main__": # RX part #bus_rx = can.interface.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() ``` ![QQ20220317225728.jpg](https://oss-club.rt-thread.org/uploads/20220317/05b5f1205a023618d4964fa129dcde73.jpg.webp) ### 演示视频 https://www.bilibili.com/video/BV1iT4y1U7wJ/ ### 代码地址 gitee仓库地址 https://gitee.com/cazure/n32g457vel7-usb2can
3
条评论
默认排序
按发布时间排序
登录
注册新账号
关于作者
文武斌
这家伙很懒,什么也没写!
文章
6
回答
74
被采纳
2
关注TA
发私信
相关文章
1
(苏州站)RT-Thread物联网开发者沙龙【已结束】
2
(成都站)RT-Thread物联网开发者沙龙
3
(深圳站)RT-Thread物联网开发者沙龙
4
(西安站)RT-Thread物联网开发者沙龙
5
成都站2018 RT-Thread开发者沙龙回顾及PPT下载
6
2018 RT-Thread物联网开发者沙龙(北京站)
7
2018 RT-Thread物联网开发者沙龙(南京站)
8
第十三届研电赛RT-Thread企业专项奖发布通知
9
RT-Thread应用作品征集大赛开始啦!
10
你的投票将决定RT-Thread官网应该优先准备的文档是哪些
推荐文章
1
RT-Thread应用项目汇总
2
玩转RT-Thread系列教程
3
国产MCU移植系列教程汇总,欢迎查看!
4
机器人操作系统 (ROS2) 和 RT-Thread 通信
5
五分钟玩转RT-Thread新社区
6
【技术三千问】之《玩转ART-Pi》,看这篇就够了!干货汇总
7
关于STM32H7开发板上使用SDIO接口驱动SD卡挂载文件系统的问题总结
8
STM32的“GPU”——DMA2D实例详解
9
RT-Thread隐藏的宝藏之completion
10
【ART-PI】RT-Thread 开启RTC 与 Alarm组件
热门标签
RT-Thread Studio
串口
Env
LWIP
SPI
AT
Bootloader
Hardfault
CAN总线
FinSH
ART-Pi
USB
DMA
文件系统
RT-Thread
SCons
RT-Thread Nano
线程
MQTT
STM32
RTC
FAL
rt-smart
ESP8266
I2C_IIC
WIZnet_W5500
UART
ota在线升级
PWM
cubemx
freemodbus
flash
packages_软件包
BSP
潘多拉开发板_Pandora
定时器
ADC
GD32
flashDB
socket
中断
Debug
编译报错
msh
SFUD
rt_mq_消息队列_msg_queue
keil_MDK
ulog
MicroPython
C++_cpp
本月问答贡献
a1012112796
20
个答案
3
次被采纳
张世争
12
个答案
3
次被采纳
踩姑娘的小蘑菇
7
个答案
3
次被采纳
用户名由3_15位
13
个答案
2
次被采纳
rv666
9
个答案
2
次被采纳
本月文章贡献
程序员阿伟
9
篇文章
2
次点赞
hhart
3
篇文章
4
次点赞
RTT_逍遥
1
篇文章
7
次点赞
大龄码农
1
篇文章
5
次点赞
ThinkCode
1
篇文章
1
次点赞
回到
顶部
发布
问题
投诉
建议
回到
底部