Toggle navigation
首页
问答
文章
积分商城
专家
专区
更多专区...
文档中心
返回主站
搜索
提问
会员
中心
登录
注册
NXP 微控制器
NXP-MCXN236
NXP MCXN236测评-USB
发布于 2024-07-14 12:40:42 浏览:382
订阅该版
[tocm] # USB硬件概览 MCXN236系列集成了一个USB2.0 High Speed的主控,支持OTG,并集成了一个USB2.0 High Speed兼容的 PHY。USBHS主控有8个bidirectional endpoints,支持charger detection,并支持低功耗local/remote唤醒,控制器里自带DMA。USBHS主控和PHY在OD(Over Drive)、SD(Standard Drive)模式下可工作,在MD(Mid Drive)模式下不工作。主控在手册和官方SDk里也称为OTG1 port。 # MCXN236 RT-Thread usb协议栈选择考量 RT-Thread其实有三个usb协议栈可选,分别是原RT-Thread自带的usb协议栈,目前已经移入components/legacy/usb/目录下;cherryusb,当前已成为RT-Thread默认usb协议栈,性能不错;tinyusb支持众多的mcu中的usb ip,反馈良好,使用广泛。 为完成测评其实笔者最简单省力的方法是照着大牛的测评路子https://club.rt-thread.org/ask/article/b1d932d3dff1ca6a.html 稍许改下其代码即可使用,但有两原因笔者不想走这个思路测评:一想挑战一下自己,二这篇文章用的是原RT-Thread自带的usb协议栈,目前已经是legacy状态,也就是说长远来看要废弃。剩下的选择就是cherryusb和tinyusb了,按理应该选cherryusb,但笔者仔细阅读cherryusb和tinyusb源码发现目前cherryusb应该还不支持MCXN236的USB IP,给cherryusb增加MCXN236的支持工作量还是不小的,已远远超出测评范围;另一方面,tinyusb主线已经支持MCXN947,笔者非 常喜欢这一点,根据上述章节的硬件概述,再阅读NXP官方MCXN947文档的USB章节,笔者基本肯定MCXN236的USBHS主控和MCXN947的USBHS主控是兼容的。注意:MCXN947还有一个USBFS的主控,但MCXN236芯片 中没有这个控制器 # MCXN236 RT-Thread tinyusb移植 慢着,不是说MCXN236的USBHS控制器和MCXN947的USBHS控制器兼容么,要移植做啥?原因在于tinyusb主线确实支持MCXN947,但RT-Thread的tinyusb包比较老了,所以需要一个和主线tinyusb的适配过程。整 个适配过程包括主线tinyusb的修改和RT-Thread MCXN236板级适配。 ## 主线tinyusb的修改 主要是修改tinyusb源码中rt-thread相关的SConscript和tusb_config.h,在此之前请先clone主线tinyusb。 ```bash git clone https://github.com/hathach/tinyusb.git ``` 修改之 ```c diff --git a/lib/rt-thread/SConscript b/lib/rt-thread/SConscript index 34399fd45..b248237db 100644 --- a/lib/rt-thread/SConscript +++ b/lib/rt-thread/SConscript @@ -27,6 +27,9 @@ if GetDepend(["PKG_TINYUSB_DEVICE_ENABLE"]): src += ["../../src/portable/renesas/rusb2/dcd_rusb2.c", "../../src/portable/renesas/rusb2/rusb2_common.c"] + if GetDepend(["SOC_MCX"]): + src += ["../../src/portable/chipidea/ci_hs/dcd_ci_hs.c"] + # Device class if GetDepend(["PKG_TINYUSB_DEVICE_UVC"]): src += ["../../src/class/video/video_device.c"] diff --git a/lib/rt-thread/tusb_config.h b/lib/rt-thread/tusb_config.h index 11dc21983..3b393bb33 100644 --- a/lib/rt-thread/tusb_config.h +++ b/lib/rt-thread/tusb_config.h @@ -66,6 +66,8 @@ extern "C" { #define CFG_TUSB_MCU OPT_MCU_RP2040 #elif defined(SOC_FAMILY_RENESAS) #define CFG_TUSB_MCU OPT_MCU_RAXXX +#elif defined(SOC_MCX) +#define CFG_TUSB_MCU OPT_MCU_MCXN9 #else #error "Not support for current MCU" #endif ``` ## tinyusb芯片级与板级适配 ### usb phy驱动 主要是两个文件usb_phy.c和usb_phy.h,可从sdk中拷贝过来 ### drv_tinyusb.c 主要做两件事 1.实现usb的芯片和板级初始化相关的,代码如下 ```c int tusb_board_init(void) { // Port1 is High Speed // Power SPC0->ACTIVE_VDELAY = 0x0500; /* Change the power DCDC to 1.8v (By default, DCDC is 1.8V), CORELDO to 1.1v (By default, CORELDO is 1.0V) */ SPC0->ACTIVE_CFG &= ~SPC_ACTIVE_CFG_CORELDO_VDD_DS_MASK; SPC0->ACTIVE_CFG |= SPC_ACTIVE_CFG_DCDC_VDD_LVL(0x3) | SPC_ACTIVE_CFG_CORELDO_VDD_LVL(0x3) | SPC_ACTIVE_CFG_SYSLDO_VDD_DS_MASK | SPC_ACTIVE_CFG_DCDC_VDD_DS(0x2u); /* Wait until it is done */ while (SPC0->SC & SPC_SC_BUSY_MASK) {} if (0u == (SCG0->LDOCSR & SCG_LDOCSR_LDOEN_MASK)) { SCG0->TRIM_LOCK = 0x5a5a0001U; SCG0->LDOCSR |= SCG_LDOCSR_LDOEN_MASK; /* wait LDO ready */ while (0U == (SCG0->LDOCSR & SCG_LDOCSR_VOUT_OK_MASK)); } SYSCON->AHBCLKCTRLSET[2] |= SYSCON_AHBCLKCTRL2_USB_HS_MASK | SYSCON_AHBCLKCTRL2_USB_HS_PHY_MASK; SCG0->SOSCCFG &= ~(SCG_SOSCCFG_RANGE_MASK | SCG_SOSCCFG_EREFS_MASK); /* xtal = 20 ~ 30MHz */ SCG0->SOSCCFG = (1U << SCG_SOSCCFG_RANGE_SHIFT) | (1U << SCG_SOSCCFG_EREFS_SHIFT); SCG0->SOSCCSR |= SCG_SOSCCSR_SOSCEN_MASK; while (1) { if (SCG0->SOSCCSR & SCG_SOSCCSR_SOSCVLD_MASK) { break; } } // Clock SYSCON->CLOCK_CTRL |= SYSCON_CLOCK_CTRL_CLKIN_ENA_MASK | SYSCON_CLOCK_CTRL_CLKIN_ENA_FM_USBH_LPT_MASK; CLOCK_EnableClock(kCLOCK_UsbHs); CLOCK_EnableClock(kCLOCK_UsbHsPhy); CLOCK_EnableUsbhsPhyPllClock(kCLOCK_Usbphy480M, 24000000U); CLOCK_EnableUsbhsClock(); // USB PHY #if ((!(defined FSL_FEATURE_SOC_CCM_ANALOG_COUNT)) && (!(defined FSL_FEATURE_SOC_ANATOP_COUNT))) USBPHY->TRIM_OVERRIDE_EN = 0x001fU; /* override IFR value */ #endif // Enable PHY support for Low speed device + LS via FS Hub USBPHY->CTRL |= USBPHY_CTRL_SET_ENUTMILEVEL2_MASK | USBPHY_CTRL_SET_ENUTMILEVEL3_MASK; // Enable all power for normal operation USBPHY->PWD = 0; // TX Timing uint32_t phytx = USBPHY->TX; phytx &= ~(USBPHY_TX_D_CAL_MASK | USBPHY_TX_TXCAL45DM_MASK | USBPHY_TX_TXCAL45DP_MASK); phytx |= USBPHY_TX_D_CAL(0x04) | USBPHY_TX_TXCAL45DP(0x07) | USBPHY_TX_TXCAL45DM(0x07); //phytx |= USBPHY_TX_D_CAL(0x0C) | USBPHY_TX_TXCAL45DP(0x06) | USBPHY_TX_TXCAL45DM(0x06); USBPHY->TX = phytx; return 0; } ``` 2.中断的处理,代码如下 ```c void USB1_HS_IRQHandler(void) { rt_interrupt_enter(); #ifdef PKG_TINYUSB_DEVICE_ENABLE tud_int_handler(1); #endif #ifdef PKG_TINYUSB_HOST_ENABLE tuh_int_handler(1); #endif rt_interrupt_leave(); } ``` ### hid_example.c与cdc_example.c 可从其它proj拷贝过来,比如vision board的proj # FRDM-MCXN236 USB实践 虽然不用RT-Thread的tinyusb包,但需要用它引入的env。在目录bsp/nxp/mcx/mcxn/frdm-mcxn236执行 ```bash scons --menuconfig ``` ```bash RT-Thread online packages ---> system packages ---> TinyUSB: an open source cross-platform USB stack for embedded system ---> ``` 这里请按图所示选择配置tinyusb ![2.jpg](https://oss-club.rt-thread.org/uploads/20240714/98814c1184e5f213e13d607997627556.jpg.webp) Using USB device ---> 这里请按图配置USB device相关选项 ![3.jpg](https://oss-club.rt-thread.org/uploads/20240714/9b68591feaa5c5c52795f02175361f57.jpg.webp) 注意这里不用下载RT-Thread的tinyusb包,而是在bsp/nxp/mcx/mcxn/frdm-mcxn236/packages/目录创建到已clone下来的主线tinyusb的软链接 ```bash ln -s PATH_TO_tinyusb . ``` 编译烧录后在msh下,会有hid_example和cdc_example两个命令可用,请用usb线缆连接FRDM-MCXN236开发板的另一USB端口和PC机USB端口,测试方法如下: ## hid_example msh执行hid_example命令,PC主机鼠标画圆,并且PC主机上会敲入Win+R快捷键、notepad、回车和“This is RT-Thread TinyUSB demo.” ## cdc_example 请在PC机上打开串口终端软件,连接FRDM-N236开发板虚拟出来的ttyACM端口。msh执行cdc_example命令,PC串口终端中尝试输入一些字符,会看到输入的字符被回显。
3
条评论
默认排序
按发布时间排序
登录
注册新账号
关于作者
rvcore
这家伙很懒,什么也没写!
文章
10
回答
9
被采纳
1
关注TA
发私信
相关文章
1
试贴-消灭0主题
2
LPC M4的一些资料
3
LPC4088的临时分支
4
lpc1788 ad 不稳定
5
1788 LCD控制器缓冲区字节问题
6
一起来学习LPC4088吧
7
上传LPC4088的realtouch主工程
8
RealBoard 4088预定帖 [第一批板子不多,预定提前结束]
9
晒RealBoard LPC4088开箱照啦,速带小板凳前来围观
10
4088主程序需要的SD卡资源
推荐文章
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
UART
WIZnet_W5500
ota在线升级
freemodbus
PWM
flash
cubemx
packages_软件包
BSP
潘多拉开发板_Pandora
定时器
ADC
flashDB
GD32
socket
中断
编译报错
Debug
SFUD
rt_mq_消息队列_msg_queue
msh
keil_MDK
ulog
C++_cpp
MicroPython
本月问答贡献
a1012112796
10
个答案
1
次被采纳
踩姑娘的小蘑菇
4
个答案
1
次被采纳
红枫
4
个答案
1
次被采纳
张世争
4
个答案
1
次被采纳
Ryan_CW
4
个答案
1
次被采纳
本月文章贡献
catcatbing
3
篇文章
5
次点赞
YZRD
2
篇文章
5
次点赞
qq1078249029
2
篇文章
2
次点赞
xnosky
2
篇文章
1
次点赞
Woshizhapuren
1
篇文章
5
次点赞
回到
顶部
发布
问题
投诉
建议
回到
底部