📄 f905luointv.c
字号:
/*饱含文件*********************************************/
#include "msp430x11x1.h"
/*缩写定义*********************************************/
#define uchar unsigned char
#define uint unsigned int
#define ulint unsigned long int
/*常数定义***********************************************/
//#define wdt_time250 0x5a15
//#define wdt_close 0x5a95
#define WC 0x00 // Write configuration register command
#define RC 0x10 // Read configuration register command
#define WTP 0x20 // Write TX Payload command
#define RTP 0x21 // Read TX Payload command
#define WTA 0x22 // Write TX Address command
#define RTA 0x23 // Read TX Address command
#define RRP 0x24 // Read RX Payload command
#define chushi_time 0x2000 //2s
#define time_n 2
#define cishu_n 3
#define TX_EN1 P2OUT|=0x20;
#define TX_EN0 P2OUT&=0xdf;//p2.5
#define TRX_CE1 P2OUT|=0x02;
#define TRX_CE0 P2OUT&=0xfd;//p2.1
#define PWR_UP1 P2OUT|=0x04;
#define PWR_UP0 P2OUT&=0xfb;//p2.2
#define MOSI1 P2OUT|=0x01;
#define MOSI0 P2OUT&=0xfe;//p2.0
#define SCK1 P1OUT|=0x04;
#define SCK0 P1OUT&=0xfb;//p1.2
#define CSN1 P1OUT|=0x08;
#define CSN0 P1OUT&=0xf7;//p1.3
#define led11 P1OUT|=0x20;
#define led10 P1OUT&=0xdf;//p1.5
#define led21 P1OUT|=0x80;
#define led20 P1OUT&=0x7f;//p1.7
#define led31 P1OUT|=0x10;
#define led30 P1OUT&=0xef;//p1.4
#define MISO (P1IN&0x02)//p1.1
//#define AM (P1IN&0x04)
#define DR (P1IN&0x01) //p1.0
#define CD (P1IN&0x40) //p1.6
typedef struct RFConfig
{
char n;
char buf[10];
}RFConfig;
const RFConfig RxTxConf =
{
0x0a,
0x01, 0x0c, 0x44, 0x02, 0x02, 0xaa, 0xaa, 0xaa,0xaa, 0x58
};
//0x01,0x00,//-10db
//0x01,0x10,//-10db 低功耗
const uchar Tx_address[4]={0xcc,0xcc,0xcc,0xcc};//rf905卡公共地址
const uchar address[2]={0x00,0x02};
uchar RxBuf[2];
uchar no_rec_n; //
uchar time_dingshi;
uint shijian;
uchar start_flag;
float vcc_value;
uchar led_bit;
uchar led_bit1=0;
void InitIO(void); //初始化IO
void Initt905(void); // Initialize t905
void SetTxMode(void); //将905置成发射模式 // Set nRF905 in Tx mode
void SetRxMode(void); //将905置成接收模式 // Set nRF905 in Rx mode
void TxPacket(void); //将发送缓冲区TxBuf[]中(32BYTE)的数据发送出去 // Send data by nRF905
void RxPacket(void); //将接收的数据放入接收缓冲区RxBuf[](32BYTE) // Recive data by nRF905
void SpiWrite(uchar byte); //将1字节数据通过IO发送出去 // Write data to nRF905
char SpiRead(void); //接收1字节数据 // Read data to nRF905
void Delay(uchar n); // Delay 100us
void init_cpu(void);
void init_ram(void);
void measure_vcc(void); //电池电压检测
void init_ram(void)
{no_rec_n=0;
time_dingshi=time_n;
RxBuf[1]=time_n;
RxBuf[0]=0;
vcc_value=3.0;
led_bit=0xb0;
led11
led21
led31
}
void init_cpu(void)
{ WDTCTL=WDTPW+WDTHOLD; //关闭看门狗定时器
TACTL=TASSEL0+TACLR+ID0+ID1; //ACLK,清TAR,1/8,
CCTL0=CCIE; //CCR0中断允许
CCR0=chushi_time; //定时时间5s
TACTL|=MC0; //增计数
_EINT(); //中断允许
LPM3;
}
void InitIO(void)
{P1DIR=0xbc;
P2DIR=0x27;
WDTCTL=WDTPW+WDTHOLD; //关闭看门狗定时器
Delay(200);
Delay(200);
Delay(200);
Delay(200);
Delay(200);
Delay(200);
Delay(200);
Delay(200);
Delay(200);
Delay(200);
MOSI1
SCK1
CSN1
SCK0
PWR_UP1 // nRF905 power on
TRX_CE0 // Set nRF905 in standby mode
TX_EN0 // set radio in Rx mode
}
void Config905(void)
{
char i;
CSN0 // Spi enable for write a spi command
SpiWrite(WC); // Write config command
for (i=0;i<RxTxConf.n;i++) // Write configration words
{
SpiWrite(RxTxConf.buf[i]);
}
CSN1 // Disable Spi
}
void Initt905(void) // Initialize t905
{ InitIO(); //Set nRF905 in standby mode
Config905(); //Config nRF905 module
SetRxMode(); //Set nRF905 in Rx mode
}
void Delay(uchar n)
{ uchar i;
while(n--)
for(i=0;i<72;i++)
{;
}
}
void SpiWrite(uchar byte)
{
char i;
for (i=0;i<8;i++) // Setup byte circulation bits
{
if ((byte&0x80)==0x80)//if(flag) // Put DATA_BUF.7 on data line
MOSI1
else
MOSI0
SCK1 // Set clock line high
byte=byte<<1; // Shift DATA_BUF
SCK0 // Set clock line low
}
}
char SpiRead(void)
{
char i,j;
for (i=0;i<8;i++) // Setup byte circulation bits
{
j=j<<1; // Right shift DATA_BUF
SCK1 // Set clock line high
if (MISO)
j=j|0x01; // Read data
else
j=j&0xfe;
SCK0 // Set clock line low
}
return(j); // Return function parameter
}
void TxPacket(void)
{
uchar i;
SetTxMode();
//Config905();
CSN0 // Spi enable for write a spi command
SpiWrite(WTP); // Write payload command
//for(i=0;i<2;i++)
// {SpiWrite(0xaa);
// }
SpiWrite(address[0]); // Write 32 bytes Tx data
SpiWrite(address[1]);
//address[0]++;
CSN1 // Spi disable
Delay(1);
CSN0 // Spi enable for write a spi command
SpiWrite(WTA); // Write address command
for (i=0;i<4;i++) // Write 4 bytes address
{
SpiWrite(Tx_address[i]);
}
CSN1 // Spi disable
TRX_CE1 // Set TRX_CE high,start Tx data transmission
Delay(1); // while (DR!=1);
TRX_CE0
PWR_UP1 // Set TRX_CE low
SetRxMode();
}
void RxPacket(void)
{ //uint i;
TRX_CE0 // Set nRF905 in standby mode
CSN0 // Spi enable for write a spi command
SpiWrite(RRP); // Read payload command
RxBuf[0]=SpiRead();
RxBuf[1]=SpiRead();
CSN1 // Disable spi
/*for(i=0;i<0xb000;i++)
{if(DR||AM)
_NOP();
else
break;
} //接受完以后处于standby mode*/
/* while(DR||AM)
{;}
TRX_CE1 */ //RxMode
no_rec_n=0;
if(RxBuf[1]!=0x00)
time_dingshi=RxBuf[1];
else
{time_dingshi=time_n;
RxBuf[1]=time_n;
}
if((RxBuf[0]&0x01)!=0x01)
led_bit=led_bit|0x80;
else
led_bit=led_bit&0x7f;
if((RxBuf[0]&0x02)!=0x02)
led_bit=led_bit|0x10;
else
led_bit=led_bit&0xef;
}
void SetTxMode(void)
{
TX_EN1
TRX_CE0
Delay(1); // delay for mode change(>=650us)
}
void SetRxMode(void)
{
TX_EN0
TRX_CE1
Delay(1); // delay for mode change(>=650us)
}
void init(void)
{init_ram();
Initt905();
init_cpu();
}
interrupt[TIMERA0_VECTOR] void Timer_A(void)
{uint i;
time_dingshi--;
if((time_dingshi==0)&&(vcc_value>=2.0))
{ PWR_UP1
Delay(5);
SetRxMode(); //启动接受模式
// for(i=0;i<0x1000;i++)
// {if(!CD) //判断CD信号
// {
TxPacket(); //发送数据
// break;
// }
// }
if(i!=0x1000)
{for(i=0;i<0x1000;i++)
{ if(DR)
{RxPacket();
break;
} //等待接受数据
}
}
TRX_CE0 //Set nRF905 in standby mode
PWR_UP0
if(i==0x1000)
{no_rec_n++;
if(no_rec_n>=cishu_n)
{no_rec_n=0;
time_dingshi=time_n;
led_bit=0xb0;
RxBuf[1]=time_n;
}
else
time_dingshi=RxBuf[1];
}
}
shijian++;
if(shijian>=3600)
{
shijian=0;
measure_vcc();
}
if(led_bit1)
{led_bit1=0;
P1OUT=(P1OUT&0x4f)|led_bit;
}
else
{led_bit1=1;
P1OUT=P1OUT|0xb0;
}
}
void measure_vcc(void) //电池电压检测
{uint i,value;
CACTL1=CAON; //比较器打开,上升沿中断允许
CACTL2=P2CA0+P2CA1; //CA0,CA1均与外部连接
P2DIR|=BIT0;
P2OUT&=~BIT0;
P2OUT|=BIT0;
for(i=0;i<1000;i++)
; //关闭比较器中断
value=0;
for(i=0;i<5000;i++)
{if((CACTL2&CAOUT)==1)
P2OUT&=~BIT0;
else
{P2OUT|=BIT0;
value++;
}
}
CACTL1=0x00;
CACTL2=0x00;
vcc_value=1.23*5000/(float)value;
if(vcc_value<2.2)
led_bit=led_bit&0xdf;
else if(vcc_value>2.3)
led_bit=led_bit|0x20;
}
main(void)
{
init();
while(1)
{;}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -