使用的是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引脚,对吗?
您好,
1. 您确定问题是由于在选择 XT1 时钟作为 DCO 的参考时未使用 FLL。
2. 您将时钟速度调整到 16M 并启用 FLL 后,UART 正确接收和发送数据。
是这样吗?您还需要我们做什么?