MSP430FR2355: UART與clock的設定問題

Part Number: MSP430FR2355

使用的是MSP430FR2355TRHA

我想在2355上做一個 clock16M 雙UART通訊

使用的範例是含有driverlib的eusci_a_uart_ex1_loopbackAdvanced

但這個範例是1M的

我要怎麼設定且確定我的clock是16M的

目前設定是eusci_a_uart_ex1_loopbackAdvanced預設的:

//!  SMCLK = MCLK = BRCLK = DCOCLKDIV = ~1MHz, ACLK = 32.768kHz

//Set ACLK = REFOCLK with clock divider of 1
CS_initClockSignal(CS_ACLK,CS_REFOCLK_SELECT,CS_CLOCK_DIVIDER_1);
//Set SMCLK = DCO with frequency divider of 1
CS_initClockSignal(CS_SMCLK,CS_DCOCLKDIV_SELECT,CS_CLOCK_DIVIDER_1);
//Set MCLK = DCO with frequency divider of 1
CS_initClockSignal(CS_MCLK,CS_DCOCLKDIV_SELECT,CS_CLOCK_DIVIDER_1);

UART設定為

param.clockPrescalar = 104;
param.firstModReg = 2;
param.secondModReg = 0xD6;
param.parity = EUSCI_A_UART_NO_PARITY;
param.msborLsbFirst = EUSCI_A_UART_LSB_FIRST;
param.numberofStopBits = EUSCI_A_UART_ONE_STOP_BIT;
param.uartMode = EUSCI_A_UART_MODE;
param.overSampling = EUSCI_A_UART_LOW_FREQUENCY_BAUDRATE_GENERATION;

在9600時可以正常回覆

但改baud rate就無法通訊了

而且設定的值和 software-dl.ti.com/.../index.html 

計算出來的也不同

  • 已经收到了您的案例,调查需要些时间,感谢您的耐心等待。

  • 請問調查的進度

    根據計算機的計算

    http://software-dl.ti.com/msp430/msp430_public_sw/mcu/msp430/MSP430BaudRateConverter/index.html

    除了參數完全不正確以外

    我目前執行的也僅限於9600可以工作

    換成19200就不會回應

    但是計算機是算不出我給的參數

    目前兩個port都使用同一種參數

  • 現在我們改clock來源後

    請問我這兩個來源為什麼一個可以工作

    這是可以工作的

    FRCTL0 = FRCTLPW | NWAITS_1;

    __bis_SR_register(SCG0); // disable FLL
    CSCTL3 |= SELREF__REFOCLK; // Set REFO as FLL reference source
    CSCTL1 = DCOFTRIMEN_1 | DCOFTRIM0 | DCOFTRIM1 | DCORSEL_5;// DCOFTRIM=5, DCO Range = 16MHz
    CSCTL2 = FLLD_0 + 487; // DCOCLKDIV = 16MHz
    __delay_cycles(3);
    __bic_SR_register(SCG0); // enable FLL
    Software_Trim(); // Software Trim to get the best DCOFTRIM value

    CSCTL4 = SELMS__DCOCLKDIV | SELA__REFOCLK; // set default REFO(~32768Hz) as ACLK source, ACLK = 32768Hz

    收和發都正確

    這是有問題的

    FRCTL0 = FRCTLPW | NWAITS_1;
    do
    {
    CSCTL7 &= ~(XT1OFFG | DCOFFG); // Clear XT1 and DCO fault flag
    SFRIFG1 &= ~OFIFG;
    } while (SFRIFG1 & OFIFG); // Test oscillator fault flag
    CS_setExternalClockSource(32768);
    CS_turnOnXT1LF(CS_XT1_DRIVE_3);
    __bis_SR_register(SCG0); // disable FLL
    CSCTL3 |= SELREF__XT1CLK; // Set XT1 as FLL reference source
    CSCTL1 = DCOFTRIMEN_1 | DCOFTRIM0 | DCOFTRIM1 | DCORSEL_5;// DCOFTRIM=5, DCO Range = 16MHz
    CSCTL2 = FLLD_0 + 487; // DCOCLKDIV = 16MHz
    __delay_cycles(3);
    __bic_SR_register(SCG0); // enable FLL
    Software_Trim(); // Software Trim to get the best DCOFTRIM value

    CSCTL4 = SELMS__DCOCLKDIV | SELA__XT1CLK; // set XT1 (~32768Hz) as ACLK source, ACLK = 32768Hz
    CS_initClockSignal(CS_MCLK, CS_DCOCLKDIV_SELECT, CS_CLOCK_DIVIDER_1);
    CS_initClockSignal(CS_SMCLK, CS_DCOCLKDIV_SELECT, CS_CLOCK_DIVIDER_1);

    兩個都是16M

    但是第二個送一樣的byte會收到錯誤的資料

  • 您好,

          您能否确认从发送引脚TX发出的字节中一个位的脉冲宽度?

         在9600波特率下,宽度应该约为104微秒,而在19200波特率下,宽度应该约为52微秒。

         由于这是一个“回环”示例,假设您是将TX引脚直接连接到RX引脚,对吗?

  • 目前可以確定我們的clock是有問題的

    因為我們沒用過FLL做clock調整

    調整成16M後baud rate與參數都是正確的

    接線是PC - com1 - UART A0 - 2355  - UART A1 - com2 - PC

  • 您好,

         1. 您确定问题是由于在选择 XT1 时钟作为 DCO 的参考时未使用 FLL。

         2. 您将时钟速度调整到 16M 并启用 FLL 后,UART 正确接收和发送数据。

         是这样吗?您还需要我们做什么?