This thread has been locked.
If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.
工具/软件:Code Composer Studio
大家好、德州团队、
在过去的几个月中、我不断看到 MSP430器件通过代码行启用 USB 后发生的怪异事件:
USB_setup (true、true);
有一些有趣的行为:
uint8_t USB_setup (uint8_t connectEnable、uint8_t eventsEnable) { uint8_t status; status = USB_init(); if (eventsEnable){ USB_setEnabledEvents (USB_All_USB_Events); } if (connectEnable){ if (USB_getConnectionInformation ()& USB_VBUS_Present){ if (USB_enable()=USB_sceedion){ USB_RESET(); USB_connect(); } } 返回(状态); }
由于自动时钟检测在我的情况下不起作用,因此 USB_init()包含以下行,这些行已经被我更改了:
USB_XT2Freq = USB_determineXT2Freq (); USB_XT2Freq = 24; USB_XT2PLL = USB_lookUpPll (USB_XT2Freq); uint16_t MCLKFreq = USB_determineFreq ();
现在、Determine XT2Freq 确实会破坏我的代码、因为它使用的是 TimerA1、我在其他一些手册中已经使用了该计时器 A1:
在文件夹中:USB_API/USB_common/usb.c
//计时器 A1设置-用于 XT2频率自动检测 #define TIMER_CTL TA1CTL #define TIMER_CTL_SETTINGS TASSEL_2 + MC_2 + CNTL_0 #define TIMER_CTL_CLR TACLR #define TIMER_CCTL TA1CCTL2 #define TIMER_CCTL_SETTINGS CM_1 + CCIS_1+ CAP #define TIMER_CCTL_IFG CCIFG #define TIMER_CCTL_CM CM_1 #define TIMER_CCR TA1R
其中说明了用于这些目的的计时器、可悲的是、我之前没有意识到。
只是想知道、我应该处理这个问题吗?
我当前的权变措施是重写 USB_code、这样就不需要进行自动晶振测定、因为我对晶体非常了解。
那么、我将仅为我的目的使用计时器。
我可以做的另一件事是在开始处初始化 USB 代码(我更喜欢在结束时初始化、而且我可以在不同位置的代码中打开和关闭 USB、 这样当然会再次触发 USB 并再次破坏我的外设)
在 USB 初始化之后、我将初始化我的所有 ADC 和计时器等
您会建议什么、德州仪器如何使用它们的 USB。
在所有示例中、在 USB_init 之后、我从未见过 TimerA1的用法。
感谢阅读、
祝你一切顺利。
您好、SEb、我不熟悉 MSPware 中的 USB 库、在"TimerA1 usage on the USB_init"问题上、请给我几天时间来检查文档和代码。 谢谢!
更新1:
我找到了介绍 USB_stack 外设用法的当前文档:
Programrs_Guide_MSP430_USB_API.pdf
本文档存在于早期版本2012和2015中的多个版本中。在当前版本中、前 USB_stack 未使用任何 TimerA 外设。
遗憾的是、我确实忽略了这一事实一段时间、代码的其余部分基本保持不变、因此这是一种很难找到的错误、因为通用代码运行良好。
TimerA:用于自动检测 XT2频率
我想使用 USB_stack 的每个人都一定知道他的 XT2频率、那么为什么这里有这个代码呢?
总之、一种简单的权变措施是只需删除行并插入您自己的已知频率、所有项目都将按计划工作。
您好、Seb 很高兴知道您找到了解决时间问题的方法。
这是 TI 专家的快速评论:
指出的 USB 堆栈仅使用 TimerA 来确定 USB 的外部 XTAL 的频率。 USB BSL 也是如此。 客户可以采取更改初始化顺序的操作,以便不再使用 TimerA,和/或确保在调用 USBinit()后将 TimerA 重新初始化到所需的值。 或者,他们可以在 USBinit()过程中对 XT2频率进行硬编码。
我认为 Timer A 的使用提高了程序的稳健性。 但是、它不是必须的、因为 XT2频率是已知的。