X-Git-Url: http://git.rot13.org/?p=goodfet;a=blobdiff_plain;f=firmware%2Flib%2Fmsp430f2618.c;h=8f20ad2d85616e81e2d8e059c5af3577fa5745e8;hp=408e3eea76cc5edf0079462322e25962c0dc95c3;hb=f244df1b2d3010548ed2cceabdde44f36089a29a;hpb=e5fc8a027fccccf4311771fb364ae86731591101 diff --git a/firmware/lib/msp430f2618.c b/firmware/lib/msp430f2618.c index 408e3ee..8f20ad2 100644 --- a/firmware/lib/msp430f2618.c +++ b/firmware/lib/msp430f2618.c @@ -1,17 +1,14 @@ //! MSP430F2618 clock and I/O definitions // Included by other 2xx ports, such as the 2274. +#include +#include + #include "platform.h" #include "dco_calib.h" -#ifdef __MSPGCC__ -#include -#else -#include -#include -#include -#endif + //! Receive a byte. @@ -28,8 +25,15 @@ unsigned char serial0_rx(){ //! Receive a byte. unsigned char serial1_rx(){ - //TODO - return 00; + char c; + +#ifdef useuart1 + while (!(UC1IFG&UCA1RXIFG)); // USCI_A1 TX buffer ready? + c = UCA1RXBUF; + UC1IFG&=~UCA1RXIFG; +#endif + + return c; } //! Transmit a byte. @@ -38,18 +42,16 @@ void serial0_tx(unsigned char x){ UCA0TXBUF = x; /* send the character */ while(!(IFG2 & UCA0TXIFG)); } -//! Transmit a byte. -void serial_tx_old(unsigned char x){ - while ((IFG2 & UCA0TXIFG) == 0); //loop until buffer is free - UCA0TXBUF = x; /* send the character */ - while(!(IFG2 & UCA0TXIFG)); -} - //! Transmit a byte on the second UART. void serial1_tx(unsigned char x){ - +#ifdef useuart1 + while ((UC1IFG & UCA1TXIFG) == 0); //loop until buffer is free + UCA1TXBUF = x; /* send the character */ + while(!(UC1IFG & UCA1TXIFG)); +#endif } + //! Set the baud rate. void setbaud0(unsigned char rate){ @@ -81,7 +83,32 @@ void setbaud0(unsigned char rate){ //! Set the baud rate of the second uart. void setbaud1(unsigned char rate){ - +#ifdef useuart1 + //Table 15-4, page 481 of 2xx Family Guide + switch(rate){ + case 1://9600 baud + UCA1BR1 = 0x06; + UCA1BR0 = 0x82; + break; + case 2://19200 baud + UCA1BR1 = 0x03; + UCA1BR0 = 0x41; + break; + case 3://38400 baud + UCA1BR1 = 0xa0; + UCA1BR0 = 0x01; + break; + case 4://57600 baud + UCA1BR1 = 0x1d; + UCA1BR0 = 0x01; + break; + default: + case 5://115200 baud + UCA1BR0 = 0x8a; + UCA1BR1 = 0x00; + break; + } +#endif } #define BAUD0EN 0x41 @@ -89,7 +116,7 @@ void setbaud1(unsigned char rate){ void msp430_init_uart(){ - // Serial on P3.4, P3.5 + // Serial0 on P3.4, P3.5 P3SEL |= BIT4 + BIT5; P3DIR |= BIT4; @@ -110,31 +137,45 @@ void msp430_init_uart(){ //Leave this commented! //Interrupt is handled by target code, not by bootloader. - //IE2 |= UCA0RXIE; + //IE2 |= UCA0RXIE; //DO NOT UNCOMMENT + + + #ifdef useuart1 + // Serial 1 on P3.6, 3.7 + P3SEL |= 0xC0; + //UCA1CTL0 = 0x00; + UCA1CTL1 |= UCSSEL_2; // SMCLK + setbaud1(5); //115200 + UCA1MCTL = 0; + UCA1CTL1 &= ~UCSWRST; // Initialize USCI state machine + #endif } +//This must be in .noinit. +__attribute__ ((section (".noinit"))) char dcochoice; + //! Initialization is correct. void msp430_init_dco_done(){ - char *choice=(char *) 0x200; //First word of RAM. - choice[0]--; + //char *dcochoice=(char *) DCOCHOICEAT; //First word of RAM. + dcochoice--; } //! Initialize the MSP430 clock. void msp430_init_dco() { int i=1000; - char *choice=(char *) 0x200; //First word of RAM. - + //char *dcochoice=(char *) DCOCHOICEAT; //First word of RAM. + #ifdef __MSP430_HAS_PORT8__ P8SEL = 0; // disable XT2 on P8.7/8 #endif - + //Set P2.6 mode for MSP430F2274 #ifndef __MSP430_HAS_PORT5__ P2SEL = 0; //disable XIN on 2274 #endif - - + + #ifdef STATICDCO BCSCTL1 = (STATICDCO>>8); DCOCTL = (STATICDCO&0xFF); @@ -152,10 +193,10 @@ void msp430_init_dco() { */ DCOCTL = 0x00; //clear DCO - BCSCTL1 = dco_calibrations[2*choice[0]+1]; - DCOCTL = dco_calibrations[2*choice[0]]; - choice[0]++; - choice[0]%=dco_calibrations_count; + BCSCTL1 = dco_calibrations[2*dcochoice+1]; + DCOCTL = dco_calibrations[2*dcochoice]; + dcochoice++; + dcochoice%=dco_calibrations_count; } #endif