#include "pic.h"
//****************************************************************************
#define uchar unsigned char
#define uint unsigned int
//********************************模式控制定义********************************
#define TX_EN RC1 //输出
#define TRX_CE RC2 //输出
#define PWR RB1 //输出
//********************************SPI口定义***********************************
#define MISO RC4 //输入
#define MOSI RC5 //输出
#define SCK RC3 //输出
#define CSN RC0 //输出
//********************************状态输出口*********************************
#define CD RB2 //输入
#define AM RB3 //输入
#define DR RB0 //输入
//********************************数码管位选*********************************
#define W1 RB7 //输出
#define W2 RB6 //输出
#define W3 RB5 //输出
#define W4 RB4 //输出
//********************************nRF905控制指令******************************
#define WC 0x00
#define RRC 0x10
#define WTP 0x20
#define RTP 0x21
#define WTA 0x22
#define RTA 0x23
#define RRP 0x24
//*********************************函数申明***********************************
void Delay(uchar n);
void Spi_initial();
uchar SpiReadSpiWrite(uchar DATA);
void nRF905Init(void);
void Config905(void);
void SetRxMode(void);
uchar CheckDR(void);
void RxPacket(void);
void RX(void);
void StartUART( void );
void R_S_Byte(uchar R_Byte);
//*********************************RF寄存器配置***********************************
uchar RFConf[11]=
{
0x00, //在初始化前必须先写配置命令----WC
0x4c, //CH_NO,配置频段在430MHZ
0x2c, //输出功率为10db,不重发,节电为正常模式
0x44, //地址宽度设置,为4字节
0x20,0x20, //接收发送有效数据长度为32字节
0xcc,0xcc,0xcc,0xcc, //接收地址
0x58, //CRC充许,8位CRC校验,外部时钟信号不使能,16M晶振
};
//*********************************收发缓冲区**************************8*********
uchar TxRxBuffer[32];
//*********************************延时函数**************************************
void Delay(uchar n)
{
uchar k;
while(n--)
for(k=0;k<80;k++);
}
//********************************SPI初始化*************************************
void Spi_initial()
{
TRISC=TRISC&0xDF; //r设置SDO(RC5)为输出**0*****
TRISC=TRISC&0xF7; //r设置SCK(RC3)为输出****0***
TRISC=TRISC|0x10; //r设置SDI(RC4)为输入***1****
INTCON=0x00; //r关闭所有中断
PIR1=0x00; //r
SSPCON=0x20; //r写入时没有冲突发生,接收时没有溢出,开启SPI功能,空闲时处于低电平,fosc/4
SSPSTAT=0xc0; //r上升沿时发送,
SSPIF=0; //rPIR1=PIR1|0x08 ;
}
//*********************************SPI读写*************************************
uchar SpiReadSpiWrite(uchar DATA) //r
{
uchar b;
Spi_initial();
SSPBUF=DATA; //写入要发送数据发送的同时也得到数据
while(SSPIF==0);
SSPIF=0;
b=SSPBUF; //把得到数据保存
return b;
}
//******************************初始化nRF905*********************************
void system_Init(void) //r
{
TRISA=0x00;
TRISB=0x0D;
TRISC=0x90;
TRISD=0x00;
TRISE=0x00;
ADCON1=0x07; //必须有,设置为数字I/0口
CSN=1; // Spi disable
SCK=0; // Spi clock line init low
DR=0; // Init DR for input
AM=0; // Init AM for input
CD=0; // Init CD for input
PWR=1; // nRF905 power on
TRX_CE=0; // Set nRF905 in standby mode
TX_EN=0; // set radio in Rx mode
}
//*****************************初始化nRF905寄存器*********************************
void Config905(void)
{
uchar i;
CSN=0; // Spi enable for write a spi command
for (i=0;i<11;i++) // Write configration words 写配置字
{
SpiReadSpiWrite(RFConf);
}
CSN=1; // Disable Spi
}
//*****************************设置接收模式**********************************************
void SetRxMode(void)
{
TX_EN=0;
Delay(1);
TRX_CE=1;
Delay(1); // delay for mode change(>=650us)
}
//*****************************读取接收数据**********************************************
void RxPacket(void) //读数据
{
uchar i;
Delay(1);
TRX_CE=0;
CSN=0; // Spi enable for write a spi command
Delay(1);
SpiReadSpiWrite(RRP);
for (i = 0 ;i < 32 ;i++)
{
TxRxBuffer=SpiReadSpiWrite(0); // Read data and save to buffer
}
CSN=1 ;
while (AM||DR); //等待读完毕DR=0,AM=0
TRX_CE=1;
}
//*********************************数据接收*********************************************
void RX(void)
{
SetRxMode(); // Set nRF905 in Rx mode
while(DR==0); //等待接收数据
Delay(1);
RxPacket(); // 提取接收到数据
Delay(1);
}
//*********************************USART串口初始化*************************************
void StartUART(void)
{
TXSTA=0x04; //设定TXSTA寄存器。同步从模式,8位数据,数据发送禁止,
SPBRG=103; //6MHZ, BR1GH=1, 4.8kbps.
PIE1=0; //清除PIE1所有中断使能。
RCSTA=0x80; //禁止接收,打开通讯端口
TRISC=TRISC|0X80; //将RC7(RX)设置为输入方式
TRISC=TRISC&0XBF; // RC6(TX)设置为输出
TXEN=1; //启动发送,TSR开始移位操作。
}
//*********************************串口输出数据*****************************************
void R_S_Byte(uchar R_Byte)
{
TXREG= R_Byte;
}
//*********************************主函数************************************************
void main(void)
{
char i,count;
PORTE=0xff; //关闭蜂明器
PORTD=0xff; //关闭数码管
StartUART(); //串口初始化
system_Init(); //系统初始化
Delay(10);
Config905(); //写入10字节控制字
W1=0;W2=0;W3=0;W4=0;
while(1)
{
RX(); //接收数据
if(TxRxBuffer[0])
{
for(i=0;i<32;i++) //将接收到数据发送给电脑,并通过串口助手软件检验收发数据是否一样
{
R_S_Byte(TxRxBuffer);
Delay(20);
}
}
count++;
if(count==4)
{
count=0;
}
switch(count)
{
case 0x01:
PORTD= 0xbf;
break;
case 0x02:
PORTD= 0xf7;
break;
case 0x03:
PORTD= 0xfe;
break;
default: break;
}
}
}
/* 可以用以下方式通过来读写配置字来检验是否读写配置是否成功
CSN=0; //SPI使能
Delay(1);
SpiReadSpiWrite(RRC); //写入控制字
for(j=0;j<10;j++) //读出配置字
{
temp[j]=SpiReadSpiWrite(0);
}
for(j=0;j<10;j++)
{
R_S_Byte(temp[j]); //串口显示
Delay(1000);
}
CSN=1; //禁止SPI
*/
文章评论(0条评论)
登录后参与讨论