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.

[参考译文] MSP430F2410:可以将 P1.1和 P2.2用作 SW UART 吗?

Guru**** 2391415 points
Other Parts Discussed in Thread: MSP430G2553

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

https://e2e.ti.com/support/microcontrollers/msp-low-power-microcontrollers-group/msp430/f/msp-low-power-microcontroller-forum/706601/msp430f2410-can-use-p1-1-and-p2-2-as-sw-uart

器件型号:MSP430F2410
主题中讨论的其他器件:MSP430G2553

由于 P1.1和 P2.2用作 TX 和 RX 的 BSL 引导加载程序。  

我能否编写一个软件 UART,以便在应用程序运行期间使用这两个端口?  

我注意到 P1.1和 P2.2是 TA0  

在本示例中,我们使用了两个不同的计时器中断,即 TA1和 TA2。  

有任何提示吗?  

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

    是的、您可以使用它们。
    请查看有关 MSP430G2553的 SW UART 的以下主题:

    e2e.ti.com/.../254393

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

    您还有其他问题吗? 如果不是、请为解决您的问题的帖子选择"已解决"、以便关闭此主题。
    非常感谢!

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

    是的。  
    有关此问题、请参阅我的另一篇文章 https://e2e.ti.com/support/microcontrollers/msp430/f/166/p/706535/2610240#2610240  

    主要问题是  64引脚开发目标 http://www.ti.com/tool/msp-fet430u64 连接到 P1.1和 P2.2的 TX 引脚1和 RX 引脚2使用2个电阻器(R6)和(R7)进行桥接。

    另请参阅  https://e2e.ti.com/support/microcontrollers/msp430/f/166/p/706535/2610240#2610240中的我的问题 

    一旦您绕过这些电阻器、您就可以了。  

    我正在分享我通过一篇文章从一位先生那里提到的守则(请原谅我忘记了我搜索的地方)。 感谢这位先生。  

    通过这种方式,我解决了我的问题:)  

    #include 
    #include 
    //------------------------------------------
    #define RXD 0x04 // P2.2上的 RXD
    #define TXD 0x02 // P1.1上的 TXD
    
    // 9600 Baud HD/SW UART 的条件,ACLK = 3.579545MHz
    //#define BiTime_5 0x0BA //~ 0.5 bit length
    //#define Bitime 0x175 // 104 us ~ 9596 baud
    /////----
    // 9600波特率软件 UART 的条件,SMCLK = 1MHz
    //---------------
    //TX P1.1连接到 UART RX
    //RX P2.2连接到 UART TX
    //连接 VCC 和接地
    //波特率9600
    //奇偶校验无
    //握手关闭
    //数据大小8
    #define UART_TBIT_DIV_2 (1000000/(9600 * 2)
    )#define UART_TBIT (1000000/9600)
    
    
    
    unsigned int RXTXData;
    unsigned char Bitcnt;
    void TX_Byte (void);
    void RX_Ready (void);
    // M.Buccini
    // Texas Instruments、Inc
    // 2002年3月
    
    
    void main (void)
    {
    unsigned int i;
    
    WDTCTL = WDTPW + WDTHOLD;//停止看门狗计时器
    
    
    IF (CALBC1_1MHz == 0xFF) //如果校准常数被擦除
    {
    while (1)
    ; //不加载,陷阱 CPU!!
    }
    DCOCTL = 0; //选择最低 DCOx 和 MODx 设置
    BCSCTL1 = CALBC1_1MHz;
    DCOCTL = CALDCO_1MHz;
    
    
    CCTL0 = OUT;// TXD 空闲作为标记
    //TACTL = TASSEL0+MC1;// ACLK、连续模式
    TACTL = tassel_2+MC_2;// SMCLK、以连续模式启动
    
    
    // TACCTL0 = OUT; //将 TXD 空闲设置为标记='1'
    // TACCTL1 = SCS + CM1 + CAP + CCIE; //同步、负边沿、捕捉、内部
    // TACCTL2 = CCIE;
    // TACTL = tassel_2 + MC_2 + TAIE; // SMCLK,以连续模式启动
    // CCR2 = 50000;
    
    
    
    P1SEL = TXD;// P1.1/TA0表示 TXD 功能
    P1DIR = TXD;// P1上的 TXD 输出
    P2SEL = RXD;// P2.2/TA0作为 RXD 输入
    
    
    _enable_interrupt ();
    // Mainloop
    对于(;)
    {
    
    RX_Ready ();// UART 准备好接收一个字节
    _BIS_SR (CPUOFF+GIE);//输入 LPM0直到字符 RXed
    TX_Byte ();// TX Back RXed Byte received
    
    //Exxample 发送字符
    /*RXTXData = 0x42;
    TX_Byte ();
    RXTXData = 0x6A;
    TX_Byte();*/
    }
    }
    
    //函数从 RXTXData 缓冲
    器 void TX_Byte (void)
    {发送字符
    Bitcnt = 0xA;//加载位计数器、8个数据+ ST/SP
    CCR0 = TAR;// TA 计数器的当前状态
    // CCR0 += Bitime;//直到第一位的某个时间
    CCR0 +=UART_TBIT;
    
    RXTXData |= 0x100;//向 RXTXData 添加标记停止位
    RXTXData = RXTXData << 1;//添加空间起始位
    CCTL0 = OUTMOD0+CCIE;// TXD =标记=空闲
    while (CCTL0 & CCIE);//等待 TX 完成
    }
    
    //函数读取 UART 以接收字符到 RXTXData 缓冲
    区 void RX_Ready (void)
    {
    Bitcnt = 0x8;//加载位计数器
    CCTL0 = SCS+CCIS0+OUTMOD0+CM1+CAP+CCIE;//同步、负边沿、捕捉
    }
    
    //计时器 A0中断服务例程
    #pragma vector = TIMERA0_vector
    __interrupt void Timer_A (void)
    {
    //CCR0 += Bitime;//将偏移添加到 CCR0
    CCR0 += UART_TBIT;
    // RX
    IF (CCTL0和 CCIS0)// CCI0B 上的 RX?
    {
    if (CCTL0 & CAP)//捕获模式=起始位边沿
    {
    CCTL0 &=~电容器;//从捕捉切换到比较模式
    //CCR0 += BiTime_5;
    CCR0 += UART_TBIT_DIV_2;
    }
    其他
    {
    RXTXData = RXTXData >> 1;
    IF (CCTL0和 SCCI)//获取接收锁存中的等待位
    RXTXData |= 0x80;
    Bitcnt --;//所有位都是 RXed?
    如果(Bitcnt = 0)
    //>>>>> 在此处解码接收到的字节<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
    {
    CCTL0 &=~ CCIE;//所有位 RXED、禁用中断
    _BIC_SR_IRQ (CPUOFF);//从0 (SR)清除 LPM0位
    }
    //>>>>> 在此处解码接收到的字节<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<><<<<<>}
    
    }
    // TX
    其他
    {
    如果(Bitcnt = 0)
    CCTL0 &=~ CCIE;//所有位 TXed、禁用中断
    其他
    {
    CCTL0 |= OUTMOD2;// TX 空间
    IF (RXTXData & 0x01)
    CCTL0 &=~ OUTMOD2;// TX 标记
    RXTXData = RXTXData >> 1;
    BitCnt --;
    }
    }