|
|
@ -0,0 +1,168 @@ |
|
|
|
#include <msp430fr6989.h> |
|
|
|
|
|
|
|
//GPIO definitions |
|
|
|
#define CSBdefinition P1SEL1 |= BIT4 // Configure UCA0STE (slave select) |
|
|
|
#define CLKdefinition P1SEL1 |= BIT5 // Configure UCA0CLK |
|
|
|
#define SIMOdefinition P2SEL0 |= BIT0 // Configure UCA0SIMO/TXD |
|
|
|
//Output configuration |
|
|
|
#define DDRP1 P1DIR = 0x78; // 0111 1000 |
|
|
|
#define DDRP2 P1DIR |= BIT0; |
|
|
|
///////////////////////////////////////// |
|
|
|
#define RST_0 P1OUT &= ~BIT3 |
|
|
|
#define RST_1 P1OUT |= BIT3 |
|
|
|
|
|
|
|
#define CSB_0 P1OUT &= ~BIT4 |
|
|
|
#define CSB_1 P1OUT |= BIT4 |
|
|
|
|
|
|
|
#define RS_0 P1OUT &= ~BIT6 |
|
|
|
#define RS_1 P1OUT |= BIT6 |
|
|
|
|
|
|
|
#define SI_0 P2OUT &= ~BIT0 |
|
|
|
#define SI_1 P2OUT |= BIT0 |
|
|
|
|
|
|
|
// Global variables |
|
|
|
unsigned char text1[] = {"Hi :D "}; |
|
|
|
unsigned char text2[] = {"It's done! "}; |
|
|
|
|
|
|
|
unsigned int position; |
|
|
|
|
|
|
|
//************************** |
|
|
|
// MSP430F59xx Demo - eUSCI_A0, SPI 4-Wire Master |
|
|
|
// |
|
|
|
// Description: SPI master send data to SPI slave using 4-wire mode. |
|
|
|
// ACLK = 32.768kHz, MCLK = SMCLK = DCO ~1MHz. BRCLK = ACLK/2 |
|
|
|
// |
|
|
|
// |
|
|
|
// MSP430FR6989 |
|
|
|
// ----------------- |
|
|
|
// /|\| XIN|- |
|
|
|
// | | | 32KHz Crystal |
|
|
|
// --|RST XOUT|- |
|
|
|
// | | |
|
|
|
// | P2.0|-> Data Out (UCA0SIMO) |
|
|
|
// | | |
|
|
|
// | P1.3|-> RST LCD |
|
|
|
// | P1.6|-> RS LCD |
|
|
|
// | P1.5|-> Serial Clock Out (UCA0CLK) |
|
|
|
// | P1.4|-> Slave Select (UCA0STE) |
|
|
|
// | | |
|
|
|
// |
|
|
|
// William Goh |
|
|
|
// Texas Instruments Inc. |
|
|
|
// April 2014 |
|
|
|
// Built with IAR Embedded Workbench V5.60 & Code Composer Studio V6.0 |
|
|
|
//************************** |
|
|
|
|
|
|
|
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// |
|
|
|
|
|
|
|
//Function initialization |
|
|
|
void initLCD(); |
|
|
|
void initSPI(); |
|
|
|
void display(); |
|
|
|
|
|
|
|
void wData(unsigned char d); |
|
|
|
void wCommand(unsigned char c); |
|
|
|
|
|
|
|
volatile unsigned char TXData; |
|
|
|
|
|
|
|
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// |
|
|
|
|
|
|
|
void main(void) |
|
|
|
{ |
|
|
|
WDTCTL = WDTPW | WDTHOLD; // Stop watchdog timer |
|
|
|
PM5CTL0 &= ~LOCKLPM5; // Disable the GPIO power-on default high-impedance mode to activate |
|
|
|
|
|
|
|
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// |
|
|
|
//Pin configuration |
|
|
|
CSBdefinition; // Configure UCA0STE (slave select) |
|
|
|
CLKdefinition; // Configure UCA0CLK |
|
|
|
SIMOdefinition; // Configure UCA0SIMO/TXD |
|
|
|
PJSEL0 |= BIT4 | BIT5; // For XT1 |
|
|
|
|
|
|
|
DDRP1; |
|
|
|
DDRP2; |
|
|
|
|
|
|
|
initSPI(); |
|
|
|
|
|
|
|
initLCD(); |
|
|
|
__delay_cycles(50); |
|
|
|
display(); |
|
|
|
__delay_cycles(50); |
|
|
|
|
|
|
|
while(1){ |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
}//main |
|
|
|
|
|
|
|
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// |
|
|
|
|
|
|
|
void initSPI(void){ |
|
|
|
|
|
|
|
// Configure USCI_A0 for SPI operation |
|
|
|
UCA0CTLW0 = UCSWRST; // **Put state machine in reset** |
|
|
|
|
|
|
|
UCA0CTLW0 |= UCSSEL__SMCLK; // Choose SMLCK (1MHz) |
|
|
|
UCA0BR0 = 0x04;//4 // Set prescaler to 8 to get SCLK=125kHz |
|
|
|
UCA0BR1 = 0; |
|
|
|
UCA0MCTLW = 0; |
|
|
|
// By default -> 4-pin, 8-bit SPI master |
|
|
|
UCA0CTLW0 |= UCMST; // Master mode |
|
|
|
UCA0CTLW0 |= UCSYNC; // Synchronous mode |
|
|
|
UCA0CTLW0 |= UCCKPL; // Clock polarity high |
|
|
|
UCA0CTLW0 |= UCMSB; // MSB first (Most Significant Bit) |
|
|
|
UCA0CTLW0 |= UCMODE_2; // 4-pin SPI with UCxSTE active high |
|
|
|
UCA0CTLW0 |= UCSTEM; // Generate the enable signal for a 4-wire slave |
|
|
|
|
|
|
|
UCA0CTLW0 &= ~UCSWRST; // **Initialize USCI state machine** |
|
|
|
|
|
|
|
UCA0IE |= UCTXIE; // Enable USCI_A0 TX interrupt |
|
|
|
UCA0IFG &= ~UCTXIFG; |
|
|
|
} |
|
|
|
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// |
|
|
|
|
|
|
|
//Initialize the LCD |
|
|
|
void initLCD(){ |
|
|
|
|
|
|
|
RST_0; //reset |
|
|
|
__delay_cycles(2); |
|
|
|
RST_1; //end reset |
|
|
|
__delay_cycles(20); |
|
|
|
wCommand(0x30); //wake up |
|
|
|
__delay_cycles(2); |
|
|
|
wCommand(0x30); //wake up |
|
|
|
wCommand(0x30); //wake up |
|
|
|
wCommand(0x39); //function set |
|
|
|
wCommand(0x14); //internal osc frequency |
|
|
|
wCommand(0x56); //power control |
|
|
|
wCommand(0x6D); //follower control |
|
|
|
wCommand(0x70); //contrast |
|
|
|
wCommand(0x0C); //display on |
|
|
|
wCommand(0x06); //entry mode |
|
|
|
wCommand(0x01); //clear |
|
|
|
__delay_cycles(100); |
|
|
|
} |
|
|
|
void wCommand(unsigned char c){ |
|
|
|
CSB_0; //CSB active |
|
|
|
RS_0; //Command/Instruction |
|
|
|
UCA0TXBUF = c; |
|
|
|
CSB_1; //CSB disabled |
|
|
|
__delay_cycles(200); |
|
|
|
} |
|
|
|
void wData(unsigned char d){ |
|
|
|
CSB_0; //CSB active |
|
|
|
RS_1; //Data |
|
|
|
UCA0TXBUF = d; |
|
|
|
CSB_1; //CSB disabled |
|
|
|
} |
|
|
|
void display(){ |
|
|
|
int a; |
|
|
|
wCommand(0x80); |
|
|
|
for(a=0; a<16; a++){ |
|
|
|
wData(text1[a]); |
|
|
|
} |
|
|
|
wCommand(0xC0); |
|
|
|
for(a=0; a<16; a++){ |
|
|
|
wData(text2[a]); |
|
|
|
} |
|
|
|
} |