原创 NRF905 接收测试

2008-8-27 08:35 3122 7 7 分类: MCU/ 嵌入式

#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
*/



 

PARTNER CONTENT

文章评论0条评论)

登录后参与讨论
EE直播间
更多
我要评论
0
7
关闭 站长推荐上一条 /3 下一条