English/中文
本项目的开发目的是为了给英特尔® NUC及其它x86架构的平台提供一个CAN (Controller Area Network)的外设接口。由于NUC及大部分x86不具有SPI等简单外设接口,故无法使用MCP2515等SPI (Serial Peripheral Interface) 转CAN芯片。为此,本项目基于github的开源方案candleLight开发,采用STM32F072CBT6作为主控芯片,实现USB (Universal Serial Bus) 转CAN的功能。STM32F072CBT6具有能够同时工作的USB全速外设和CAN外设,封装为QFP64 (Quad Flat Package),是较为优秀的解决方案。下图为Intel NUC与USB2CAN连接实物图。
- EDA工具: Altium Designer 20.0.13
- 编译工具: gcc-arm-none-eabi 8-2019-q3-update
- 烧录工具: STM32CubeProgrammer v2.6.0
- bom:三个不同版本的USB2CAN物料表单。
- candlelight:github开源方案candleLight的仓库。
- circuit:用Altium Designer设计的电路原理图及PCB源文件。
- gerber:三个不同版本的USB2CAN制造文件。
- image:README中的图片。
- firmware.bin:编译好的程序二进制文件。
注意:circuit文件夹下的PCB和原理图是示例电路,直接用它制造生产结果不是图示的产品。若想直接复现图示版本,请用gerber文件夹下的生产文件。
USB HUB电路设计:由于整车需要至少2路CAN总线来保证电机回传数据包的完整性,所以我们采用了GL850G作为USB HUB芯片实现USB一拖四的方案。另外,我们还通过使用施密特触发器来实现上电时序,保证USB设备枚举的顺序在每次上电后都是一致的。
USB转CAN电路设计:用STM32F072CBT6实现USB转CAN功能。CAN电平转换芯片采用MAX3051EKA芯片,该芯片使用3.3V供电,且封装为SOT23-8 (Small Outline Transistor),为PCB小型化提供了基础。图中的R6、R7电阻用途为更改STM32的Boot模式,从而使STM32能够通过更改R6、R7的短接模式而在DFU (Device Firmware Upgrade) 烧录模式与Flash模式下切换,方便烧录固件。
- 所有USB总线需要设置成差分对,在布线时严格遵循差分信号布线规则。
- 所有CAN总线需要设置成差分对,在布线时严格遵循差分信号布线规则。
- 晶振和谐振电容底部最好挖空不铺铜。
- 电源线线宽应尽量大于0.3mm以保证电源轨道不塌陷。
我们提供了三个不同版本的Gerber文件用于生产,分别是扩展:两路CAN+UART+DBUS、四路CAN、UART+DBUS。这三种版本的电路均采用两层PCB进行设计,面积约为20*30mm。你可以直接将打包好的gerber文件提交个生产厂家(如:嘉立创)进行生产。
你可以在此处找到该板对应的BOM (Bill Of Material) 表,并且依据这张表格将元器件焊接到已经制作好的PCB上。焊接完成后,请仔细检查是否有引脚之间有残余的焊锡,那将会导致电路板发生短路,同时你还要检查引脚是否有虚焊的现象发生。
焊接完成后,用万用表检查5V电源接口与GND之间是否短路、3.3V电源输出与GND之间是否短路。当确保上述情况没有出现时,再将板子连接电脑的USB口,此时应该可以看到板上的电源指示灯亮起,并且电脑能够识别到USB HUB芯片。
注意:请勿同时焊接用于切换STM32下载模式的上/下拉电阻,那样有可能使电源与GND之间出现短路!
你可以点击此处下载已经编译好的固件,或者是跟随candleLight文档自行编译固件。最终你会得到.bin文件,我们使用STM32CubeProgrammer来将固件通过USB烧录到STM32中。下面展示了下载固件的步骤:
- 将STM32上BOOT0引脚的下拉电阻取下,焊接上上拉电阻。
- 将板子连接到电脑的USB口中,打开STM32CubeProgrammer。
- 在STM32CubeProgrammer中点击下图所示的三个按钮,搜寻可用的STM32设备。
- 连接成功后点击“Read”按钮以读取固件,选择准备好的固件。
- 点击“Download”以下载固件。下载成功后,可以看到成功的标识。
- 将STM32上BOOT0引脚的上拉电阻取下,焊接上下拉电阻。此时再重新上电,固件将在STM32上开始运行。
- 安装依赖软件包:
$ sudo apt-get update && sudo apt-get -y upgrade
$ sudo apt-get install -y can-utils net-tools
- 查看是否检测到CAN设备:
$ ifconfig -a
# 如果在列表中发现含有can名称的设备就说明该设备可以被识别到了
- 用直连线将两个CAN口连接起来,便于进行回环测试。
- 初始化CAN0和CAN1设备,比特率为1Mbits:
$ sudo ip link set can0 up type can bitrate 1000000
$ sudo ip link set can1 up type can bitrate 1000000
- 打开一个新终端用于监测can0接收到的信息:
$ candump can0
- 在一个终端中使用can1发送信息:
$ cansend can1 200#5A5A5A5A5A5A5A5A
若能在监测can0的终端中看到can1发来的信息如下,说明通信成功,模块工作正常。
can0 200 [8] 5A 5A 5A 5A 5A 5A 5A 5A
源代码根据MIT条款许可证发布。
组织:DynamicX
维护人:朱彦臻, [email protected]
该产品已经在Ubuntu 18.04和20.04下进行了测试。这是一个研究代码,希望它经常更改,并且不承认任何特定用途的适用性。