Hello Everyone,
I am trying to communicate 2 MSP430FG439 through SPI.one of my MSP(MASTER) is continuosly sending data on UART . As you can use only one peripheral either SPI or UART in MSP430FG439. i tried to make software SPI code for the master. In slave i m using inbuilt SPI.each MSP is connected to LCD
Slave is able to read the data send by Master.
But my master is not able to read the data send by Slave
Here is my code for Master:
int main(void)
{
unsigned char b;
long int j;
WDTCTL = WDTPW | WDTHOLD;
SCFI0 |= FN_4; // x2 DCO frequency, 8MHz nominal
// DCO
SCFQCTL = 91; // 32768 x 2 x (91 + 1) = 6.03 MHz
FLL_CTL0 = DCOPLUS + XCAP10PF; // DCO+ set so freq = xtal x D x
//(N + 1)
// Loop until 32kHz crystal stabilizes
do
{
IFG1 &= ~OFIFG; // Clear oscillator fault flag
for (j = 50000; j; j--); // Delay
}
while (IFG1 & OFIFG); // Test osc fault flag
set_LCD();
P1DIR |=MOSI + CLK;
P1DIR &= ~( MISO); // Set P1.0 to
b=7;
for(;;)
{
c=spiWr(b);
display_number(c,3,0);
MSDELAY(1000);
MSDELAY(1000);
}
}
unsigned char spiWr(unsigned char c)
{
/* software SPI, send MSB first */
// static unsigned char i;
char ret;
unsigned char mask;
//SPI Mode 0. CS active low. Clock idle 0. Clock rising edge.
P1OUT &= ~CLK; //CLK = 0;
//Enable SPI communication. The SPI Enable signal must be pulsed low for each byte sent!
P1OUT &= ~SS; // = 0;
//Ensure a minimum delay of 500ns between falling edge of SPI Enable signal
//and rising edge of SPI Clock!
MSDELAY(1);
mask = 0x80; //Initialize to write and read bit 7
ret = 0; //Initialize read byte with 0
do {
// MOSI = 0; //Clock out current bit onto SPI Out line
if (c & mask)
P1OUT |= MOSI; //MOSI = 1;
else
P1OUT &= MOSI; //MOSI = 0;
MSDELAY(1);
P1OUT |= CLK; //CLK = 1; //Set SPI Clock line
if (MISO)
ret |= mask; //Read current bit fromSPI In line
MSDELAY(1);
MSDELAY(1);
P1OUT &= ~CLK; //CLK = 0; //Set SPI Clock line
mask = mask >> 1; //Shift mask so that next bit is written and read from SPI lines
MSDELAY(1);
} while (mask != 0);
P1OUT |= SS;
return ret;
// = 1;
}
Here is my code for slave:
void main(void)
{
unsigned char c=0,i=0;
long int j;
WDTCTL = WDTPW | WDTHOLD;
SCFI0 |= FN_4; // x2 DCO frequency, 8MHz nominal
// DCO
SCFQCTL = 91; // 32768 x 2 x (91 + 1) = 6.03 MHz
FLL_CTL0 = DCOPLUS + XCAP10PF; // DCO+ set so freq = xtal x D x
//(N + 1)
// Loop until 32kHz crystal stabilizes
do
{
IFG1 &= ~OFIFG; // Clear oscillator fault flag
for (j = 50000; j; j--); // Delay
}
while (IFG1 & OFIFG); // Test osc fault flag
set_LCD();
P3SEL |= 0x0E; // P3.1-3 SPI option select
P3DIR |= 0x01; // P3.0 output direction
ME1 |= USPIE0; // Enable USART0 SPI mode
UCTL0 |= CHAR + SYNC; // 8-bit SPI Master **SWRST**
UTCTL0 |= CKPH + SSEL0+STC; // SMCLK, 3-pin mode
UCTL0 &= ~SWRST; // Initalize USART state machine
while (1)
{
volatile unsigned int i;
for (i = 0xFFFF; i > 0; i--); // Delay
TXBUF0=5;
while (!(IFG1 & URXIFG0)); // USART0 TX buffer ready?
display_number(RXBUF0,3,0);
}
}
Data from master to slave is going properly. it is displaying 7 on LCD of slave. but when
I am trying to send digit 5 from slave to master but it is always showing me 255.
plz help me to improve this code.