Echo works.
authortravisutk <travisutk@12e2690d-a6be-4b82-a7b7-67c4a43b65c8>
Tue, 2 Jun 2009 16:04:50 +0000 (16:04 +0000)
committertravisutk <travisutk@12e2690d-a6be-4b82-a7b7-67c4a43b65c8>
Tue, 2 Jun 2009 16:04:50 +0000 (16:04 +0000)
git-svn-id: https://svn.code.sf.net/p/goodfet/code/trunk@19 12e2690d-a6be-4b82-a7b7-67c4a43b65c8

firmware/include/platform.h
firmware/lib/msp430f1612.c [new file with mode: 0644]
firmware/tests/blink/blink.c
firmware/tests/echo/Makefile
firmware/tests/echo/echo.c

index fe42d4f..abc9ef8 100644 (file)
@@ -6,5 +6,5 @@
 #define PLEDDIR P1DIR
 #define PLEDPIN 0x1
 
 #define PLEDDIR P1DIR
 #define PLEDPIN 0x1
 
-//
+
 
 
diff --git a/firmware/lib/msp430f1612.c b/firmware/lib/msp430f1612.c
new file mode 100644 (file)
index 0000000..c003213
--- /dev/null
@@ -0,0 +1,111 @@
+//! MSP430F1612/1611 clock and I/O definitions
+
+#include "platform.h"
+
+#include <signal.h>
+#include <io.h>
+#include <iomacros.h>
+
+
+//! Receive a byte.
+unsigned char serial_rx(){
+  char c;
+  
+  while(!(IFG1&URXIFG0));//wait for a byte
+  c = RXBUF0;
+  IFG1&=~URXIFG0;
+  U0TCTL &= ~URXSE;
+  
+  PLEDOUT^=PLEDPIN;
+  
+  return c;
+}
+//! Transmit a byte.
+void serial_tx(unsigned char x){
+  while ((IFG1 & UTXIFG0) == 0); //loop until buffer is free
+  TXBUF0 = x;
+}
+
+
+void msp430_init_uart(){
+  
+  /* RS232 */
+  
+  P3SEL |= BIT4|BIT5;                        // P3.4,5 = USART0 TXD/RXD
+  P3DIR |= BIT4;
+  
+  
+  UCTL0 = SWRST | CHAR;                 /* 8-bit character, UART mode */
+  
+  
+  UTCTL0 = SSEL1;                       /* UCLK = MCLK */
+
+  //http://mspgcc.sourceforge.net/baudrate.html
+  UBR00=0x00; UBR10=0x01; UMCTL0=0x00;
+  
+  ME1 &= ~USPIE0;                      /* USART1 SPI module disable */
+  ME1 |= (UTXE0 | URXE0);               /* Enable USART1 TXD/RXD */
+
+  UCTL0 &= ~SWRST;
+
+  /* XXX Clear pending interrupts before enable!!! */
+  U0TCTL |= URXSE;
+
+  //IE1 |= URXIE1;                        /* Enable USART1 RX interrupt  */
+}
+
+
+void msp430_init_dco() {
+    /* This code taken from the FU Berlin sources and reformatted. */
+#define MSP430_CPU_SPEED 2457600UL
+#define DELTA    ((MSP430_CPU_SPEED) / (32768 / 8))
+  unsigned int compare, oldcapture = 0;
+  unsigned int i;
+  
+  WDTCTL = WDTPW + WDTHOLD; //stop WDT
+
+  BCSCTL1 = 0xa4; /* ACLK is devided by 4. RSEL=6 no division for MCLK
+                    and SSMCLK. XT2 is off. */
+
+  BCSCTL2 = 0x00; /* Init FLL to desired frequency using the 32762Hz
+                    crystal DCO frquenzy = 2,4576 MHz  */
+
+  BCSCTL1 |= DIVA1 + DIVA0;             /* ACLK = LFXT1CLK/8 */
+  for(i = 0xffff; i > 0; i--) {         /* Delay for XTAL to settle */
+    asm("nop");
+  }
+
+  CCTL2 = CCIS0 + CM0 + CAP;            // Define CCR2, CAP, ACLK
+  TACTL = TASSEL1 + TACLR + MC1;        // SMCLK, continous mode
+
+
+  while(1) {
+
+    while((CCTL2 & CCIFG) != CCIFG);    /* Wait until capture occured! */
+    CCTL2 &= ~CCIFG;                    /* Capture occured, clear flag */
+    compare = CCR2;                     /* Get current captured SMCLK */
+    compare = compare - oldcapture;     /* SMCLK difference */
+    oldcapture = CCR2;                  /* Save current captured SMCLK */
+
+    if(DELTA == compare) {
+      break;                            /* if equal, leave "while(1)" */
+    } else if(DELTA < compare) {        /* DCO is too fast, slow it down */
+      DCOCTL--;
+      if(DCOCTL == 0xFF) {              /* Did DCO role under? */
+       BCSCTL1--;
+      }
+    } else {                            /* -> Select next lower RSEL */
+      DCOCTL++;
+      if(DCOCTL == 0x00) {              /* Did DCO role over? */
+       BCSCTL1++;
+      }
+                                        /* -> Select next higher RSEL  */
+    }
+  }
+
+  CCTL2 = 0;                            /* Stop CCR2 function */
+  TACTL = 0;                            /* Stop Timer_A */
+
+  BCSCTL1 &= ~(DIVA1 + DIVA0);          /* remove /8 divisor from ACLK again */
+}
+
index fabe89c..c841bec 100644 (file)
@@ -1,4 +1,4 @@
-//GOODFET Echo test.\r
+//GOODFET Blink test.\r
 \r
 \r
 #include "platform.h"\r
 \r
 \r
 #include "platform.h"\r
