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/MSP430F5528:USB和UART

Guru**** 2609285 points
Other Parts Discussed in Thread: MSP430F5528, MSP430F5510

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

https://e2e.ti.com/support/microcontrollers/msp-low-power-microcontrollers-group/msp430/f/msp-low-power-microcontroller-forum/639779/ccs-msp430f5528-usb-and-uart

部件号:MSP430F5528
主题中讨论的其他部件: MSP430F5510

工具/软件:Code Composer Studio

我可以同时使用USB和UART吗?

UART,用于3.3 和GPIO 3.4

这是编码初始化部分。

PMM_setVCore (PMM_Core_LEVEL_2);
USBHAL_INITPorts();//为低功耗(低输出)配置GPIO
USBHAL_initClocks(800万);//配置时钟。 MCLK=SMCLK=FLL=8MHz;ACLK=REFO=32kHz
USB_setup (TRUE,TRUE);//初始化USB和事件;如果存在主机,则连接
initrtc();//启动实时时钟


//UART
P3SEL || BIT3+BIT4;// WFP 3.3 4 = USI_A0 TXD/RXD
UCA0CTL1 |= UCSWRST;//**将状态机置于复位**
UCA0CTL1 |= UCSSEL_2;// SMCLK
UCA0BR0 = 9;// 1MHz 11.52万 (请参阅用户指南)
UCA0BR1 = 0;// 1MHz 11.52万
UCA0MCTL || UCBRS_1 + UCBRF_0;//调制UCBRSx=1,UCBRFx=0
UCA0CTL1 &=~UCSWRST;//**初始化USCI状态机**
UCA0IE |= UCRXIE;//启用USI_A0 RX中断

我尝试同时使用USB 端口和UART。 但在某种程度上,USB 示例和UART 示例不起作用。

