查看: 1624|回复: 0

[评测分享] 【NXP OKdo E1双核Cortex M33开发板 】免晶振USB

[复制链接]

该用户从未签到

发表于 2020-11-22 21:20:44 | 显示全部楼层 |阅读模式
分享到:
本帖最后由 文波_苏州 于 2020-11-22 21:55 编辑

OKDO E1的开发板上有两个USB口,一个标注为"DEBUG",接到LPC11U35F上用于下载调试。另一个标注着"USER"的连到LPC55S69的USB0端口,可以用来开发用户应用。通过板上的两个跳线电阻的不同接法,也可以改为连接到USB1端口。

LPC55S69的USB0是全速端口,USB1是高速端口,那OKDO E1为什么不默认连到USB1上呢?毕竟USB1可以向下兼容全速。其实这样连是还是有一定道理的--LPC55S69支持免晶振全速USB。

注意到OKDO E1默认并没有焊接16MHz的高精度外部晶振,而内部RC晶振只在出厂时校准到了+/-2%。这就没法满足全速USB 12 Mbps +/- 0.25%的要求,在以前的LPC系列应用笔记中https://www.nxp.com.cn/docs/en/application-note/AN11392.pdf:

Clock circuit
When using a full-speed USB peripheral, it is important to use an external crystal, or a tight frequency tolerance ceramic resonator, for the timing element. The internal 12 MHz ±1 % RC oscillator, while very accurate, does not have the accuracy required for USB. The USB peripheral operates at a clock frequency of 48 MHz, so the crystal must be chosen such that a multiple of its frequency is equal to 48 MHz. A parallel resonant 12 MHz crystal with a data signaling tolerance of 0.25 %, or ±2500 ppm is required.

好在LPC55S69提供了crystal less全速USB,该设计可利用USB全速协议中主机方SOF包对内部FRO进行校准,这样不需要使用外部晶振,也能满足时钟精度的要求。甚至可以设想,在工控等环境严苛温度变化剧烈的场合,如果主机的时钟发生了一定的偏移,crystal less动态跟踪的特性反而可能使设计更为健壮。这样看来,OKDO E1的默认接法省掉一颗晶振的同时方便以crystal less的方式实现USB全速的各种功能。而如果要实现一些高速USB的应用,才有必要找一颗晶振焊上,顺便就可以两个跳线电阻改为连接USB1端口。

目前我还没有一定要使用高速USB的应用,所以暂时不用动烙铁。先到恩智浦的网站上下载免晶振USB的参考设计:
https://www.nxp.com/docs/en/application-note-software/TN00063.zip

下载解压后,按照文档的指示,到SDK_2.6.2_LPCXpresso55S69_RFP20_RC1/boards/lpcxpresso55s69/usb_examples/usb_device_composite_hid_audio_unified/bm/cm33_core0/armgcc下, 执行:
Screen Shot 2020-11-22 at 2.04.11 AM.png


编译成功后,在debug文件夹下出现了一个"dev_composite_hid_audio_unified_bm.elf"文件。 用pyocd把它烧写到OKDO板上,并把“USER”口和电脑连起来,主机声音设置毫无反应。在Terimial输入“system_profiler SPUSBDataType | grep -B3 "Vendor ID", 可以看到同一个hub下面LPC11U3x被成功识别,但没有其他USB被识别出来。看来这个例子不是开箱即用的。

按照文档中2.3 Source code modifications的提示,看下源代码。
首先检查fro_calib_Get_Lib_Ver()函数是否被调用,发现它出现在了composite.c 426行但是该函数并没有被编译进可执行文件中,USB_DEVICE_FRO_CAL_LIBRARY_ENABLE, USB_DEVICE_SOF_EVENT_ENABLE两个编译开关并未定义。

于是修改CMakeList.txt,加入:
add_compile_definitions(USB_DEVICE_FRO_CAL_LIBRARY_ENABLE=1)

再编译,fro_calib_Get_Lib_Ver()被成功编译进去了,但链接阶段提示出现了7个“undefined reference“,看来是有些依赖还是没有成功链接,查找这些函数出现的地方,在CMakeList.txt再加入
"${ProjDirPath}/../../../../../../../devices/LPC55S69/drivers/fsl_ctimer.c"
"${ProjDirPath}/../../../../../../../devices/LPC55S69/drivers/fsl_ctimer.h"

以及:
link_directories(${ProjDirPath}/../../../../../../../devices/LPC55S69/gcc)

target_link_libraries(dev_composite_hid_audio_unified_bm.elf debug ${ProjDirPath}/../../../../../../../devices/LPC55S69/gcc/libfro_calib_hardabi.a)


link_directories(${ProjDirPath}/../../../../../../../devices/LPC55S69/gcc)

target_link_libraries(dev_composite_hid_audio_unified_bm.elf debug ${ProjDirPath}/../../../../../../../devices/LPC55S69/gcc/libfro_calib_softabi.a)

这次链接就成功了。再进行烧写,还是没有被主机识别。挂上gdb一看,程序一直在函数CLOCK_SetPLL0Freq 的一个while循环中,原来composite.c里的main函数中还是把PLL0挂在了16M的外部晶振上。
Screen Shot 2020-11-22 at 4.08.22 AM.png

先把相关的代码注释掉,看看能不能跑下去。
Screen Shot 2020-11-22 at 4.19.58 AM.png

Screen Shot 2020-11-22 at 4.20.12 AM.png


重新编译烧写后复位,发现USB设备已经被成功识别了。
Screen Shot 2020-11-22 at 4.33.53 AM.png

不过,我们到目前只是得到了一个USB的静音按钮,下一步是让它真正发出点声音。

CMakeLists.txt

23.57 KB, 下载次数: 3

回复

使用道具 举报

您需要登录后才可以回帖 注册/登录

本版积分规则

关闭

站长推荐上一条 /4 下一条

手机版|小黑屋|与非网

GMT+8, 2024-11-27 08:42 , Processed in 0.121767 second(s), 17 queries , MemCache On.

ICP经营许可证 苏B2-20140176  苏ICP备14012660号-2   苏州灵动帧格网络科技有限公司 版权所有.

苏公网安备 32059002001037号

Powered by Discuz! X3.4

Copyright © 2001-2024, Tencent Cloud.