#include #include #define START 0x80 // P2.7 #define PWDN 0xFE // P2.0 #define CLKSEL 0xF7 // P2.3 #define CS 0xEF // P2.4 #define DRDY 0x02 // P2.1 char RES[24]; //儲存ADS1291暫存器的值 char i; /* disable CS, 開啟SPI介面 3-pin, 8-bit SPI master, MSB . SCLK=SMCLK/2 */ void configure_spi(void) { P2DIR |= 0X99; // P2.0, 3, 4, 7 for RESET/PWDN, CLKSEL, CS, START P3SEL |= BIT0 + BIT1 + BIT2; // P3.0,1,2 SPI option select . P3.2 SCLK(if ADS1291 use internal CLK=512KHZ,SCLK MAX =1024KHZ) P2OUT |= ~CS; // Disable CS UCB0CTL1 |= UCSWRST; // **Put state machine in reset** UCB0CTL0 |= UCMST+UCSYNC+UCMSB; // 3-pin, 8-bit SPI master, MSB UCB0CTL1 |= UCSSEL_2; // SMCLK UCB0BR0 = 0x02; // /2 UCB0BR1 = 0x00; // 如果MSP使用內部CLK 如果ADS使用內部CLK=512KHZ ADS SCLK=500KHZ=1MHZ/2 UCB0CTL1 &= ~UCSWRST; // **Initialize USCI state machine* } void main(void) { WDTCTL = WDTPW + WDTHOLD; // Stop WDT configure_spi(); P2OUT &= PWDN; //p2.0=0(Low) P2OUT &= ~START; //p2.7=0(Low) START=0 P2OUT |= ~PWDN; //p2.0=1(High) P2OUT |= ~CLKSEL; // CLKSEL Pin =1 (內部振盪器512KHZ) CLKSEL Pin = 0 (外部振盪器 ) P2OUT &= CS; // CS=0 Enable CS /* 開始寫入ads1291 暫存器 */ while (!(UCB0IFG & UCTXIFG)); UCB0TXBUF = 0x41; //01000001 從01h 開始寫 while (!(UCB0IFG & UCTXIFG)); UCB0TXBUF = 0x03; //00000011 寫4個暫存器 while (!(UCB0IFG & UCTXIFG)); // WREG CONFIG1 0x83 10000011 UCB0TXBUF = 0x83; while (!(UCB0IFG & UCTXIFG)); // WREG CONFIG2 0xE2 11100010 UCB0TXBUF = 0xE2; while (!(UCB0IFG & UCTXIFG)); // WREG Lead-Off Control Register 0x11 00010001 UCB0TXBUF = 0x11; while (!(UCB0IFG & UCTXIFG)); // WREG CH1 0x15 00010101 UCB0TXBUF = 0x15; /* 開始讀ads1291暫存器 */ while (!(UCB0IFG & UCTXIFG)); // RREG starting at address 1 00100001 01h 開始讀 UCB0TXBUF = 0x21; while (!(UCB0IFG & UCTXIFG)); // 讀5個 Registers UCB0TXBUF = 0x04; while (!(UCB0IFG & UCTXIFG)); // first dummy data UCB0TXBUF = 0x00; while (!(UCB0IFG & UCTXIFG)); // another dummy data UCB0TXBUF = 0x00; while (!(UCB0IFG & UCRXIFG)); RES[0] = UCB0RXBUF; while (!(UCB0IFG & UCTXIFG)); UCB0TXBUF = 0x00; while (!(UCB0IFG & UCRXIFG)); RES[1] = UCB0RXBUF; while (!(UCB0IFG & UCTXIFG)); UCB0TXBUF = 0x00; while (!(UCB0IFG & UCRXIFG)); RES[2] = UCB0RXBUF; while (!(UCB0IFG & UCTXIFG)); UCB0TXBUF = 0x00; while (!(UCB0IFG & UCRXIFG)); RES[3] = UCB0RXBUF; while (!(UCB0IFG & UCTXIFG)); UCB0TXBUF = 0x00; while (!(UCB0IFG & UCRXIFG)); RES[4] = UCB0RXBUF; }