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.

[参考译文] CCS/MSP430F5529:MSP430 MSPware USB-stack 为什么 USB 使用某些外设、如 TimerA1?

Guru**** 2041660 points
请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/microcontrollers/msp-low-power-microcontrollers-group/msp430/f/msp-low-power-microcontroller-forum/836703/ccs-msp430f5529-msp430-mspware-usb-stack-why-is-usb-using-some-of-my-peripherals-like-timera1

器件型号:MSP430F5529
主题中讨论的其他器件:MSPWARE

工具/软件: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频率是已知的。