⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 nrf905.c

📁 nRF905编程指南
💻 C
字号:
////nRF905编程指南
1 [nRF905 配置寄存器]

字节0:
[7:0] CH_NO[7:0]:
连同字节1的CH_NO[8]和HFREQ_PLL控制905的载波频段
参考设置:
Operating frequency HFREQ_PLL CH_NO
430.0 MHz [0] [001001100]
433.1 MHz [0] [001101011]
433.2 MHz [0] [001101100]
434.7 MHz [0] [001111011]
862.0 MHz [1] [001010110]
868.2 MHz [1] [001110101]
868.4 MHz [1] [001110110]
869.8 MHz [1] [001111101]
902.2 MHz [1] [100011111]
902.4 MHz [1] [100100000]
927.8 MHz [1] [110011111]
载波频率的计算公式:
字节1:
[0] CH_NO [8] :参见字节0
[1] HFREQ_PLL :
0 - 器件工作在433MHZ频段
1 - 期间工作在868/915MHZ频段
[3:2] PA_PWR :
输出功率
00 -10dBm (默认)
01 -2dBm
10 +6dBm
11 +10dBm
[4] RX_RED_PWR :
降低接收模式电流消耗至1.6mA,灵敏度降低。
0 - 正常模式 (默认)
1 - 低功耗模式
[5] AUTO_RETRAN:
自动重发TX寄存器中的数据包,如果TRX_CE和TX_EN被设置为高。
0 - 不重发数据包 (默认)
1 - 自动重发数据包
[7:6] 保留
字节2
[2:0] RX_AWF [2:0] :
RX地址宽度
001 - 1字节RX地址宽度 (默认)
100 - 4字节RX地址宽度
[3] 保留
[6:4] TX_AWF [2:0] : 
TX地址宽度
001 - 1字节TX地址宽度
100 - 4 字节TX地址宽度
[7] 保留
字节3
[5:0] RX_PW [5:0] :
RX接收有效数据宽度
000001 - 1字节RX有效数据宽度
000010 - 2字节RX有效数据宽度
……
100000 - 32字节RX有效数据宽度
[7:6] 保留
字节4
[5:0] TX_PW [5:0] :
TX发送有效数据宽度
000001 - 1字节TX有效数据宽度
000010 - 2字节TX有效数据宽度
100000 - 32字节TX有效数据宽度
[7:6] 保留
字节5 : RX地址0字节
字节6 : RX地址1字节
字节7 : RX地址2字节
字节8 : RX地址3字节
字节 9
[1:0] UP_CLK_FREQ [1:0]:
输出时钟频率
00 - 4MHZ
01 - 2MHZ
10 - 1MHZ
11 - 500KHZ
[2] UP_CLK_EN :
输出时钟使能
0 - 没有外部时钟
1 - 外部时钟信号使能 (默认)
[5:3] XOF [2:0] :
晶体振荡器频率,必须依据外部晶体的标称频率设置
(无线模块上905芯片外接晶振的频率)
000 - 4MHZ
001 - 8MHZ
010 - 12MHZ
011 - 16MHZ
100 - 20MHZ (默认)
[6] CRC_EN :
CRC校验允许
0 - 部允许
1 - 允许 (默认)
[7] CRC_MODE :
CRC模式
0 - 8位CRC校验位
1 -16位CRC校验位 (默认)
范例程序中的相关代码段:
/*nRF905寄存器配置参数*/
typedef struct RFConfig
{

uchar n;
uchar buf[10];
}RFConfig;
code RFConfig RxTxConf =
{
10,
0x4c, 0x0c, 0x44, 0x20, 0x20, 0xcc, 0xcc, 0xcc,0xcc, 0x58
};
//buf[10] 中数据对应 字节0 ~ 字节9 ,具体内容可参考上文寄存器配置章节
//注:对于频段设置参数CH_NO,在我们提供的范例程序中CH_NO[7:0]的值为0x4c。我们不建议各位用户使用其他数值,因为我们的模块在硬件上只适应430MHz左右的频率,为了达到最好的效果,软件参数上应当与硬件匹配,否则会影响通讯距离。
6.2 [通过SPI接口向nRF905 配置寄存器读写配置信息]
nRF905通过SPI接口与单片机通讯,因此必须首先了解SPI接口。
[SPI概念] SPI外围串行接口由四条线构成:
MOSI主机输出从机输入 (主机写操作)
MISO主机输入从机输出 (主机读操作)
SCK 串行时钟信号,由主机控制
CSN 片选信号,低电平有效
//<SPI写操作 代码>
void SpiWrite(uchar byte)
{
uchar i;
DATA_BUF=byte; // 将需要发送的数据写入缓存
for (i=0;i<8;i++) // 循环8次发送一个字节的数据
{
if (flag) // flag = DATA_BUF^7;
MOSI=1;
else
MOSI=0;
SCK=1; // SCK 高电平
DATA_BUF=DATA_BUF<<1; // 左移一位,为下一位的发送做准备
SCK=0; // SCK 低电平
}
}
步骤一:MOSI线准备好需要发送的数据位
步骤二:SCK置高,器件读取MOSI线上的数据
步骤三:SCK置低,准备发送数据的下一位
以上步骤循环执行8次,通过SPI向器件发送数据完成!
注意:数据的传输时,高位在前,低位在后。
//<SPI读操作 代码>
uchar SpiRead(void)
{
uchar i;
for (i=0;i<8;i++) //循环8次发送一个字节的数据
{
DATA_BUF=DATA_BUF<<1; //左移一位,准备接收下一位数据
SCK=1; // SCK 高电平
if (MISO)
flag1=1; // flag1 = DATA_BUF^0;
else
flag1=0;
SCK=0; // SCK低电平
}
return DATA_BUF; // DATA_BUF 为接收到的完整数据
}
步骤一:MISO线准备好需要发送的数据位
步骤二:SCK置高,主机读取MISO线上的数据
步骤三:SCK置低,准备接收数据的下一位
以上步骤循环执行8次,通过SPI从器件上读数据完成!
注意:数据的传输时,高位在前,低位在后。
//<主机通过SPI接口向905配置寄存器写入信息>
void Config905(void)
{
uchar i;
CSN=0; // CSN片选信号,SPI使能
SpiWrite(WC); // 向905芯片写配置命令
for (i=0;i<RxTxConf.n;i++) // 循环写入配置信息
{
SpiWrite(RxTxConf.buf[i]); //RxTxConf保存预先设置好的配置信息
}
CSN=1; // 结束SPI数据传输
}
步骤一:CSN置低电平,SPI接口开始等待第一条指令
步骤二:调用SpiWrite函数,向器件发送WC信号,准备写入配置信息
(SpiWrite函数在上文讲解)
步骤三:反复调用SpiWrite函数,向器件配置寄存器写入配置信息
步骤四:CSN置高电平,结束SPI通讯。
nRF905配置完成!
代码中nRF905 SPI接口指令的宏定义
//(以下操作全部从对应寄存器的字节0开始)
#define WC 0x00 // 写配置寄存器(RF-Configuration Register)
#define RC 0x10 // 读配置寄存器(RF-Configuration Register)
#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寄存器读取接收到的有效数据
//使用nRF905发送数据
void TxPacket(void)
{
uchar i;
CSN=0;
SpiWrite(WTP); // Write payload command
for (i=0;i<32;i++)
{
SpiWrite(TxBuf[i]); // 写入32直接发送数据
}
CSN=1; // 关闭SPI,保存写入的数据
Delay(1);
CSN=0; // SPI使能,准备写入地址信息
SpiWrite(WTA); // 写数据至地址寄存器
for (i=0;i<4;i++) // 写入4字节地址
{ 
SpiWrite(RxTxConf.buf[i+5]);
}
CSN=1; // 关闭SPI
TRX_CE=1; // 进入发送模式,启动射频发送
Delay(1); // 进入ShockBurst发送模式后,芯片保证数据发送完成后返回STANDBY模式
TRX_CE=0;
}
步骤一:通过SpiWrite 函数发送WTP命令,准备写入TX有效数据
步骤二:循环调用SpiWrite向TX-Payload寄存器写入TX有效数据
(中间夹有CSN电平变化)
步骤三:延时
步骤四:通过SpiWrite函数发送WTA命令,准备写入TX地址
步骤五:循环调用SpiWrite向TX-Address寄存器写入TX地址
步骤六:TRX_CE=1; 开始发送数据
延时,nRF905数据发送完成
当nRF905接收到一条完成的信息时,会将DR引脚置高。
//这段代码和范例中提供的有所不同,做了较大的简化,只留下必要的部分
void RxPacket(void) 
{
uchar i;
TRX_CE=0; // 设置905进入待机模式
CSN=0; // 使能SPI
SpiWrite(RRP); // 准备读取接收到的数据
for (i=0;i<32;i++)
{
RxBuf[i]=SpiRead(); // 通过SPI接口从905芯片读取数据
}
CSN=1; // 禁用SPI
while(DR||AM);
TRX_CE=1;
}
步骤一:TRX_CE=0; 必须将此引脚置低,使905进入standby模式
步骤二:发送RRP指令
步骤三:循环调用SpiRead函数,读取接收到的数据
步骤四:等待DR和AM引脚复位为低电平
(中间夹有CSN电平变化)
数据包接收完成!

注:
AM 地址匹配,接收到有效地址,被置高
DR 接收到有效数据包,并解码后,被置高
当所有有效数据被读取后,nRF905将AM和DR置低
最后需要注意的是,必须首先设置器件的发送/接收模式才能保证有效的数据发送接收
//<设置器件为发送模式>
void SetTxMode(void)
{
TX_EN=1;
TRX_CE=0;
Delay(1); // delay for mode change(>=650us)
}
//<设置器件为接收模式>
void SetRxMode(void)
{
TX_EN=0;
TRX_CE=1;
Delay(1); // delay for mode change(>=650us)
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -