#include "Msp430X14X.h"
#define CE BIT0
#define CS BIT1
#define PWR_UP BIT3
#define ADDR_INDEX 8
#define ADDR_COUNT 4
void CE_HI(void);
void CE_LO(void);
void CS_HI(void);
void CS_LO(void);
void PWR_UP_HI(void);
void PWR_UP_LO(void);
void Init_CLK(void);
void Port_Init(void);
void Init_SPI (void);
void Delay_us(unsigned long nValue);
void Delay_ms(unsigned long nValue);
void Init_RF2401(void);
char ReceivePacket(void);
void TransmitPacket(unsigned char nVal);
unsigned char UART0_TX_BUF[25];
int nTX0_Len;
char nTX0_Flag;
int nSend_TX0;
int nDR;
unsigned char rxConfig[15] = {
0x08, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x87, 0x65, 0x43, 0x21, 0x83, 0x6c, 0x05
};
unsigned char txConfig[15] = {
0x08, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x87, 0x65, 0x43, 0x21, 0x83, 0x6c, 0x04
};
void main(void)
{
char n;
WDTCTL = WDTPW + WDTHOLD;
_DINT();
Init_CLK();
Port_Init();
Init_SPI();
_EINT();
Init_RF2401();
while(1)
{
TransmitPacket(3);
Delay_ms(3);
n = ReceivePacket();
}
}
void Port_Init(void)
{
P1DIR = 0;
P1DIR |= BIT0;
P1DIR |= BIT1;
P1DIR |= BIT3;
P1IE = 0;
P1IES = 0;
P1IFG = 0;
P1IE |= BIT2;
P1IES &= ~(BIT2);
P3SEL = 0;
P3SEL = BIT3 + BIT2 + BIT1;
P3DIR |= BIT3;
P3DIR |= BIT1;
return;
}
void Init_SPI (void)
{
ME1 |= USPIE0;
U0CTL = 0X00;
U0CTL |= CHAR + SYNC + MM;
U0TCTL = 0X00;
U0TCTL = CKPH + SSEL1 + SSEL0 + STC;
UBR0_0 = 0X20;
UBR1_0 = 0X03;
UMCTL_0 = 0X00;
IE1 |= UTXIE0;
}
void CE_HI(void)
{
P1OUT |= BIT0;
return;
}
void CE_LO(void)
{
P1OUT &= ~(BIT0);
return;
}
void CS_HI(void)
{
P1OUT |= BIT1;
return;
}
void CS_LO(void)
{
P1OUT &= ~(BIT1);
return;
}
void PWR_UP_HI(void)
{
P1OUT |= BIT3;
return;
}
void PWR_UP_LO(void)
{
P1OUT &= ~(BIT3);
return;
}
void Init_CLK(void)
{
unsigned int i;
BCSCTL1 = 0X00;
do
{
IFG1 &= ~OFIFG;
for (i = 0x20; i > 0; i--);
}
while ((IFG1 & OFIFG) == OFIFG);
BCSCTL2 = 0X00;
BCSCTL2 += SELM1;
BCSCTL2 += SELS;
}
interrupt [UART0TX_VECTOR] void UART0_TX_ISR(void)
{
if(nTX0_Len != 0)
{
nTX0_Flag = 0;
TXBUF0 = UART0_TX_BUF[nSend_TX0];
nSend_TX0 += 1;
if(nSend_TX0 >= nTX0_Len)
{
nSend_TX0 = 0;
nTX0_Len = 0;
nTX0_Flag = 1;
}
}
}
interrupt [PORT1_VECTOR] void DR_ISR(void)
{
if(P1IFG & BIT2)
{
nDR = 1;
P1IFG &= ~(BIT2);
}
}
void Delay_ms(unsigned long nValue)
{
unsigned long nCount;
int i;
unsigned long j;
nCount = 2667;
for(i = nValue;i > 0;i--)
{
for(j = nCount;j > 0;j--);
}
return;
}
void Delay_us(unsigned long nValue)
{
int nCount;
int i;
int j;
nCount = 3;
for(i = nValue;i > 0;i--)
{
for(j = nCount;j > 0;j--);
}
return;
}
void Init_RF2401(void)
{
int i;
nDR = 0;
PWR_UP_HI();
Delay_ms(4);
CS_HI();
Delay_us(100);
CE_LO();
Delay_us(100);
for(i = 0;i < 15;i++)
{
UART0_TX_BUF[i] = rxConfig[i];
}
nTX0_Len = 15;
IFG1 |= UTXIFG0;
}
void TransmitPacket(unsigned char nVal)
{
unsigned char i;
CS_HI();
Delay_us(10);
TXBUF0 = 0x05;
CS_LO();
Delay_us(300);
CE_HI();
Delay_us(10);
for(i = 0;i < ADDR_COUNT;i++)
{
UART0_TX_BUF[i] = rxConfig[ADDR_INDEX + i];
}
UART0_TX_BUF[i] = nVal;
nTX0_Len = ADDR_COUNT + 1;
IFG1 |= UTXIFG0;
CE_LO();
Delay_us(300);
}
char ReceivePacket(void)
{
char nVal;
CS_HI();
Delay_us(10);
TXBUF0 = 0x04;
CS_LO();
Delay_us(300);
CE_HI();
while(1)
{
if(nDR == 1)
{
break;
}
}
TXBUF0 = 0x0;
while ((IFG1 & UTXIFG0) == 0) ;
nVal = RXBUF0;
CE_LO();
Delay_us(300);
return nVal;
}