Комп <-RS232-> MSP430F449 <-> Внешнее устройство
С компа передаются данные на внешнее устройство через плату с MSP, внешнее устройство отправляет по запросу данные назад на ПК.
В программе начинаю так и все работает:
Код
#include <msp430x44x.h>
#define P1ON 0x90
#define P2ON 0x60
#define DTR1 0x02
#define DTR2 0x01
void main(void)
{
WDTCTL = WDTPW + WDTHOLD;
// FLL module
FLL_CTL0 |= XCAP0PF;
FLL_CTL1= XT2OFF; //SMCLK - on, XT2 - off, MCLK - DC0CLK, SMCLK -DCOCLK, ACLK devider 1
FLL_CTL0 = DCOPLUS;
SCFQCTL = 128-1;
SCFI0 = FLLD_2 +FN_2; // DCO 1.4 - 12 MHz (FLLD_2 +FN_2)
// FLL module
// Порты на комп
UCTL0=SWRST;
UTCTL0 = SSEL1; // UCLK = SMCLK
UBR10 = 0x01; // 8MHz 19200
UBR00 = 0xA0; // 8MHz 19200
UMCTL0 = 0xBB; // 8MHz 19200
UCTL0 = 0x10; // 8n1
P2SEL |= 0x30; // P2.4,5 = USART0 TXD/RXD
P2DIR |= 0x10; // P2.4 output
ME1 |= UTXE0 + URXE0; // вкл USART0 TXD/RXD
UCTL0 &= ~SWRST;
IE1 |= URXIE0; // вкл USART0 RX interrupt
//Внешнее устройство
UTCTL1 = SSEL1; // UCLK = SMCLK
UBR11 = 0x01; // 8MHz 19200
UBR01 = 0xA0; // 8MHz 19200
UMCTL1 = 0xBB; // 8MHz 19200
UCTL1 = 0x10; // 8n1
P4SEL = 0x03; // P4.0,1 = USART1 TXD/RXD
P4DIR = 0xFD; // P4.1 output
ME2 |= UTXE1 + URXE1; // USART1 TXD/RXD
IE2 &= ~0x30; // откл RxTx interrupts
P4OUT = 0x50; // откл RX and TX
BTCTL = BT_ADLY_125; // BT_fLCD_DIV128
SVSCTL = 0x70; // SVS 2.65 volt
P1IE = DTR1+DTR2; // вкл INT at port 1 and port 2
IE2 |= BTIE; // вкл basic timer
WDTCTL = WDT_ARST_1000; // Start WDT (1sec)
IE1 |= 0x01; // вкл WDT interrupt;
_EINT();
}
#pragma vector=UART0RX_VECTOR
__interrupt void usart0_rx (void)
{
IFG1 &= ~URXIFG0;
while ((IFG2 & UTXIFG1) == 0);
TXBUF1 = RXBUF0;
}
#pragma vector=UART1RX_VECTOR
__interrupt void usart1_rx (void)
{
IFG2 &= ~URXIFG1;
while ((IFG1 & UTXIFG0) == 0);
TXBUF0 = RXBUF1;
}
#pragma vector=BASICTIMER_VECTOR
__interrupt void RTC(void)
{
IFG2 &= ~BTIFG;
// Reset WotchDog Timer
WDTCTL = WDT_ARST_1000;
}
#define P1ON 0x90
#define P2ON 0x60
#define DTR1 0x02
#define DTR2 0x01
void main(void)
{
WDTCTL = WDTPW + WDTHOLD;
// FLL module
FLL_CTL0 |= XCAP0PF;
FLL_CTL1= XT2OFF; //SMCLK - on, XT2 - off, MCLK - DC0CLK, SMCLK -DCOCLK, ACLK devider 1
FLL_CTL0 = DCOPLUS;
SCFQCTL = 128-1;
SCFI0 = FLLD_2 +FN_2; // DCO 1.4 - 12 MHz (FLLD_2 +FN_2)
// FLL module
// Порты на комп
UCTL0=SWRST;
UTCTL0 = SSEL1; // UCLK = SMCLK
UBR10 = 0x01; // 8MHz 19200
UBR00 = 0xA0; // 8MHz 19200
UMCTL0 = 0xBB; // 8MHz 19200
UCTL0 = 0x10; // 8n1
P2SEL |= 0x30; // P2.4,5 = USART0 TXD/RXD
P2DIR |= 0x10; // P2.4 output
ME1 |= UTXE0 + URXE0; // вкл USART0 TXD/RXD
UCTL0 &= ~SWRST;
IE1 |= URXIE0; // вкл USART0 RX interrupt
//Внешнее устройство
UTCTL1 = SSEL1; // UCLK = SMCLK
UBR11 = 0x01; // 8MHz 19200
UBR01 = 0xA0; // 8MHz 19200
UMCTL1 = 0xBB; // 8MHz 19200
UCTL1 = 0x10; // 8n1
P4SEL = 0x03; // P4.0,1 = USART1 TXD/RXD
P4DIR = 0xFD; // P4.1 output
ME2 |= UTXE1 + URXE1; // USART1 TXD/RXD
IE2 &= ~0x30; // откл RxTx interrupts
P4OUT = 0x50; // откл RX and TX
BTCTL = BT_ADLY_125; // BT_fLCD_DIV128
SVSCTL = 0x70; // SVS 2.65 volt
P1IE = DTR1+DTR2; // вкл INT at port 1 and port 2
IE2 |= BTIE; // вкл basic timer
WDTCTL = WDT_ARST_1000; // Start WDT (1sec)
IE1 |= 0x01; // вкл WDT interrupt;
_EINT();
}
#pragma vector=UART0RX_VECTOR
__interrupt void usart0_rx (void)
{
IFG1 &= ~URXIFG0;
while ((IFG2 & UTXIFG1) == 0);
TXBUF1 = RXBUF0;
}
#pragma vector=UART1RX_VECTOR
__interrupt void usart1_rx (void)
{
IFG2 &= ~URXIFG1;
while ((IFG1 & UTXIFG0) == 0);
TXBUF0 = RXBUF1;
}
#pragma vector=BASICTIMER_VECTOR
__interrupt void RTC(void)
{
IFG2 &= ~BTIFG;
// Reset WotchDog Timer
WDTCTL = WDT_ARST_1000;
}
Пытаюсь менять строки:
Код
UBR10 = 0x01; // 8MHz 19200
UBR00 = 0xA0; // 8MHz 19200
UMCTL0 = 0xBB; // 8MHz 19200
UBR00 = 0xA0; // 8MHz 19200
UMCTL0 = 0xBB; // 8MHz 19200
На другую скорость, при этом передаются иероглифы.
Пробовал но нескольким файлам расчетов этих параметров.
Наверно затупил где-то?