📄 wireless.h
字号:
#include "config.h"
#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
/*****************************************************
* 保存2401的配置信息 *
******************************************************/
#define TEST_2 0x8E //MSB D143~D136
#define TEST_1 0x08 // D135~D128
#define TEST_0 0x1C // D127~D120
#define DATA1_W 0xE0 //0x20=28字节 //频道1 发送/接收数据长度(单位:Bit)
#define DATA2_W 0x10 //0x10=2 字节 //频道2 发送/接收数据长度(单位:Bit)
//频道1 接收地址 (当前模块地址) 只使用到频道1
#define ADDR1_4 0xcc
#define ADDR1_3 0xcc
#define ADDR1_2 0xcc
#define ADDR1_1 0xcc
#define ADDR1_0 0xcc
//频道2 接收地址 频道2未启用
#define ADDR2_4 0x00
#define ADDR2_3 0x1c
#define ADDR2_2 0xcc
#define ADDR2_1 0xcc
#define ADDR2_0 0xcc
#define ADDR_W 0x10 //0x10=2字节 //发送/接收地址宽度(单位:Bit)
#define CRC_L 0x1 //CRC模式 0:8位; 1:16位
#define CRC_EN 0x1 //CRC校验 0:禁用 1:启用
#define RX2_EN 0x0 //双频道功能 0:禁用; 1:启用
#define CM 0x1 // 0:Direct mode; 1:ShockBurst mode
#define RFDR_SB 0x0 //传输速率 0:250kbps; 1:1Mbps (250kbps比1Mbps传输距离更远)
#define XO_F 0x3 //nRF2401晶振频率选16M
#define RF_PWR 0x3 //信号发射功率选0dbm
#define RF_CH 0x2 //Channel RF 频率设置 //Channel = 2400MHz + RF_CH * 1.0MHz
#define RXEN 0x0 //0:Tx; 1:Rx //程序会通过SetTxMode/SetRxMode重新设置此项参数
//将设置信息组合成每个字节的数据信息
#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)
#define CS 1<<23 //P0.23
#define CE 1<<19 //P0.19
#define PWR_UP 1<<25 //P0.25
#define DR1 1<<16 //P0.16 连接EINT0
#define DATA 1<<9 //P0.9
#define CLK1 1<<29 //P0.29
#define LED0 1<<28 //P2.28
#define LED1 1<<29 //P2.29
#define KEY1 1<<20 //P0.20
#define DATA7 ((DATA_BUF&BYTE_BIT7) != 0)
#define DATA0 ((DATA_BUF&BYTE_BIT0) != 0)
uint8 DATA_BUF; //用于ByteRead 和 ByteWrite函数
uint8 TxAddress[]={0xcc,0xcc,0xcc,0xcc};//接收方通道硬件地址
//通过宏定义将18字节的寄存器参数按照各个功能分解,以便于参数的调整
uint8 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
};
void Delay100(void) //11.0592M晶振 868us 左右
{
uint32 i;
for(i=0;i<100;i++);
}
void Delay(uint32 n)
{
uint32 i;
while(n--)
for(i=0;i<100;i++);
}
uint8 ByteRead(void)
{
uint8 i=0;
for (i=0;i<8;i++)
{
DATA_BUF=DATA_BUF<<1;
IO0DIR = 0x22880000;
IO0SET = CLK1;
if ((IO0PIN&DATA)) //读取最高位,保存至最末尾,通过左移位完成整个字节
{
DATA_BUF|=BYTE_BIT0;
}
else {
DATA_BUF&=~BYTE_BIT0;
}
IO0CLR = CLK1;
}
return DATA_BUF;
}
void ByteWrite(uint8 send)
{
uint8 i;
DATA_BUF = send;
IO0DIR|=DATA; //DATA为输出
IO0CLR = CLK1;
for (i=0;i<8;i++)
{
if (DATA7) //总是发送最高位
{
IO0SET = DATA;
}
else
{
IO0CLR = DATA;
}
IO0SET = CLK1;
DATA_BUF=DATA_BUF<<1;
IO0CLR = CLK1;
}
}
void Config2401(void) //配置2401,写入初始化设置
{
uint32 i=0;
uint8 variablel;
IO0DIR|=DATA; //DATA为输出
IO0CLR = CS;
IO0CLR = CE;
IO0SET = PWR_UP; //上电
for(i=0;i<30;i++)Delay100();//从上电到进入配置模式需要3ms的延时
IO0SET = CS; //使RF2401进入配置方式
IO0CLR = DATA;
IO0CLR = CLK1;
Delay100();
for(i=0;i<18;i++)
{
variablel=nRF2401_Conf[i];
ByteWrite(variablel);
}
Delay100();
IO0CLR = CS; //CS置低使配置有效
Delay100();
}
void SetTxMode(void)//设置为发送模式
{
IO0DIR|=DATA; //DATA为输出
//设置为配置模式
IO0SET = PWR_UP;
IO0CLR = CE;
IO0SET = CS;
Delay100();
//配置寄存器0字节RXEN 设置为0:发送模式
IO0CLR = DATA;
IO0SET = CLK1;
IO0CLR = CLK1;
//设置为Activemodes(Tx)
IO0CLR = CS;
IO0SET = CE;
Delay100();
}
void SetRxMode(void) //设置为接收模式
{
IO0DIR|=DATA; //DATA为输出
Delay100();
//设置为配置模式
IO0SET = PWR_UP;
IO0CLR = CE;
IO0SET = CS;
Delay100();
//配置寄存器0字节RXEN 设置为1:接收模式
IO0SET = DATA;
IO0SET = CLK1;
IO0CLR = CLK1;
//设置为Activemodes(Rx)
IO0CLR = CS;
IO0SET = CE;
Delay100();
}
//nRF2401数据发送函数
void nRF2401_TxPacket(uint8 TxBuf[]) //发送TxBuf[]内的数据,长度由DATA1_W决定
{
uint32 i;
uint8 variable2;
IO0SET = CE;
Delay100();
for(i=0;i<(ADDR_W/8);i++) //写入接收地址(按字节对齐)
{
variable2=TxAddress[i];
ByteWrite(variable2);
}
for(i=0;i<(DATA1_W/8);i++) //写入需要发送的数据(按字节对齐)
{
variable2=TxBuf[i];
ByteWrite(variable2);
}
IO0CLR = CE; //CE置低使发送有效
Delay100(); //时钟信号高电平保持
Delay100();
Delay100();
Delay100();
}
//检查是否有数据需要接受 如果有,则保存至RxBuf[]
//返回值 0:没有接收到数据 1:接收到数据
uint8 nRF2401_RxPacket(uint8 *RxBuf)
{
uint32 i;
if((IO0PIN&DR1)!=0)
{
for (i=0; i<(DATA1_W/8); i++)
{
*RxBuf = ByteRead();
RxBuf++;
}
return 1;
}
return 0;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -