?? rx.c
字號(hào):
#include <reg52.h>
#include<intrins.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
//---------------------------位變量定義----------------------------------------
bdata uchar DATA_BUF; //用于ByteRead和ByteWrite 函數(shù)
#define DATA7 ((DATA_BUF&BYTE_BIT7)!=0)
#define DATA0 ((DATA_BUF&BYTE_BIT0)!=0)
uchar RxBuf[28];
// ------------------------------<RF2401_Pins 對(duì)應(yīng)引腳> -----------------------
sbit PWR_UP = P1^0;
sbit CE = P1^1;
// sbit DR2 = P1^5; //暫時(shí)沒(méi)有用到
// sbit CLK2 = P1^2;
// sbit OUT2 = P1^6;
sbit CS = P3^2;
sbit DR1 = P1^4;
sbit CLK1 = P1^3;
sbit DATA = P1^7;
//-------------------------------------------------------------------------------
unsigned char TxAddress[4]={0xcc,0xcc,0xcc,0xcc}; //發(fā)送地址
//---------------------<nRF-Configuration-Register 配置信息 >------------------------------
//芯片測(cè)試用,無(wú)需修改
#define TEST_2 0x8E // MSB D143-D136
#define TEST_1 0x08 // D135~D128
#define TEST_0 0x1c // D127~D120
// 注意 DATAx_W+ADDRx_W+CRC 的值必須小于256!單個(gè)數(shù)據(jù)包的大小必須小于32字節(jié)(256位)
#define DATA2_W 0x10 //未用到--0x10=2字節(jié) //頻道2發(fā)送/接受數(shù)據(jù)長(zhǎng)度(單位:Bit)
#define DATA1_W 0xE0 //28字節(jié) 16 位 //頻道1發(fā)送/接受數(shù)據(jù)長(zhǎng)度(單位:Bit)
//頻道2接收地址 <-頻道2未使用
#define ADDR2_4 0x00
#define ADDR2_3 0x1c
#define ADDR2_2 0xcc
#define ADDR2_1 0xcc
#define ADDR2_0 0xcc
// 頻道1接收地址 (當(dāng)前模塊地址) <-只是用頻道1
#define ADDR1_4 0x00
#define ADDR1_3 0xcc
#define ADDR1_2 0xcc
#define ADDR1_1 0xcc
#define ADDR1_0 0xcc
//接收地址位置設(shè)置--CRC設(shè)置
#define ADDR_W 0x10 //0x10 =2字節(jié) //發(fā)送/接收地址寬度(單位:Bit)
#define CRC_L 0x1 //CRC模式 0:8位 1:16位
#define CRC_EN 0x1 //CRC校驗(yàn) 0:禁止 1:?jiǎn)⒂?//頻道設(shè)置--發(fā)送方式設(shè)置--速率設(shè)置--頻率設(shè)置
#define RX2_EN 0x0 //雙頻道功能 0:禁用 1:?jiǎn)⒂?#define CM 0x1 //0:Direct Mode 1: Shockburst Mode
#define RFDR_SB 0x1 //傳輸速率 0:250k 1: 1M (250k比1M傳輸距離遠(yuǎn))
#define XO_F 0x3 //16M D12 D11 D10 確定 5種頻率
#define RF_PWR 0x3 //信號(hào)發(fā)射功率---0DB
//
#define RF_CH 0x2 //Channal 頻率設(shè)置Channel=2400MHz+RF_CH*1.0MHz
#define RXEN 0x1 //0:TX 1:RX
//<將設(shè)置信息組合成每個(gè)字節(jié)的數(shù)據(jù)信息
#define RFconfig_Bit0 TEST_2
#define RFconfig_Bit1 TEST_1
#define RFconfig_Bit2 TEST_0
#define RFconfig_Bit3 DATA2_W
#define RFconfig_Bit4 DATA1_W
#define RFconfig_Bit5 ADDR2_4
#define RFconfig_Bit6 ADDR2_3
#define RFconfig_Bit7 ADDR2_2
#define RFconfig_Bit8 ADDR2_1
#define RFconfig_Bit9 ADDR2_0
#define RFconfig_Bit10 ADDR1_4
#define RFconfig_Bit11 ADDR1_3
#define RFconfig_Bit12 ADDR1_2
#define RFconfig_Bit13 ADDR1_1
#define RFconfig_Bit14 ADDR1_0
#define RFconfig_Bit15 (ADDR_W<<2|CRC_L<<1|CRC_EN)
#define RFconfig_Bit16 (RX2_EN<<7|CM<<6|RFDR_SB<<5|XO_F<<2|RF_PWR)
#define RFconfig_Bit17 (RF_CH<<1|RXEN)
//通過(guò)宏定義將18字節(jié)的寄存器參數(shù)按照各個(gè)功能分解,參照DATASHHET
uchar code nRF2401_Conf[18]=
{
RFconfig_Bit0,RFconfig_Bit1,RFconfig_Bit2,
RFconfig_Bit3,
RFconfig_Bit4,
RFconfig_Bit5,RFconfig_Bit6,RFconfig_Bit7,RFconfig_Bit8,RFconfig_Bit9,
RFconfig_Bit10,RFconfig_Bit11,RFconfig_Bit12,RFconfig_Bit13,RFconfig_Bit14,
RFconfig_Bit15,
RFconfig_Bit16,
RFconfig_Bit17
};
//------------------------------------------函數(shù)申明------------------------------------------
void Delay_us(uchar n);
void DoClock();
void Delay_ms(uchar n);
unsigned char Spi_ByteRead(void);
void Spi_ByteWrite(unsigned char send);
void Config2401(void);
void SetTxMode(void);
void nRF2401_TxPacket(uchar TxBuf[]);
//--------------------------------11.0592M晶振 n=100 868us 左右-------------------------------
void Delay_us(uchar n)
{
uint i;
for(i=0;i<n;i++);
}
//------------------------------------------ -----------------------------------------
void Delay_ms(uchar n)
{
unsigned int i,j,k;
for(i=0;i<n;i++)
{
for(k=0;k<5;k++)
{
for(j=0;j<200;j++);
}
}
}
//--------------------------SPI讀------------------------------------------
unsigned char Spi_ByteRead(void)
{
unsigned char i = 0;
for (i=0; i<8; i++)
{
DATA_BUF = DATA_BUF << 1;
CLK1 = 1;
DATA = 1; //設(shè)置為輸入狀態(tài)
if (DATA) //讀取最高位,保存至最末尾,通過(guò)左移位完成整個(gè)字節(jié)
{
DATA_BUF |= BYTE_BIT0;
}
else
{
DATA_BUF &= ~BYTE_BIT0;
}
CLK1 = 0;
}
return DATA_BUF;
}
//----------------------------------SPI寫-----------------------------------------
void Spi_ByteWrite(unsigned char send)
{
unsigned char i;
DATA_BUF = send;
CLK1 = 0;
for (i=0; i<8; i++)
{
if (DATA7) //總是發(fā)送最高位
{
DATA = 1;
}
else
{
DATA = 0;
}
CLK1 = 1;
DATA_BUF = DATA_BUF << 1;
CLK1 = 0;
}
}
//-----------------------------配置2401--------------------------------------------
void Config2401(void)
{
uint i;
uchar variable1;
PWR_UP=1; //上電
CE=0;
CS=1; //使RF2401進(jìn)入配置方式
Delay_ms(3); //從上電到進(jìn)入配置模式需要3ms的延時(shí)(最少)
for(i=0;i<18;i++) //輸入3個(gè)測(cè)試字節(jié)15個(gè)配置字節(jié)共 18Byte
{
variable1=nRF2401_Conf[i];
Spi_ByteWrite(variable1);
}
CS=0; //Disable CS -----standby mode
DATA=0;
Delay_us(100);
}
/*
//--------------------------------設(shè)置為發(fā)送模式 ----------------------------
void SetTxMode(void)
{
//-------------------------------設(shè)置為配置模式----------------------------------
PWR_UP=1; //上電
CE=0;
CS=1; //進(jìn)入配置模式
Delay_us(100);
DATA=0; //配置寄存器0字節(jié)RXEN 設(shè)置為0: 發(fā)送模式
CLK1=1;
CLK1=0;
//----------------------------設(shè)置為 Activemodes(TX)------------------------------
CS=0;
CE=1; //set standby mode
Delay_us(100);
}
//--------------------------------nRF 數(shù)據(jù)發(fā)送函數(shù)--------------------------------
void nRF2401_TxPacket()
{
int i;
uchar variable2;
CE=1;
for(i=0;i<2;i++) //寫入接受地址(按字節(jié)對(duì)齊)
{
variable2=TxAddress[i];
Spi_ByteWrite(variable2);
}
for(i=0;i<(28);i++) //寫入接受地址(按字節(jié)對(duì)齊)
{
variable2=TxBuf[i];
Spi_ByteWrite(variable2);
}
CE=0; //CE配置低使發(fā)送有效
Delay_us(100); //時(shí)鐘信號(hào)高電平有效
}
*/
void SetRxMode(void)
{
PWR_UP=1; //上電
CE=0;
CS=1; //進(jìn)入配置模式
Delay_us(100);
DATA=1; //配置寄存器0字節(jié)RXEN 設(shè)置為0: 發(fā)送模式
CLK1=1;
CLK1=0;
//----------------------------設(shè)置為 Activemodes(TX)------------------------------
CS=0;
CE=1; //set standby mode
Delay_us(100);
}
void nRF2401_RxPacket()
{
int i;
DR1=1;
if(DR1==1)
{
for(i=0;i<(28);i++) //寫入接受地址(按字節(jié)對(duì)齊)
{
RxBuf[i]=Spi_ByteRead();
}
}
CE=0; //CE配置低使發(fā)送有效
Delay_us(100); //時(shí)鐘信號(hào)高電平有效
}
//---------------------------串口初始化----------------------------------
void StartUART( void )
{ //波特率4800
SCON = 0x50;
TMOD = 0x20;
TH1 = 0xFA;
TL1 = 0xFA;
PCON = 0x00;
TR1 = 1;
}
//--------------------------串口接收函數(shù)----------------------------------
void R_S_Byte(uchar R_Byte)
{
SBUF = R_Byte;
while( TI == 0 ); //查詢法
TI = 0;
}
//------------------------------------主函數(shù)---------------------------------------
main()
{
uchar i;
Config2401();
Delay_us(100);
StartUART();
while(1)
{
SetRxMode();
nRF2401_RxPacket();
for(i=0;i<28;i++)
{
R_S_Byte( RxBuf[i]);
}
}
}
?? 快捷鍵說(shuō)明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號(hào)
Ctrl + =
減小字號(hào)
Ctrl + -