|
#include <reg9e5.h>
#define uint8 unsigned char
#define uint16 unsigned int
#define HFREQ 0 // 0=433MHz, 1=868/915MHz 19/08/2004 set 915mhz
#define POWER 3 // 0=min power...3 = max power
#define EE_WRSR 0x01
#define EE_WRITE 0x02
#define EE_READ 0x03
#define EE_WRDI 0x04
#define EE_RDSR 0x05
#define EE_WREN 0x06
//*****************************************************************************
//I/O口定义
//*****************************************************************************
sbit LED = P0^5;
//*****************************************************************************
//配置寄存器
//*****************************************************************************
uint8 idata Nrf9e5Config[10] = {
125, //频道设置
0x0C, //自动重发关,发送节电模式关,输出功率10dB,915MHZ
0x44, //收发地址都为4字节
0x20, //接收数据长度,4字节
0x20, //发送数据长度,4字节
0xCC,
0xCC,
0xCC,
0xCC, //地址
0x58 //CRC开,16位校验,16M晶振,外部时钟使能500KHZ输出
};
//*****************************************************************************
//全局变量
//*****************************************************************************
uint8 RfDataCount = 0;
uint8 DataNum = 0;
uint8 DataLen = 0;
uint8 idata TxBuf[32];
uint8 idata RxBuf[65];
//*****************************************************************************
//函数名:void Delay100us(uint8 n)
//输入:时间
//输出:无
//功能描述:廷时100us
//*****************************************************************************
void Delay100us(uint8 n)
{
uint8 i;
while(n--)
for(i=0;i<35;i++);
}
//*****************************************************************************
//函数名:void delay(uint16 s)
//输入:时间
//输出:无
//功能描述:普通廷时
//*****************************************************************************
void delay(uint16 s)
{
uint16 i;
for(i=0; i<s; i++);
for(i=0; i<s; i++);
}
//*****************************************************************************
//函数名:uint8 SpiReadWrite(uint8 b)
//输入:发送的数据
//输出:收到的数据
//功能描述:SPI发送接收一个字节
//*****************************************************************************
uint8 SpiReadWrite(uint8 b)
{
EXIF &= ~0x20; // 清除SPI中断标致位
SPI_DATA = b;
while((EXIF & 0x20) == 0x00); //等待发送接收完成
return SPI_DATA;
}
//*****************************************************************************
//函数名:InitUart(void)
//输入:无
//输出:无
//功能描述:串口初始化
//*****************************************************************************
void InitUart(void)
{
TH1 = 243; // 19200
CKCON |= 0x10;
PCON = 0x80; // SMOD=1
SCON = 0x52; // 模式1,使能接收
TMOD &= ~0x30;
TMOD |= 0x20;
TR1 = 1; // timer1开启
P0_ALT |= 0x06; // 串口端口使能
P0_DIR |= 0x02; // P0.1 输入
ES = 0;
}
//*****************************************************************************
//函数名:void SendCh(uint8 c)
//输入:发送的数据
//输出:无
//功能描述:发送一个字节
//*****************************************************************************
void UARTPutch(uint8 c)
{
EA = 0;
TI = 0;
SBUF = c;
while(!TI);//等待发送完成
TI = 0;
EA = 1;
}
//*****************************************************************************
//函数名:void InitCpu(void)
//输入:无
//输出:无
//功能描述:Cpu初始化
//*****************************************************************************
void InitCpu(void)
{
uint8 cklf;
SPICLK = 1; // Max SPI clock
SPI_CTRL = 0x02; // SPI接到RF端
RACSN = 0;
SpiReadWrite(RRC | 0x09);
cklf = SpiReadWrite(0) | 0x04;
RACSN = 1;
RACSN = 0;
SpiReadWrite(WRC | 0x09);
SpiReadWrite(cklf);
RACSN = 1;
P0_DIR=P0_DIR&0x1F; //P0.6,P0.5,P0.7 输出
LED=0;
P0_DIR |= 0x18; // P0.3,P0.4 输入
EA = 1;
}
//*****************************************************************************
//函数名:void Init9E5(void)
//输入:无
//输出:无
//功能描述:Nrf9e5初始化,这里我们配置成32位地址。
//*****************************************************************************
void Init9E5(void)
{
uint8 i;
TRX_CE=0;
TXEN=0; //配置模式
RACSN = 0;
SpiReadWrite(WRC);
for(i=0; i<10; i++)
{
SpiReadWrite(Nrf9e5Config); //写入配置寄存器
}
RACSN = 1;
}
//*****************************************************************************
//函数名:TransmitPacket(uint8 *pBuf)
//输入:发送的数据
//输出:无
//功能描述:发送发送缓冲区的数据
//*****************************************************************************
void TransmitPacket(uint8 *pBuf)
{
uint8 i;
EA = 0;
TRX_CE = 0;
TXEN = 1; // Set Tx Mode
Delay100us(12); ///////////////////////
RACSN = 0;
SpiReadWrite(WTP);
for (i=0;i<32;i++)
{
SpiReadWrite(pBuf); // Write dataleth bytes Tx data
}
RACSN = 1;
Delay100us(12);
RACSN=0; // Spi enable for write a spi command
SpiReadWrite(WTA); // Write address command
for(i=0;i<4;i++)
{
SpiReadWrite(Nrf9e5Config[i+5]);
}
RACSN=1; // Spi disable
TRX_CE = 1; // Set TRX_CE high,start Tx data transmission
while(DR==0);
TXEN = 0;
TRX_CE = 1;
EA = 1;
}
//*****************************************************************************
//函数名:uint8 Recepacket(uint8 *pBuf)
//输入:接收数据缓冲区
//输出:成功返回1,否则返回0
//功能描述:接收数据存在缓冲区内
//*****************************************************************************
uint8 Recepacket(uint8 *pBuf)
{
uint8 i;
EA = 0;
TXEN = 0;
TRX_CE = 0;
RACSN = 0;
SpiReadWrite(RRP);
DataNum = SpiReadWrite(0);
if(DataNum == 0x00)
{
DataLen = SpiReadWrite(0);
for(i=2; i<32; i++)//读出数据。
{
pBuf[RfDataCount] = SpiReadWrite(0);
RfDataCount++;
}
}
if(DataNum == 0x01)
{
for(i=1; i<32; i++)//读出数据。
{
pBuf[RfDataCount] = SpiReadWrite(0);
RfDataCount++;
}
}
if(RfDataCount >= DataLen)
{
RfDataCount = DataLen = DataNum = 0;
}
RACSN = 1;
TRX_CE = 1;
while(DR) //直到DR为高。
{
SpiReadWrite(0);
}
TXEN =0;
TRX_CE = 1;
EA =1;
return 1;
}
uint8 EEStatus(void)
{
uint8 temp;
EECSN = 0;
SpiReadWrite(EE_RDSR);
temp = SpiReadWrite(0);
EECSN = 1;
return temp;
}
uint8 EERead(uint16 addr)
{
uint8 temp;
SPICLK = 5;
SPI_CTRL = 0x01;
while((EEStatus()&0x01)!=0x00);
EECSN = 0;
SpiReadWrite(EE_READ);
SpiReadWrite(addr/256);
SpiReadWrite(addr);
temp = SpiReadWrite(0);
EECSN = 1;
SPICLK = 1;//temp2;
SPI_CTRL = 0x02;
return temp;
}
void EEWrite(uint16 addr,uint8 temp)
{
SPICLK = 5;
SPI_CTRL = 0x01;
while((EEStatus()&0x01)!=0x00);
EECSN = 0;
SpiReadWrite(EE_WREN);
EECSN = 1;
EECSN = 0;
SpiReadWrite(EE_WRITE);
SpiReadWrite(addr/256);
SpiReadWrite(addr);
SpiReadWrite(temp);
EECSN = 1;
SPICLK = 1;//temp2;
SPI_CTRL = 0x02;
}
void Process_Rev(uint8 *Data)
{
uint8 i;
switch(Data[0])
{
case 0x01:
TxBuf[0] = 0x00;
TxBuf[1] = 0x0B;
TxBuf[2] = 0x09;
TxBuf[3] = 0x00;
TxBuf[4] = 0x00;
TxBuf[5] = 0x07;
TxBuf[6] = 0xDA;
TxBuf[7] = 0x00;
TxBuf[8] = 0x00;
TxBuf[9] = 0x02;
TxBuf[10]= 0x63;
TxBuf[11]= 0x06;
TxBuf[12]= 0x22;
for(i=13;i<32;i++)
{
TxBuf = 0xFF;
}
for(i=0;i<32;i++)
{
UARTPutch(Data);
}
TransmitPacket(TxBuf);
RxBuf[0] = 0x00;
break;
case 0x02:
if(RfDataCount<DataLen)
{
break;
}
TxBuf[0] = 0x00;
TxBuf[1] = 0x19;
TxBuf[2] = 0x0A;
TxBuf[3] = RxBuf[1];
TxBuf[4] = RxBuf[2];
TxBuf[5] = RxBuf[3];
TxBuf[6] = RxBuf[4];
TxBuf[7] = RxBuf[5];
TxBuf[8] = RxBuf[6];
TxBuf[9] = RxBuf[7];
TxBuf[10]= RxBuf[8];
TxBuf[11]= RxBuf[17]; //Gate
TxBuf[12]= 0x30;
TxBuf[13]= 0x30;
TxBuf[14]= 0x30;
TxBuf[15]= 0x30;
TxBuf[16]= 0x30;
TxBuf[17]= 0x30;
TxBuf[18]= 0x30;
TxBuf[19]= 0x30;
TxBuf[20]= 0x34;
TxBuf[21]= 0x49;
TxBuf[22]= 0x00;
TxBuf[23]= 0x34;
TxBuf[24]= 0x34;
TxBuf[25]= 0x34;
TxBuf[26]= 0x34;
for(i=27;i<32;i++)
{
TxBuf = 0xFF;
}
for(i=0;i<64;i++)
{
//EEWrite(0xF90+i,Data);
//Data = EERead(0xF90+i);
UARTPutch(Data);
}
TransmitPacket(TxBuf);
for(i=0;i<32;i++)
{
UARTPutch(TxBuf);
//EEWrite(0xF90+i,RxBuf);
}
LED = 0;
break;
case 0x03:
LED = 0;
TxBuf[0] = 0x00;
TxBuf[1] = 0x19;
TxBuf[2] = 0x0B;
TxBuf[3] = RxBuf[1];
TxBuf[4] = RxBuf[2];
TxBuf[5] = RxBuf[3];
TxBuf[6] = RxBuf[4];
TxBuf[7] = RxBuf[5];
TxBuf[8] = RxBuf[6];
TxBuf[9] = RxBuf[7];
TxBuf[10]= RxBuf[8];
TxBuf[11]= RxBuf[17]; //Gate
TxBuf[12]= 0x30;
TxBuf[13]= 0x30;
TxBuf[14]= 0x30;
TxBuf[15]= 0x30;
TxBuf[16]= 0x30;
TxBuf[17]= 0x30;
TxBuf[18]= 0x30;
TxBuf[19]= 0x30;
TxBuf[20]= 0x34;
TxBuf[21]= 0x49;
TxBuf[22]= 0x00;
TxBuf[23]= 0x34;
TxBuf[24]= 0x34;
TxBuf[25]= 0x34;
TxBuf[26]= 0x34;
break;
default:
break;
}
}
/***********************************主程序**************************************/
main()
{
uint8 i;
InitCpu(); //初始化CPU
InitUart(); //初始化串口
delay(5000);
Init9E5(); //初始化NRF9E5
LED = 1;
EECSN=1;
TRX_CE = 1;
while(1)
{
if(DR)
{
Recepacket(RxBuf);
Process_Rev(RxBuf);
LED = !LED;
}
}
}
以上是基于Keil开发环境的源码,去掉Process_Rev()函数的case 0x03赋值内容,程序就能正常运行,但增加case 0x03部分赋值内容就无法运行(case 0x02和case 0x03是一样的)。还有一个问题就是,Uartl已经设置为19200了,但为什么变成4800的? |
|