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.

MSP5308 定时器模拟串口

Other Parts Discussed in Thread: MSP430F5308

MSP5308 定时器模拟串口,有TI官方例程吗?在哪儿下?开发环境 XP IAR

  • 这个网上资料很多,比如:http://wenku.baidu.com/view/385c312de2bd960590c677b5.html  MSP430架构类似,稍作修改即可使用

    其他MSP430F5308模块示例代码:http://www.ti.com/lit/zip/slac469

  • Hi Haiming,

      因为我们MSP430 5系列的产品是有自带UART接口的,所以官方没有针对这款芯片最专门的TimerA模拟UART的代码。

    不过在我们的G2xx或是F2系列的一些没有UART的芯片上面是有这样的实例代码的。

    附件里面是我们一个用于G2xx1的例子,你可以参考一下。需要注意的是时钟。

    谢谢

    ken

  • 非常谢谢你,G2xx1的例子修改后在f5308上运行有一个问题,这个问题是:模拟串口发送的第一个字符串是错的,后面发送的字符串都是对的,这是为什么啊?

  • 非常谢谢你,G2xx1的例子修改后在f5308上运行有一个问题, 这个问题是:模拟串口发送的第一个字符串是错的,后面发送的字符串都是对的,这是为什么啊?

  • Hi Haiming,

       方便的话,你可以把你的程序上传一下吗?这样分析起来会更方便快捷一些。

    谢谢

    ken

  • 只有第一帧是错的,后面是对的,谢谢,程序附上:

    void TimerA_UART_init(void)
    {
        TA0CTL = TASSEL_2 + MC_2;                // SMCLK, start in continuous mode
       
        TA0CCTL0 = OUT;                          // Set TXD Idle as Mark = '1' 
        TA0CCTL1 = SCS + CM1 + CAP + CCIE;       // Sync, Neg Edge, Capture, Int
      
    }


    //------------------------------------------------------------------------------
    // Prints a string over using the Timer_A UART
    //------------------------------------------------------------------------------
    void Tx_array(unsigned char *array, int CNT)
    {
      int i=0;
      for(i=0;i<CNT;i++)
      {
        Tx_byte(array+i);
      }

    }

     

    //------------------------------------------------------------------------------
    // Outputs one byte using the Timer_A UART
    //------------------------------------------------------------------------------
    void Tx_byte(unsigned char *pointer)
    {
        while (TA0CCTL0 & CCIE);                 // Ensure last char got TX'd
        TA0CCR0 = TA0R;                           // Current state of TA counter
        TA0CCR0 += UART_TBIT;                    // One bit time till first bit
        TA0CCTL0 = OUTMOD0 + CCIE;               // Set TXD on EQU0, Int
        txData = *pointer;                          // Load global variable
        txData |= 0x100;                        // Add mark stop bit to TXData
        txData <<= 1;                           // Add space start bit
      
    }


    //------------------------------------------------------------------------------
    // Timer_A UART - Transmit Interrupt Handler
    //------------------------------------------------------------------------------
    #pragma vector = TIMER0_A0_VECTOR
    __interrupt void Timer0_A0_ISR(void)
    {
        static unsigned char txBitCnt = 10;

        TA0CCR0 += UART_TBIT;                    // Add Offset to CCRx
        if (txBitCnt == 0) {                    // All bits TXed?
            TA0CCTL0 &= ~CCIE;                    // All bits TXed, disable interrupt
            txBitCnt = 10;                      // Re-load bit counter
        }
        else {
            if (txData & 0x01) {
              TA0CCTL0 &= ~OUTMOD2;              // TX Mark '1'
            }
            else {
              TA0CCTL0 |= OUTMOD2;               // TX Space '0'
            }
            txData >>= 1;
            txBitCnt--;
        }
       

      
    }     
    //------------------------------------------------------------------------------
    // Timer_A UART - Receive Interrupt Handler
    //------------------------------------------------------------------------------
    #pragma vector = TIMER0_A1_VECTOR
    __interrupt void Timer0_A1_ISR(void)
    {
        static unsigned char rxBitCnt = 8;
        static unsigned char rxData = 0;

        switch (__even_in_range(TA0IV, TA0IV_TA0IFG)) { // Use calculated branching
            case TA0IV_TA0CCR1:                        // TACCR1 CCIFG - UART RX
                TA0CCR1 += UART_TBIT;                 // Add Offset to CCRx
                if (TA0CCTL1 & CAP) {                 // Capture mode = start bit edge
                    TA0CCTL1 &= ~CAP;                 // Switch capture to compare mode
                    TA0CCR1 += UART_TBIT_DIV_2;       // Point CCRx to middle of D0
                }
                else {
                    rxData >>= 1;
                    if (TA0CCTL1 & SCCI) {            // Get bit waiting in receive latch
                        rxData |= 0x80;
                    }
                    rxBitCnt--;
                    if (rxBitCnt == 0) {             // All bits RXed?
                     

                      RX_DATA[RX_PW++] = rxData;         
                      if (RX_PW >= RXDATA_SIZE)   
                      { 
                        RX_PW = 0;
                      } 
                       
                        rxBitCnt = 8;                // Re-load bit counter
                        TA0CCTL1 |= CAP;              // Switch compare to capture mode
                      
                    }
                }
                break;
        }
    }

  • 接收没有问题,发送的第一帧会出错。