项目介绍
本项目使用NXP MCXN947作为主控,选择的任务是USB多协议HUB
项目详情
USB多协议HUB本质上就是把MCXN947作为“网关”,上游作为USB Device连接到电脑的USB接口上,下游通过UART或者CAN总线连接到其他设备,这样便于多个设备的统一管理和控制,我们日常生活中见到的USB CAN盒子和多路串口盒子都是这种形式,本任务的“多协议”HUB在此基础上进一步延伸,目的是实现CAN和UART两种不同通讯接口的支持。
设计思路
1. MCXN947有1个USB HS和1个USB FS,均支持主机和设备两种模式,开发板上使用的是HS,本项目就使用此接口连接电脑进行通讯。
2. 开发板与主机进行USB通讯的实现方法有很多,HID/CDC/自定义都可以满足项目需求,本项目使用2个CDC来构成一个USB Composite设备,其中一个CDC用作UART数据收发,另外一个用于CAN数据收发,两者互不干扰,以实现高效率传输。
3. 项目使用主流的FreeRTOS操作系统,分别给USB通讯 UART通讯 CAN通讯创建了独立的Task,以便于调试开发和后续维护
4. UART和CAN通讯使用中断传输,收到外设中断后,在中断回调函数里使用FreeRTOS里的Task-notifications机制通知Task解除阻塞状态,该机制可以比信号量,消息队列等方式的速度快45%,使用的RAM也更少。该机制的详细介绍参考此链接:https://freertos.org/zh-cn-cmn-s/Documentation/02-Kernel/02-Kernel-features/03-Direct-to-task-notifications/01-Task-notifications
5. 由于使用开发板使用的是USB CDC Composite模式,因此PC端可以不用再开发上位机,使用普通的串口助手即可。
硬件介绍
芯片介绍
- 1. Arm®Cortex®-M33@150MHz(双核)
- 2. 高达2MB的片上闪存(2个1MB Bank)
- 3. 4个16位ADC(单端)或2个16位(差分)
- 4. 3个功率放大器
- 5. 丰富的定时器
- 6. USB高速接口+HS PHY
- 7. USB全速接口(主机/设备),带片上FS PHY
- 8. 10个LP Flexcomm,每个都支持SPI、I2C、UART
- 9. 1个具有QoS的以太网接口
- 10. 电机控制子系统
开发板介绍
开发板的主要特征如下:
- 1. 板载MCU-Link (支持调试和串口 非常方便)
- 2. 以太网接口
- 3. USB HS接口
- 4. CAN收发器和CAN接口
- 5. FlexIO 摄像头接口
- 6. 按键 LED
PCB LayOut
采用4层板布局,非常规整,标识清晰,大厂作风
需要注意的是 P1_10和P1_11的IO口有功能复用,如果用作CAN通讯,则需要把板子背面的SJ16和SJ26跳线正确短接,否则无法进行CAN通讯(原理图上描述的是默认复用到CAN通讯 我收到的板子只短接了一个)
设备连接
开发过程
程序流程
如上图所示,本项目使用FreeRTOS管理多个任务,其中Uart Task负责串口数据收发,Can Task负责Can数据收发 USB Task负责与PC双向通讯 并于上述其他两个Task进行数据交互 各个模块的具体开发过程中及注意事项如下:
工程配置
- 创建can_transfer.c/.h uart_transfer.c/.h4个文件,并在Project/armgcc/CMakeList.txt里添加这4个文件
- Project/gcc/config.cmake添加uart can相关的驱动模块
- Pin Mux添加Can和Uart相关的Pin Mux配置
UART模块开发
- Uart模块是在串口中断Demo的基础上进行开发,新增3个接口供其他模块调用 串口的配置过程不过多赘述
- 串口中断里通过Notify的方式通知Task读取串口数据
- Uart Task里获取串口收到的消息 并通过全局变量通知USB 模块发送给上游
- USB收到PC发给串口的数据后,通过uart_tx_send接口发送到串口
注意事项
- 需要在初始化的时候配置串口的中断优先级 否则在串口中断回调里无法完成释放信号量等的操作
- 需要在各个模块都初始化完成之后再按需要创建Task,避免出现其他问题
CAN模块开发
- CAN模块是在CAN中断Demo的基础上进行开发,CAN的配置过程不做过多赘述,新增3个接口供其他模块调用
- CAN中断里通过Notify的方式通知CAN Task处理收到的数据
- Can Task收集数据,并通过全局变量通知USB 模块发送数据给上游
- USB收到PC发给CAN的数据后 通过can_tx_send接口发送can 数据
注意事项
- 需要确保CAN的跳线正确连接
- 与串口模块类似,需要在初始化的时候配置中断优先级
USB模块开发
- USB模块是在CDC Freertos demo的基础上进行开发,usb配置本文不做过多赘述,其中compose.c作为整个项目的框架文件,virtual_com.c作为usb通讯的处理模块
- 本项目使用2个cdc设备 当前是把instance 0作为can instance 1作为串口与PC上位机通讯 主要逻辑当USB 收到来自PC下发的数据 就把数据拷贝到对应的外设buffer里去,并发送出去 当收到来自外设task的信号之后,把外设收到的数据通过USB 对应的instance 发送给PC 完成通讯
- PC下发CAN数据的处理流程
- CAN数据上传到USB的流程
注意事项
处理完USB收到的数据之后 如果没有实际要回复的数据,则需要手动回复一组为0的数据,否则USB接收不到下一次消息
系统联调
- 设置时钟和中断优先级
- 模块和task启动
功能展示
- 设备管理器出现2个CDC设备 并且从USB 分析软件里可以看出USB设备的详细信息 其中COM3是USB转串口 用于做串口通讯实验 COM7 COM8是MCXN产生的2个CDC设备
- CAN盒子使用广成科技的USBCAN-II Pro
- 系统启动
- USB 2 CAN USB 2 UART CAN 2 USB UART 2 USB 均正常通讯
心得体会
- MCXN947硬件非常强大,目前也只用了一个核心,双核工作需要进一步探索
- 开发过程中需要细心,CAN开始无法通讯,还是查看PCB才发现跳线没接正确
- MCUX VSCode的开发非常舒服,点赞!
- Funpack的活动非常赞,能接触到各个厂商的芯片,对于能力提升很有帮助 这是我参加的第二期 后续会多多参加