有人能帮你吗?

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    USB和USCI模块是独立的。

    "不工作"不是有用的错误描述。 您正在尝试做什么? 您编写了什么代码来实现这一点? 您预期会发生什么? 实际发生了什么?
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    首先是UART和USB,并且两者都使用? 就像我想使用 USB端口与计算机通信一样,同时我也喜欢使用UART与不同的MCU通信

    有可能吗?  

    我正在检查UART是否正在与其他MCU通信,是否仅使用示例代码,它是否工作正常。

    这意味着其他MCU接收数据。

    示例代码


    //UART
    P3SEL || BIT3+BIT4;// WFP 3.3 4 = USI_A0 TXD/RXD
    UCA0CTL1 |= UCSWRST;//**将状态机置于复位**
    UCA0CTL1 |= UCSSEL_2;// SMCLK
    UCA0BR0 = 9;// 1MHz 11.52万 (请参阅用户指南)
    UCA0BR1 = 0;// 1MHz 11.52万
    UCA0MCTL || UCBRS_1 + UCBRF_0;//调制UCBRSx=1,UCBRFx=0
    UCA0CTL1 &=~UCSWRST;//**初始化USCI状态机**
    UCA0IE |= UCRXIE;//启用USI_A0 RX中断

    但是,当我同时使用USB配置和UART时,其他MCU无法识别MSP430F5528。

    在USB配置中,它正在更改SMCLK 8M。 但是,UART配置假定SMCLK为1M。

    问题可能出在这里吗?

    你能帮我吗????????

    这是编码初始化部分。

    PMM_setVCore (PMM_Core_LEVEL_2);
    USBHAL_INITPorts();//为低功耗(低输出)配置GPIO
    USBHAL_initClocks(800万);//配置时钟。 MCLK=SMCLK=FLL=8MHz;ACLK=REFO=32kHz
    USB_setup (TRUE,TRUE);//初始化USB和事件;如果存在主机,则连接
    initrtc();//启动实时时钟


    //UART
    P3SEL || BIT3+BIT4;// WFP 3.3 4 = USI_A0 TXD/RXD
    UCA0CTL1 |= UCSWRST;//**将状态机置于复位**
    UCA0CTL1 |= UCSSEL_2;// SMCLK
    UCA0BR0 = 9;// 1MHz 11.52万 (请参阅用户指南)
    UCA0BR1 = 0;// 1MHz 11.52万
    UCA0MCTL || UCBRS_1 + UCBRF_0;//调制UCBRSx=1,UCBRFx=0
    UCA0CTL1 &=~UCSWRST;//**初始化USCI状态机**
    UCA0IE |= UCRXIE;//启用USI_A0 RX中断

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

    当时钟改变时,必须适当调整USCI配置。 使用 USCI UART计算器

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

    谢谢!!  

    但实际上,这并不是唯一的问题。 即使更改波特率 ,当它进入USB_init()内的"determineXT2Freq()"函数时,我仍然有问题;

    当我擦除此功能时,其他MCU可以接收此UART信号。

    请解释一下此代码的用途是什么?

    如果没有此代码,USB是否可以工作?

    UINT16_t USB_determineXT2Freq (void){
    uINT16_t i,xt2Freq,timerccr;

    #IF已定义(__MSP430F552x)||已定义(__MSP430F550x)
    GPIO _setAsPeripheralModuleFunctionOutputPin (GPIO_PORT_P5, GPIO PIN2);
    GPIO _setAsPeripheralModuleFunctionOutputPin (GPIO_PORT_P5, GPIO_PIN3);
    #Elif已定义(__MSP430F563x_F663x)||已定义(__MSP430F565x_F665x)||已定义(__MSP430FG6x2x)
    GPIO_setAsPeripheralModuleFunctionOutputPin (GPIO端口P7,GPIO PIN2);
    GPIO_setAsPeripheralModuleFunctionOutputPin (GPIO端口P7,GPIO PIN3);
    #endif

    //打开XT2振荡器
    HWREG16 (UCS_BASE + OFS_UCSCTL6)&=~XT2OFF;

    //等待OFIFG标志被清除
    同时(UCSCTL7和(DCOFFG + XT2OFFG))

    UCSCTL7 &=~(DCOFFG + XT1LFOFFG + XT2OFFG);//清除OSC Flaut Flags故障标志
    SFRIFG1 &=~OFIFG;//清除OFIFG故障标志
    }

    //设置SMCLK = XT2
    UCS_initClockSignal(.
    UCS_SMCLK,
    UCS_XT2CLK_SELECT,
    UCS_Clock_diver_1);

    TIMER_CTL = TIMER_CTL_SETTINGS;// TA clock = SMCLK (DCO),连续模式
    For (i = 300;i > 0;i --)//此循环导致"晶体检测"
    {//以用作晶体稳定延迟
    TIME_CTL |= TIME_CTL_CLR;
    TIMER_CCTL = TIMER_CCTL_SETTINGS;//上升沿,CCI2A = ACLK,捕获
    while (!(timer_CCTL & timer_CCTL_IFG)){}//等待第一次捕获(未知时间)
    }
    Timer_CCTL &=~CM_1;

    timerccr = timer_ccr;//使用局部变量比较寄存器

    //设置SMCLK = DCO
    UCS_initClockSignal(.
    UCS_SMCLK,
    UCS_DCOCLK_SELECT,
    UCS_Clock_diver_1);

    //检查XT2Freq是否大于24MHz
    IF (timerCCR >(((((AUTO_DETT_XT2_SPEED + AUTO_DETT_XT2_SPEED _2)/2)/REFO_CLK_FREQ)))

    // 24MHz
    xt2Freq =(自动检测XT2_SPEED 1/100万);
    }
    //检查XT2Freq是否介于16MHz和24MHz之间
    否则,如果( timerCCR >(((((Auto_detect_XT2_speed_2 + Auto_detect_XT2_speed_3)/2)/REFO_CLK_FREQ)))

    // 16MHz
    xt2Freq =(自动检测XT2_SPEED 2/100万);
    }
    //检查XT2Freq是否在12MHz和16MHz之间
    否则,如果( timerCCR >(((((Auto_detect_XT2_speed_3+ Auto_detect_XT2_speed_4)/2)/REFO_CLK_FREQ)))

    // 12MHz
    xt2Freq =(自动检测XT2_SPEED 3/100万);
    }
    //检查XT2Freq是否介于8MHz和12MHz之间
    否则,如果( timerCCR >(((((Auto_detect_XT2_speed_4+ Auto_detect_XT2_speed_5)/2)/REFO_CLK_FREQ)))

    // 8MHz
    xt2Freq =(自动检测XT2_SPEED 4/100万);
    }
    否则

    // 4MHz
    xt2Freq =(自动检测XT2_SPEED 5/100万);
    }

    返回xt2Freq;
    }

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

    您好,

    我最近在基于MSP430F5510的主板上遇到了这个问题。 我试图制作一个UART到HID触摸屏;基本上,MSP430将以UART通信的形式接收触摸输入坐标,然后将这些输入传输到作为HID设备插入的任何操作系统。
    当UART接收代码独立工作时,一旦它与USB HID代码合并,我就无法接收任何UART通信。 当我建立这条线并指出“determineXT2Freq()"是罪魁祸首时,我进行了一些挖掘。
    我意识到一个引信及其相关的评论是误导的。 在USB HID示例的第95行,您可以在`USBHAL_initClocks(800万);` clock initialization function前面找到此注释:

    //配置时钟。 MCLK=SMCLK=DCO/FLL=8MHz;ACLK=REFO=32kHz

    经过一些测试后,我发现这句话是不对的。
    我测量了DCO/FLL (也是SMCLK的源)发送到`USBHAL_INITClocks(insert_fREQUENCYIN_Hz_HERE)的各种值的频率;`作为时钟频率的基准。 下面是我的结果:

    用于`USBHAL_initClocks(800万);`
    | DCO = 9.000 MHz

    用于`USBHAL_initClocks(1600万);`
    | DCO = 7.000 MHz

    用于`USBHAL_initClocks(100万);`
    | DCO ~= 1.968 MHz

    DCO未设置为此评论或函数承诺的费率。 为了控制我的通信和CPU速度,我更喜欢使用XT2振荡器作为MCLK和SMCLK的源。

    SMCLK的源振荡器在"determineXT2freq()"函数中定义。 在这里,您将找到两个定义SMCLK源的函数调用。

    第一:


    UCS_initClockSignal(.
    UCS_SMCLK,
    UCS_XT2CLK_SELECT,
    UCS_Clock_diver_1);

    然后在稍稍稍向下的代码之后:


    UCS_initClockSignal(.
    UCS_SMCLK,
    UCS_DCOCLK_SELECT,
    UCS_Clock_diver_1);  

    删除将DCO设置为SMCLK源的函数调用将使其来自XT2。 USB API的其余部分没有其他影响,因为它不使用SMCLK。