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.

[参考译文] MSP430FR2532:DMX512 (RS485,具有2个StopBit,无奇偶校验)和eUSCI串行接口

Guru**** 2587365 points


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

https://e2e.ti.com/support/microcontrollers/msp-low-power-microcontrollers-group/msp430/f/msp-low-power-microcontroller-forum/617381/msp430fr2532-dmx512-rs485-with-2-stopbit-no-parity-and-eusci-serial-interface

部件号:MSP430FR2532

您好,

我在使用正确的设置和正确的时钟设置/偏差配置eUSCI时遇到一些问题。 首先我认为硬件还可以。 有一些巴士参与者在爱特梅尔处理器上进行了热转,也有一些人购买了处理器。 在RS485 IC和MSP430之间,本示波器显示有效数据(模拟示波器,而不是数据记录器)。 因此,我认为我只会在正确的软件设置下失败。 ;-)

我正在使用IAR嵌入式工作平台IDE 6.50。5。


我尝试重新混合一些代码示例: https://github.com/j-windsor/MSP430-DMX512/blob/master/main.c

您的示例中的一个:msp430fr243x_euscia0_UART_01.c www.ti.com/.../slac700

我的实际尝试之一:

//#include "io430/h"
#include "msp430fr2532.h"

#define chan_1 BIT4 //端口1 //输出1
#define chan_2 BIT1 //端口1 //输出2
#define chan_3 BIT5 //端口1 //输出3
#define chan_4 BIT2 //端口1 //输出4

#定义RX 位5 //port2 //RX UART
#define TX BIT6. //port2 //TX UART
#define de BIT7. //port2 //传输启用UART
#define re BIT1. //PORT3 //_receive enable UART (反向)

//DMX512/RS485设置
无符号int actChannel =0; //实际接收字节的变量
unsigned char busAddress =0; //DMX地址+1
无符号字符rxData =0; //received byte//unsigned
char byteReceived的值=0; //字节尚未收到?

INT MAIN ( VOID ){//

停止看门狗计时器以防止超时复位
WDTCTL = WDTPW + WDTHOLD;

P1SEL0 = 0x00;
P1SEL1 = 0x00;
P1DIR = CHAN_1 + CHAN_2 + CHAN_3 + CHAN_4;//通道1和通道3工作
P1OUT = 0x00;//CHAN_1 + CHAN_2 + CHAN_3 + CHAN_4;

P2SEL0 = RX;
P2SEL1 = RX;
P2DIR = DE;//和~RX
P2OUT = 0x00;

P3SEL0 = 0x00;
P3SEL1 = 0x00;
P3DIR = RE;
P3OUT = 0x00;

PM5CTL0 &=~(LOCKLPM2);

//设置振荡器:
__bis_sr_register (SCG0); //禁用FLL
CSCTL3 |= SELREF_REFCLK; //将REFO设置为FLL参考源
CSCTL0 = 0; //清除DCO和MOD寄存器
CSCTL1 &=~(DCORSEL_7); //清除DCO频率选择位优先
CSCTL1 |= DCORSEL_3; // SET DCO = 8MHz
CSCTL2 = FLLD_0 + 243; // DCODIV = 8MHz
__DELAY周期(3);
__BIC_SR_REGISTER (SCG0); //启用FLL
While (CSCTL7和(FLLUNLOCK0 | FLLUNLOCK1));//轮询直到FLL被锁定

CSCTL4 = SELMS__DCOCLKDIV |拉美经济体系__REFOCLK;//将默认的REFO (~3.2768万Hz)设置为ACLK源,ACLK =3.2768万Hz
//默认DCODIV为MCLK和SMCLK源

UCA1CTL1 || UCSWRST;//暂停用于初始
化UCA1CTL1 |= UCSSEL1;//小时钟,无错误检测,无奇偶校验
UCA1CTL0 = UCSPB | UCMODE_1;//两个低停止位
//UCA1CTLW0 =
UCA1BR0 = 32;//250kBBIE = UCA1RID= 8.000 250.000

~UCA1UCA0 = UCA1CA0;UCA1BIE = UCA1BIE = UCA1BIE =
//接收时中断

_BIS_SR (GIE);//中断启用

而(1)
{
IF (UCA1STATW和UCBRK)
{
actChannel =0;//重置通道计数
器}
/*P1OUT = CHAN_1 + CHAN_2 + CHAN_3 + CHAN_4;
用于(int i=0;i< 3万;i++);
P1OUT = 0x00;
for(int I=0;i< 3万;i++);*/
}
#if


defined(__TI_Compiler_version__)|| defined(__IAR_systems_icc__)
#pragma vector=UISR_A1_vector
__interrupt void USI_A1_Elif defined(__GSCI_systems_)
#lif definedu_void
error_usiver_


#endif
{
SWITCH(__EIN_RANGE(UCA1IV,USI_UART_UCTXCPTIFG)){

案例0x02://接收
rxData = UCA1RXBUF;
//byteReceived = 1;
IF (actChannel == 2){
IF (rxData > 127)
{
P1OUT |=通道1;
}
否则
{
P1OUT ==~chan_1;
}
}
actChannel++;//递增通道
Break;
default:break;
}
UCA1IFG &=~UCTXIFG;//clear flag
} 

我对eUSCI的所有设置有点困惑。 在系列/用户指南的第575页上,有一些校正/调制模式。 我只是想我可以将时钟设置为8MHz,然后将它设置为250 kBaud。 如果 您需要的偏差大于或小于16,数据表会在第576页上有所不同。 slac700中的示例仅适用于9600波特,需要所有校正,对吗?

如果有人给我提供更多信息或提示,我会非常高兴! :)我希望我粘贴所有重要信息。

