本帖最后由 tkin1992 于 2011-7-12 16:35 编辑
发射部分:
#include<reg52.h>
#define uchar unsigned char
#define uint unsigned int
#define BYTE_BIT0 0x01
#define BYTE_BIT1 0x02
#define BYTE_BIT2 0x04
#define BYTE_BIT3 0x08
#define BYTE_BIT4 0x10
#define BYTE_BIT5 0x20
#define BYTE_BIT6 0x40
#define BYTE_BIT7 0x80
//SPI指令
#define WC 0x00
//写配置寄存器
#define RC 0x10
//读配置寄存器
#define WTP 0x20
//向TX-Payload寄存器写入发送有效数据
#define RTP 0x21
//向TX-Payload寄存器读取发送有效数据
#define WTA 0x22
//向TX-Address寄存器读取发送有效数据
#define RTA 0x23
//向TX-Address寄存器读取发送有效数据
#define RRP 0x24
//向RX-Payload寄存器读取接收到的有效数据
uchar DATA_BUF;
uchar RxTxBuf[4]={'1','9','9','\0'};
typedef struct RFConfig
{
uchar n;
uchar buf[11];
}RFConfig;
//配置口定义
sbit TX_EN =P0^0;
sbit TRX_CE =P0^1;
sbit PWR_UP =P0^2;
sbit MISO =P0^3;
sbit MOSI =P0^4;
sbit SCK =P0^5;
sbit CSN =P0^6;
sbit AM =P0^7;
sbit DR =P3^5;
sbit CD =P3^6;
code RFConfig RxTxConf=
{
11,
0x00,
//配置命令WC
0x4c,
//CH_NO配置频段在430MHZ
0x0c,
//输出功率为10db,不重发,节电为正常模式
0x44,
//地址宽度设置为4字节
0x04,0x04,
//接收发送有效数据长度为4字节
0xCC,0xCC,0xCC,0xCC,
//接收地址
0x58
//CRC允许,8位CRC校验,外部时钟信号不使能,16M晶振
};
//=========================================
//函数功能:延时1ms
//=========================================
void Delay(int a)
{
uchar b;
for (;a>0;a--)
for (b=125;b>0;b--);
}
//=========================================
//函数功能:NRF905初始化
//=========================================
void NRF905Init(void)
{
CSN=1; // Spi disable
SCK=0; // Spi clock line init low
DR=1; // Init DR for input
AM=1; // Init AM for input
PWR_UP=1; // nRF905 power on
TRX_CE=0; // Set nRF905 in standby mode
TX_EN=0; // set radio in Rx mode
}
/*//=========================================
//函数功能:Spi读函数
//=========================================
uchar SpiRead(void)
{
uchar i;
for (i=0;i<8;i++)
{
DATA_BUF<<=1;
SCK=1;
if (MISO) //读取最高位,保存至最末尾,通过左移位完成整个字节
{
DATA_BUF|=BYTE_BIT0;
}
else
{
DATA_BUF&=~BYTE_BIT0;
}
SCK=0;
}
return DATA_BUF;
}*/
//=========================================
//函数功能:Spi写函数
//=========================================
void SpiWrite(uchar dat)
{
uchar i;
DATA_BUF=dat;
for (i=0;i<8;i++)
{
if ((DATA_BUF&BYTE_BIT7) != 0) //总是发送最高位
{
MOSI=1;
}
else
{
MOSI=0;
}
SCK=1;
DATA_BUF<<=1;
SCK=0;
}
}
//=========================================
//函数功能:初始化寄存器
//=========================================
void Config905(void)
{
uchar i;
CSN=0;
// 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);
}
CSN=1;
// Disable Spi
}
//=========================================
//函数功能:发送数据
//=========================================
void TxPacket(void)
{
uchar i;
CSN=0;
// Spi enable for write a spi command
SpiWrite(WTP);
// Write payload command
for (i=0;i<4;i++)
{
SpiWrite(RxTxBuf); // Write 4 bytes Tx data
}
CSN=1;
// Spi disable
Delay(1);
CSN=0;
// Spi enable for write a spi command
SpiWrite(WTA);
// Write address command
for (i=0;i<4;i++)
// Write 4 bytes address
{
SpiWrite(RxTxConf.buf[i+5]);
}
CSN=1;
// Spi disable
TRX_CE=1;
// Set TRX_CE high,start Tx data transmission
Delay(1);
TRX_CE=0;
// Set TRX_CE low
}
/*//=========================================
//函数功能:接收数据
//=========================================
void RxPacket(void)
{
uchar i;
TRX_CE=0;
// Set nRF905 in standby mode
CSN=0;
// Spi enable
SpiWrite(RRP);
// Read payload command
for (i=0;i<4;i++)
{
RxBuf=SpiRead(); // Read data and save to buffer
}
CSN=1;
// Disable spi
while(DR||AM);
TRX_CE=1;
}*/
//=========================================
//函数功能:设置为发送模式
//=========================================
void SetTxMode(void)
{
TX_EN=1;
//Select RX mode
TRX_CE=0;
//Enables chip for receive and transmit
Delay(1); //Delay for mode change(>=650us)
}
/*//=========================================
//函数功能:设置为接收模式
//=========================================
void SetRxMode(void)
{
TX_EN=0;
//Select RX mode
TRX_CE=1;
//Enables chip for receive and transmit
Delay(1); //Delay for mode change(>=650us)
}*/
//=========================================
//函数功能:主函数
//=========================================
void main()
{
uint i=0;
NRF905Init();
Config905(); // Config nRF905 module
while(1)
{
SetTxMode(); // Set Tx Mode
TxPacket();
// Transmit Tx buffer data
Delay(1000);
}
}
接收部分:
#include<reg52.h>
#include <math.h>
#define uchar unsigned char
#define uint unsigned int
#define BYTE_BIT0 0x01
#define BYTE_BIT1 0x02
#define BYTE_BIT2 0x04
#define BYTE_BIT3 0x08
#define BYTE_BIT4 0x10
#define BYTE_BIT5 0x20
#define BYTE_BIT6 0x40
#define BYTE_BIT7 0x80
//SPI指令
#define WC 0x00
//写配置寄存器
#define RC 0x10
//读配置寄存器
#define WTP 0x20
//向TX-Payload寄存器写入发送有效数据
#define RTP 0x21
//向TX-Payload寄存器读取发送有效数据
#define WTA 0x22
//向TX-Address寄存器读取发送有效数据
#define RTA 0x23
//向TX-Address寄存器读取发送有效数据
#define RRP 0x24
//向RX-Payload寄存器读取接收到的有效数据
#define TxRxBuf_Len 4
uchar DATA_BUF;
unsigned char TxRxBuf[TxRxBuf_Len];
typedef struct RFConfig
{
uchar n;
uchar buf[11];
}RFConfig;
//配置口定义
sbit TX_EN =P1^0;
sbit TRX_CE =P1^1;
sbit PWR_UP =P1^2;
sbit MISO =P1^3;
sbit MOSI =P1^4;
sbit SCK =P1^5;
sbit CSN =P1^6;
sbit AM =P1^7;
sbit DR =P3^5;
sbit CD =P3^6;
sbit rw=P2^5;//读写选择端(0/1)
sbit rs=P2^6;//数据命令选择端(1/0)
sbit en=P2^7;//1602使能端口
code RFConfig RxTxConf=
{
11,
0x00,
//配置命令WC
0x4c,
//CH_NO配置频段在430MHZ
0x0c,
//输出功率为10db,不重发,节电为正常模式
0x44,
//地址宽度设置为4字节
0x04,0x04,
//接收发送有效数据长度为4字节
0xCC,0xCC,0xCC,0xCC,
//接收地址
0x58
//CRC允许,8位CRC校验,外部时钟信号不使能,16M晶振
};
//=========================================
//函数功能:延时1ms
//=========================================
void Delay(uint a)//延时1ms
{
uchar b;
for(a;a>0;a--)
for(b=125;b>0;b--);
}
//=========================================
//函数功能:向1602发送命令
//=========================================
void lcdwritecom(uchar com)
{
rs=0;
P0=com;
Delay(5);
en=1;
Delay(5);
en=0;
}
//=========================================
//函数功能:向1602发送数据
//=========================================
void lcdwritedat(uchar dat)
{
rs=1;
P0=dat;
Delay(5);
en=1;
Delay(5);
en=0;
}
//=========================================
//函数功能:1602初始化
//=========================================
void lcdinit()
{
en=0;
rw=0; //选择写
lcdwritecom(0x01); //清屏
Delay(5);
lcdwritecom(0x38); //设置显示模式
lcdwritecom(0x0c); //设置开显示,不显示光标
lcdwritecom(0x06); //写一个字符后地址指针加1
}
//=========================================
//函数功能:NRF905初始化
//=========================================
void NRF905Init(void)
{
CSN=1; // Spi disable
SCK=0; // Spi clock line init low
DR=1; // Init DR for input
AM=1; // Init AM for input
PWR_UP=1; // nRF905 power on
TRX_CE=0; // Set nRF905 in standby mode
TX_EN=0; // set radio in Rx mode
}
//=========================================
//函数功能:Spi读函数
//=========================================
uchar SpiRead(void)
{
uchar i;
for (i=0;i<8;i++)
{
DATA_BUF<<=1;
SCK=1;
if (MISO) //读取最高位,保存至最末尾,通过左移位完成整个字节
{
DATA_BUF|=BYTE_BIT0;
}
else
{
DATA_BUF&=~BYTE_BIT0;
}
SCK=0;
}
return DATA_BUF;
}
//=========================================
//函数功能:Spi写函数
//=========================================
void SpiWrite(uchar dat)
{
uchar i;
DATA_BUF=dat;
for (i=0;i<8;i++)
{
if ((DATA_BUF&BYTE_BIT7) != 0) //总是发送最高位
{
MOSI=1;
}
else
{
MOSI=0;
}
SCK=1;
DATA_BUF<<=1;
SCK=0;
}
}
//=========================================
//函数功能:初始化寄存器
//=========================================
void Config905(void)
{
uchar i;
CSN=0;
// 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);
}
CSN=1;
// Disable Spi
}
/*//=========================================
//函数功能:发送数据
//=========================================
void TxPacket(void)
{
uchar i;
CSN=0;
// Spi enable for write a spi command
SpiWrite(WTP);
// Write payload command
for (i=0;i<4;i++)
{
SpiWrite(TxBuf); // Write 32 bytes Tx data
}
CSN=1;
// Spi disable
Delay(1);
CSN=0;
// Spi enable for write a spi command
SpiWrite(WTA);
// Write address command
for (i=0;i<4;i++)
// Write 4 bytes address
{
SpiWrite(RxTxConf.buf[i+5]);
}
CSN=1;
// Spi disable
TRX_CE=1;
// Set TRX_CE high,start Tx data transmission
Delay(1);
TRX_CE=0;
// Set TRX_CE low
}*/
//=========================================
//函数功能:接收数据
//=========================================
void RxPacket(void)
{
uchar i;
TRX_CE=0;
// Set nRF905 in standby mode
CSN=0;
// Spi enable
SpiWrite(RRP);
// Read payload command
for (i=0;i<4;i++)
{
TxRxBuf=SpiRead(); // Read data and save to buffer
}
CSN=1;
// Disable spi
while(DR||AM);
TRX_CE=1;
}
/*//=========================================
//函数功能:设置为发送模式
//=========================================
void SetTxMode(void)
{
TX_EN=1;
//Select RX mode
TRX_CE=0;
//Enables chip for receive and transmit
Delay(1); //Delay for mode change(>=650us)
}*/
//=========================================
//函数功能:设置为接收模式
//=========================================
void SetRxMode(void)
{
TX_EN=0;
//Select RX mode
TRX_CE=1;
//Enables chip for receive and transmit
Delay(1); //Delay for mode change(>=650us)
}
//=========================================
//函数功能:显示函数
//=========================================
void display()
{
uchar i;
lcdwritecom(0x80);
for(i=0;TxRxBuf!='\0';i++)
{
lcdwritedat(TxRxBuf);
}
}
//=========================================
//函数功能:主函数
//=========================================
void main()
{
NRF905Init();
Config905();
lcdinit();
while(1)
{
SetRxMode();
RxPacket();
display();
Delay(100);
}
}
我用的3.3V供电,其余口直接和51单片机项链。问题:把程序下进去不给NRF905供电测得VCC和GND约0.9V,此时模块能发送数据,但是是乱码;给模块供电后不能发送数据。。。小弟初学,请给位大侠赐教。谢谢 |