index a8b398b..e8efa32 100644 (file)
@@ -5,17 +5,20 @@ BSL=tos-bsl --invert-reset --invert-test -c $(PORT)
 #mcu=msp430x1611
 mcu=msp430x1612
 
 #mcu=msp430x1611
 mcu=msp430x1612
 
+#ldscript is wonky
 GCCINC=-T ../../ldscripts/161x.x
 GCCINC=-T ../../ldscripts/161x.x
-CC=msp430-gcc -g -mmcu=$(mcu) -DGCC $(GCCINC) -I ../../include
 
 
+CC=msp430-gcc -g -mmcu=$(mcu) -DGCC $(GCCINC) -I ../../include
 
 
+libs=../../lib/msp430f1612.c
 app=echo
 
 install: $(app)
        $(BSL) -e -p $(app) 
        #$(BSL) -P $(app) -g 0x2500
        $(BSL) -P $(app) -r
 app=echo
 
 install: $(app)
        $(BSL) -e -p $(app) 
        #$(BSL) -P $(app) -g 0x2500
        $(BSL) -P $(app) -r
+$(app): $(app).c $(libs)
 erase:
        $(BSL) -e 
 clean:
 erase:
        $(BSL) -e 
 clean:
-       rm $(app)
+       rm -f $(app)
index fabe89c..1f55288 100644 (file)
@@ -7,16 +7,30 @@
 #include <io.h>\r
 #include <iomacros.h>\r
 \r
 #include <io.h>\r
 #include <iomacros.h>\r
 \r
+\r
 //LED on P1.0\r
 //IO on P5\r
 \r
 //! Initialize registers and all that jazz.\r
 void init(){\r
 //LED on P1.0\r
 //IO on P5\r
 \r
 //! Initialize registers and all that jazz.\r
 void init(){\r
+  volatile unsigned int i;\r
   WDTCTL = WDTPW + WDTHOLD;                 // Stop watchdog timer\r
   \r
   //LED and TX OUT\r
   PLEDDIR |= PLEDPIN;\r
   \r
   WDTCTL = WDTPW + WDTHOLD;                 // Stop watchdog timer\r
   \r
   //LED and TX OUT\r
   PLEDDIR |= PLEDPIN;\r
   \r
+  msp430_init_dco();\r
+  \r
+  msp430_init_uart();\r
+  \r
+  while(1){\r
+    i = 10000;\r
+    while(i--);\r
+    \r
+    serial_tx(0x80);\r
+    PLEDOUT^=PLEDPIN;  // Blink\r
+  }\r
+  \r
   //Enable Interrupts.\r
   //eint();\r
 }\r
   //Enable Interrupts.\r
   //eint();\r
 }\r
@@ -27,6 +41,12 @@ int main(void)
   volatile unsigned int i;\r
   init();\r
   \r
   volatile unsigned int i;\r
   init();\r
   \r
+  \r
+  PLEDOUT^=PLEDPIN;  // Blink\r
+  \r
+  //while(1) serial_tx(serial_rx());\r
+  while(1) serial_tx(0x80);\r
+  \r
   while(1){\r
     i = 10000;\r
     while(i--);\r
   while(1){\r
     i = 10000;\r
     while(i--);\r