原创 NRF905 发送测试

2008-8-26 14:12 2559 8 8 分类: 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      //输出
//********************************905-SPI指令********************************
#define WC 0x00
#define RRC 0x10
#define WTP 0x20
#define RTP 0x21
#define WTA 0x22
#define RTA 0x23
#define RRP 0x24
//********************************函数初始化********************************
void Delay(uchar x);
void Spi_initial();
uchar SpiReadSpiWrite(uchar DATA);
void system_Init(void);
void Config905(void);
void TxPacket(void);
void SetTxMode(void);
unsigned char CheckCD(void);
void TX(void);
void StartUART(void);
void R_S_Byte(uchar R_Byte);
//*****************************待发发送的32字节数据************************
uchar TxRxBuf[32]=        //发送数据
{
0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x08,
0x09,0x10,0x11,0x12,0x13,0x14,0x15,0x16,
0x17,0x18,0x19,0x20,0x21,0x22,0x23,0x24,
0x25,0x26,0x27,0x28,0x29,0x30,0x31,0x32,
};
//********************************接收端地址********************************
uchar TxAddress[4]={0xcc,0xcc,0xcc,0xcc };    //接收地址
//********************************初始化nRF905********************************
uchar RFConf[11]=
{
  0x00,                             //配置命令//
  0x4c,                             //CH_NO,配置频段在430MHZ
  0x2C,                             //输出功率为10db,不重发,节电为正常模式
  0x44,                             //地址宽度设置,为4字节
  0x20,0x20,                        //接收发送有效数据长度为32字节
  0xCC,0xCC,0xCC,0xCC,              //接收地址
  0x58,                              //CRC充许,8位CRC校验,外部时钟信号不使能,16M晶振
};
//********************************延时**************************************
void Delay(uchar x)               //设置延时
{
 uchar i;
 while(x--)
 for(i=0;i<80;i++);
}
//********************************SPI模式初始化********************************
void Spi_initial()
{
 INTCON=0x00;  //关闭所有中断
 PIR1=0x00;  
 SSPCON=0x20;  //写入时没有冲突发生,接收时没有溢出,开启SPI功能,空闲时处于低电平,fosc/4
 SSPSTAT=0xc0;  //上升沿时发送,
 ADCON1=0x07;
 SSPIF=0;     //PIR1=PIR1|0x08 ;
}
//********************************SPI数据读写************************************** 
uchar SpiReadSpiWrite(uchar DATA)//r
{
 uchar b;
 Spi_initial();
 SSPBUF=DATA;   //写入要发送数据发送的同时也得到数据
 do
 {
 ;
 }
 while(SSPIF==0);
 SSPIF=0; 
 b=SSPBUF;  //把得到数据保存
 return b;
 }
//********************************系统初始化**************************************
void system_Init(void)   //r
{
 TRISA=0x00;
 TRISB=0x0D;
 TRISC=0x90;
 TRISD=0x00;
 TRISE=0x00; 
 ADCON1=0x07;  //
    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
}
//********************************初始化寄存器********************************
void Config905(void)
{
 uchar i;
 CSN=0; 
 Delay(1);    // Spi enable for write a spi command
 //SpiWrite(WC);    // Write config command写放配置命令
 for (i=0;i<11;i++)   // Write configration words  写放配置字
 {
  SpiReadSpiWrite(RFConf);
 }
 CSN=1;     // Disable Spi
}
//********************************待发数据打包********************************
void TxPacket(void)
{
 uchar i;
 CSN=0;
 Delay(1);
 SpiReadSpiWrite(WTP);       //向nrf905加载32字节待发数据
 for (i=0;i<32;i++)
 {
 SpiReadSpiWrite(TxRxBuf);  // Write 32 bytes Tx data
 }       
 CSN=1;        // Spi disable
 Delay(1);     
 CSN=0;           // Spi enable for write a spi command
 SpiReadSpiWrite(WTA);    // Write address command
 for (i=0;i<4;i++)            // 加载4字节地址
 {
 SpiReadSpiWrite(TxAddress);
 }
 CSN=1;             // 关闭SPI
 TRX_CE=1;        // 激发数据无线发送
 Delay(1);                 // while (DR!=1);
 TRX_CE=0;             // Set TRX_CE low
}
//*******************************************************************************
void SetTxMode(void)      //发送模式初始化状态设置
{
 TRX_CE=0;        //
 TX_EN=1;        //发送使能
 Delay(1);        // delay for mode change(>=650us)
}
//********************************************************************************
void TX(void)
{
    SetTxMode();   // Set nRF905 in Tx mode
 TxPacket();       // Send data by nRF905
}
//********************************USART串口初始化********************************
void StartUART(void)
{
 TXSTA=0x04;    //设定TXSTA寄存器。同步从模式,8位数据,数据发送禁止,
 SPBRG=51;     //16MHZ, BRGH="1".92kbps.
 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; 
}
//********************************主函数*************************************
main()
{


 PORTE=0xff;    //关闭蜂明器
 PORTD=0xbf;         
 StartUART();   //串口初始化
 system_Init();   //系统初始化
 Config905();   //写入配置字
 W1=0; W2=0; W3=0; W4=0;
 while(1)
 {
 TX();     //循环数据发送


 } 
}

PARTNER CONTENT

文章评论0条评论)

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