1 //! tilaunchpad clock and I/O definitions
3 // serial io stuff moved to msp430_serial.c
4 // serial is common for the different versions of msp430 so it makes sense
11 #define MSP430_CPU_SPEED 6000000UL
13 #include "msp430_serial.h"
14 extern jmp_buf warmstart;
16 #define USE_NMI_RESET_IRQ
18 static void delay_1us()
20 // 6 Mhz, 6000000 cycles/sec, 6000 cycles/msec, 6 cycles/usec
22 // asummung loop wil be 3 cycles
23 //asm(" nop"); // 1 cycle
24 asm(" nop"); // 1 cycle
25 asm(" nop"); // 1 cycle
26 asm(" nop"); // 1 cycle
29 void delay_us(unsigned int us)
37 void delay_ms(unsigned int ms)
45 void delay_sec(unsigned int s)
53 static char led_pin = 0; // since we are short on pins we might have LED on different pin
55 // led_pin=0 is disabled
56 // BIT2 and BIT3 is on port 5 SBWDIO SBWTCK
57 // BIT6 and BIT7 os on port 3 BRDRX BRDTX
58 void led_init(char pin)
65 } else if (pin & BIT3) {
69 } else if (pin & BIT6) {
72 P3SEL &= ~BIT6; // do not use as uart1
74 } else if (pin & BIT7) {
77 P3SEL &= ~BIT7; // do not use as uart1
85 void led_on() // 0 will disable, but it is up to the application to setup new use
87 // dddputs("led_on=");
91 } else if (led_pin & BIT3) {
93 } else if (led_pin & BIT6) {
95 } else if (led_pin & BIT7) {
103 //dddputs("led_off=");
105 if (led_pin & BIT2) {
107 } else if (led_pin & BIT3) {
109 } else if (led_pin & BIT6) {
111 } else if (led_pin & BIT7) {
126 void led_blink(int n) // long - n shorts
134 for (i = 0; i < n; i++) {
143 void check_usb2serial()
145 //ddputs("usb2serial ");
146 led_init(SBWTCK); // we will use TCK for LED
147 P5DIR &= ~SBWDIO; // input
149 led_on(); // we will use TCK for LED
150 if ((P5IN & SBWDIO) == 0) { // TCK != DIO
151 led_init(0); // no led
152 dputs("low no usb2serial");
155 led_off(); // we will use TCK for LED
156 if (P5IN & SBWDIO) { // TCK != DIO
157 led_init(0); // no led
158 dputs("high no usb2serial");
161 // TCK is jumpered to DIO, lets start working as USB-serial converter.
165 dputs("Serial pass through\n");
166 serputs("Serial pass through\n", txfp0);
169 if (seravailable(rxfp0) > 0) {
173 if (seravailable(rxfp1) > 0) {
177 // FIXME we should sleep
181 char rts_change = 1; // we cannot return 0 in longjmp so we take 1
183 interrupt(PORT1_VECTOR) POSRT1_ISR(void)
186 if ((P1IN & DTR) == 0) {
188 if (rts_change > 10) { // just there is no wrap-around
194 P1IFG &= ~RTS; // clear irq
198 P1IFG &= ~DTR; // clear irq
200 for (i=0; (P1IN & DTR) == 0;i++) { // wait for DTR high
205 if (i>5000) { //avoid spikes
206 longjmp(warmstart, rts_change);
211 #ifdef USE_NMI_RESET_IRQ
212 // A reset is warmstart, ie. do not reset TUSB3410
213 // to use this wire a reset switch or connect TUSB3410 DTR to RST/NMI
214 // for development it is conveenient ot implement a reset function
215 interrupt(NMI_VECTOR) NMI_ISR(void)
219 dputs("NMI(RESET)\n");
221 longjmp(warmstart, rts_change);
224 // TI lauchpad has 12 Mhz X-tal on XT2 which also is the base clock for the TUSB34010
225 // For Launchpad and probably EZ430/FETUIF
226 // EZ430/FETUIF may need BCSCTL2 = SELM1 | DIVM1 | SELS;
230 #ifdef USE_NMI_RESET_IRQ
231 WDTCTL = WDTPW + WDTHOLD + WDTNMI; // Stop WDT, deactivate RESET
232 //IE1 |= NMIIE; // msp430f1612.pdf page 13
234 WDTCTL = WDTPW + WDTHOLD; // Stop WDT
239 // reset for TUSB3410
240 P4OUT &= ~BIT6; // reset TUSB3410
243 BCSCTL1 &= ~0x80; // turn on XT2 oscillator
244 do { // delay for X-tal to settle
246 delay_us(100); // wait at least 50 usec
247 } while (IFG1 & OFIFG);
248 //BCSCTL2 = SELM_2 | DIVM_1 | SELS | DIVS_0; // 6Mhz MCLK=XT2/2 SMCLK=XT2
249 BCSCTL2 = SELM_2 | DIVM_2 | SELS | DIVS_0; // 3Mhz MCLK=XT2/4 SMCLK=XT2
250 // Disable eeprom P3.1 SDA P3.3 SCL
251 P3OUT &= ~(BIT1 | BIT3); // pull dcl and sda down
252 P3DIR |= BIT1 | BIT3;
253 // generate 12 Mhz clock for TUSB3410
254 P5SEL |= BIT5; // P5.5 is SMCLK to TUSG3410
255 P5DIR |= BIT5; // P5.5 is output
256 // release reset for TUSB3410
258 P4OUT &= ~BIT6; // release reset to TUSB3410
259 P4DIR &= ~BIT6; // and release port TUSB3410
260 // P1.3 RTS input, P1.4 DTR input can generate IRQ
261 P1DIR &= ~(RTS | DTR); // input
262 P1SEL &= ~(RTS | DTR); // no special funtions
263 P1IES &= ~RTS; // low to high
264 P1IES |= DTR; // high to low
265 P1IFG &= ~(RTS | DTR); // clear irqs if any, to avoid instant irq
266 P1IE |= RTS | DTR; // enable IRQ on pin 3,4
267 IE1 |= NMIIE; // msp430f1612.pdf page 13
268 ser0_init(0, &fiforx0, &fifotx0);
269 //ser1_init(0, &fiforx1, &fifotx1);
270 ser1_init(0, NULL, NULL);
271 _EINT(); // now we can print
272 dputs("->coldstart<-\n");
274 led_on(); // led comes on after the very basic setup is done
279 #ifdef USE_NMI_RESET_IRQ
280 WDTCTL = WDTPW + WDTHOLD + WDTNMI; // Stop WDT, deactivate RESET
282 IE1 |= NMIIE; // msp430f1612.pdf page 13
284 WDTCTL = WDTPW + WDTHOLD; // Stop WDT
287 ddputs("msp430_init\n");
290 check_usb2serial(); // configure as USB-serial if jumper RST-TEST
295 //! Initialization is correct.
296 void msp430_init_dco_done()