Carsten,您好

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

    Carsten,您好!

    如果您使用 MSP430FR4xx和MSP430FR2xx系列用户指南的3.3 第5节中提供的公式 (fDCOCLKDIV =(FLLN +1)×(fFLLREFCLK÷n)计算时钟速度,您将会看到它并非正是8MHz。 实际上,它更接近799.5392万 Hz。 这可能会导致波特率出现错误,从而导致通信失败。

    250k波特率不是显示用户指南的标准波特率,因此您必须计算自己的分压器值。 TI为 Driverlib提供了UART波特率生成工具,但这也可以应用于注册级别代码。 我输入了您的规格并得到了以下信息:

    而您的初始计算是正确的。 我认为与略微不同的源时钟相关的错误可能导致了问题。 您能否尝试一下并告诉我它的工作原理?

    此致,  

    Caleb Overbay

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

    嗨,非常感谢! 我又尝试了几个小时... :D

    UCA1CTLW0 |= UCSWRST;//暂停用于初始
    化UCA1CTLW0 |= UCSSEL__SMCLK;//小时钟,无错误检测,无奇偶校验
    UCA1CTLW0 = UCA1CTLW0 = UCSPB | UMODE_1;//启动条件下的两个低停止位和线性模式
    /*UCA1BRW = 0x0001;/UCA1CT1000
    
    
    = 250.000 ;/UCB1 = URFC1000;/UCB1 == UCB15/ 8.000
    UCA1MCTLW = 0x00 | UCBRF_15 | UCOS16;*
    / UCA1BRW = 0x0002;//250kBaud => 8.000 .000 / 250.000 = 32
    //UCBRF1 = 0;
    //UCBRS1 = 1;
    //UCOS16 = 1;
    UCA1MCTLW = 0x0100 |
    UCSR/UCST=~UCSR0;UCST/ UCST= UCST/ UCST=
    
    
    _BIS_SR (GIE);//中断启用 

    这就是我所做的。 我首先尝试了您的配置(注释掉),然后将SMLK放在输出和可测量的8.015 上。414Hz。 我把它放在计算器中,得到 了2 - 0 - 1 -  1.

    我试图稍微随意地更改寄存器,在家庭指南中检查了每个人,但我不会进入中断例程... :(我将断点放在ISR的交换机指令上。 我尝试读取UART的第二个字节进行测试。 我认为错误一开始就不应该那么大,让它因为时间不准确而失败。

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

    我添加了这些UCRXEIE位,就像我在DMX512 https://github.com/j-windsor/MSP430-DMX512/blob/master/main.c#L88的示例中看到的那样

    我在RS485 IC和MSP430之间放置了逻辑分析器,并获得了有效的DMX512数据。

    我尝试了许多寄存器的组合,我认为它们是合乎逻辑的。

    我在代码中添加了一个ADC的代码示例,它立即称为ISR。 UART ISR从未被调用。

    这是我的实际代码:

    //#include "io430/h"
    #include "msp430fr2532.h"
    
    #define chan_1 BIT4 //端口1 //输出1
    #define chan_2 BIT1 //端口1 //输出2
    #define chan_3 BIT5 //端口1 //输出3
    #define chan_4 BIT2 //端口1 //输出4
    
    #定义RX 位5 //port2 //RX UART
    #define TX BIT6. //port2 //TX UART
    #define de BIT7. //port2 //传输启用UART
    #define re BIT1. //PORT3 //_receive enable UART (反向)
    
    //DMX512/RS485设置
    无符号int actChannel =0; //实际接收字节的变量
    unsigned char busAddress =0; //DMX地址+1
    无符号字符rxData =0; //received byte//unsigned
    char byteReceived的值=0; //字节尚未收到?
    
    
    int main( void ){//
    
    停止看门狗计时器以防止超时复位
    WDTCTL = WDTPW + WDTHOLD;
    
    PM5CTL0 &=~(LOCKLPM5);
    
    P1SEL0 = 0x00;
    P1SEL1 = 0x00 | BIT7;//BIT7是fpr SMCLK OUTPUT
    P1DIR = CHAN_1 + CHAN_2 + CHAN_3 + CHAN_4 + BIT7;//BIT7是fpr SMCLK OUTPUT
    P1OUT = 0x00;//CHAN_1 + CHAN_2 + CHAN_3 + CHAN_4;
    
    P2SEL0 = RX;
    P2SEL1 = 0x00;
    P2DIR = DE;//和~RX
    P2OUT = 0x00;
    
    P3SEL0 = 0x00;
    P3SEL1 = 0x00;
    P3DIR = RE;
    P3OUT = 0x00;
    
    //设置振荡器:
    __bis_sr_register (SCG0); //禁用FLL
    CSCTL3 |= SELREF_REFCLK; //将REFO设置为FLL参考源
    CSCTL0 = 0; //清除DCO和MOD寄存器
    CSCTL1 &=~(DCORSEL_7); //清除DCO频率选择位优先
    CSCTL1 |= DCORSEL_3; // SET DCO = 8MHz
    CSCTL2 = FLLD_0 + 243; // DCODIV = 8MHz
    __DELAY周期(3);
    __BIC_SR_REGISTER (SCG0); //启用FLL
    While (CSCTL7和(FLLUNLOCK0 | FLLUNLOCK1));//轮询直到FLL被锁定
    
    CSCTL4 = SELMS__DCOCLKDIV |拉美经济体系__REFOCLK;//将默认的REFO (~3.2768万Hz)设置为ACLK源,ACLK =3.2768万Hz
    //默认DCODIV为MCLK和SMCLK源
    
    UCA1CTLW0 |= UCSWRST;//暂停用于初始
    化UCA1CTLW0 |= UCSSEL__SMCLK;//小时钟,无错误检测,无奇偶校验
    UCA1CTLW0 = UCSPB | UCMODE_1 | UCRXEIE;//两个低停止位和线性模式,具有启动条件|接收eronc1 = 8.000 250.000
    = UCA0001B1B1000
    /1000 / UC1000
    //UCBRS1 = 255;
    //UCOS16 = 1;
    UCA1MCTLW = 0x00 | UCBRF_15 | UCOS16;
    /*UCA1BRW = 0x0002;//250kBaud => 8.000 .................000 / 250.000 = 32
    //UCBRF1 = 0;
    //UCBLWRS1 = 1;//UCA1UC16
    
    
    =~/ UCA1UCST=
    
    
    //_BIS_SR (GIE);//interrupt enable
    __bis_sr_register (GIE);
    while (1)
    {
    IF (UCA1STATW和UCBRK)
    {
    actChannel =0;//重置通道计数
    器}
    //P1OUT = CHAN_1 + CHAN_2 + CHAN_3 + CHAN_4;
    //for (int i=0;i< 3万;i++);
    //P1OUT = 0x00;
    //for(int I=0;i< 3万;i++)
    ;}
    
    
    
    #if defined(__TI_Compiler_version__)|| defined(__IAR_systems_icc__)
    #pragma vector=UISR_A1_vector
    __interrupt void USI_A1_Elif defined(__GSCI_systems_)
    #void erran_us_usiver=UISR_OUISCI_OUILA1_
    
    
    
    #endif
    {
    P1OUT |= chan_1;
    switch (__ench_in_range(UCA1IV,USI_UART_UCTXCPTIFG))
    //switch (__ench_in_range(UCA1IV,USI_UART_UCRXIFG))
    {
    Case 0x02://接收
    rxData = UCA1RXBUF;
    //byteReceived = 1;
    IF (actChannel == 2){
    IF (rxData > 127)
    {
    P1OUT |=通道1;
    }
    否则
    {
    //P1OUT &=~CHAN_1;
    }
    }
    actChannel++;//递增通道
    Break;
    default:break;
    }
    UCA1IFG &=~UCTXIFG;//clear flag
    }
    

    有人想我可以尝试什么? 非常感谢!

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

    Carsten,您好!

    我对沟通的延误表示歉意。 您在这方面是否取得了进展?

    我建议将波特率降低到 MSP430FR4xx和MSP430FR2xx系列用户指南的表21-5中指定的值之一 ,以查看这是否是高波特率的结果。 您能在say 9600波特下测试一下并告诉我结果吗?

    此致,

    Caleb Overbay

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    我无法设置发送器的波特率。 它是此协议的固定值。 :(
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    Carsten,您好!

    没关系。 我看到您正在使用空闲行多处理器格式。 当MSP430检测到空闲线路时,波特率发生器将关闭。 当存在启动条件时,需要重新打开此波特率发生器。 我怀疑这可能会导致问题,因为您正在以如此高的波特率运行。 您是否可以尝试不使用空闲线多处理器格式进行测试并查看您是否进入ISR?

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

    您是否有机会尝试我建议的实验?

    此致
    Caleb Overbay