HJH24R2模块
本产品主要功能特点如下:
1.低工作电压:1.9~3.6V低电压工作
2.高速率:2Mbps,由于空中传输时间很短,极大的降低了无线传输中的碰撞现象(软件设置1Mbps或者4Mbps的空中传输速率)
3.多频点:125 频点,满足多点通信和跳频通信需要
4.超小型:内置2.4GHz天线,体积小巧,16x29mm(包括天线)
5.低功耗:当工作在应答模式通信时,快速的空中传输及启动时间,极大的降低了电流消耗。
6.低应用成本:芯片集成了所有与RF协议相关的高速信号处理部分,比如:自动重发丢失数据包和自动产生应答信号等,HJH24R1的SPI接口可以利用单片机的硬件SPI口连接或用单片机I/O口进行模拟,内部有FIFO可以与各种高低速微处理器接口,便于使用低成本单片机。
1.低工作电压:1.9~3.6V低电压工作
2.高速率:2Mbps,由于空中传输时间很短,极大的降低了无线传输中的碰撞现象(软件设置1Mbps或者4Mbps的空中传输速率)
3.多频点:125 频点,满足多点通信和跳频通信需要
4.超小型:内置2.4GHz天线,体积小巧,16x29mm(包括天线)
5.低功耗:当工作在应答模式通信时,快速的空中传输及启动时间,极大的降低了电流消耗。
6.低应用成本:芯片集成了所有与RF协议相关的高速信号处理部分,比如:自动重发丢失数据包和自动产生应答信号等,HJH24R1的SPI接口可以利用单片机的硬件SPI口连接或用单片机I/O口进行模拟,内部有FIFO可以与各种高低速微处理器接口,便于使用低成本单片机。
本芯片可同时进行6个发送端和1个接收端之间的双向通信。正常情况下的通信是一对一的,之所以能够一对六,就是在接收端保存了6个不同的地址,此时只要任何一个发射端的地址与这6个地址中的一个相同,双方就可以通信。接收端收到数据后,会将数据解包,将其中的地址提取出来,和自己内部存在的6个地址去比较,如果与其中一个相同,就把数据包读取走,如果不相同,就把数据包丢掉。
6个发送端和1个接收端之间的通信,可以看成6对独立的通信单元,只是6个接收端合并成一个了,所以一对一通信模式的一些设置要求同样适应于6对1通信模式。6对1通信中,大家采用同一个频率点,分时通信。
6对1通信的难点就在于地址的设置,所以请仔细看下面地址的设置。
6对1通信相对于1对1通信,需要使能许多额外的功能,所以在写程序时,有许多使能控制字,需要去设置。
1.基本原理如下:
1) 接收端
接收端有6个接收管道(PIPE,即有6个不同的地址),每个管道能接收一个发射端发来的数据,最多能接收6个发射端发来的数据。接收端接收信号的频率和发射端发射信号的频率是相同的、数据率是相同的。接收端是通过每个通道的地址不同,来区分接收到的是哪一个发射端发射的信号。所以,要想使接收端正确接收不同发射端的信号,需要设置每一个接收管道地址与对应的发送端发送地址相同才能实现。
其中,需要注意的是,接收管道0有单独的5字节地址,管道1至管道5共用高4字节有效地址,最低位字节用于区别管道1至管道5。所以,管道1需要设置5字节地址,管道2至管道5只需要设置一个字节的地址,即最低位地址(其高四位地址已默认与管道1的高四位地址相同)。
管道0和管道1默认是开启的,而管道2至管道5默认是关闭的,需要在EN_RXADDR寄存器中使能各个管道才能打开。
此外,发射端如果发射的是ACK信号,则发射端还需要设置它自己的接收管道0地址与自身发送地址相同。
2)发射端
发射端的发射频率必须和接收端的接收频率相同(即二者的RF_CH寄存器值相同),数据率相同(RF_SETUP寄存器来设置数据率),发射端的发射地址,必须和接收端某一管道的地址相同才能实现正确的通信。
2.程序实例
下面给出一个完整的例子,请仔细阅读每一行代码和相应的注释。
(1)说明
这个例子包含3个发射端,PTX0、PTX1、PTX2,一个接收端PRX。
三个发射端的地址分配如下:
PTX0的地址(从低到高): 0x00 0x11 0x22 0x33 0x44
PTX1的地址(从低到高): 0x01 0x55 0x66 0x77 0x88
PTX2的地址(从低到高): 0x02 0x55 0x66 0x77 0x88
注意:PTX1和PTX2的高4位地址是相同的。
接收端PRX地址分配如下:
通道0(PIPE0)地址: 0x00 0x11 0x22 0x33 0x44
通道1(PIPE1)地址: 0x01 0x55 0x66 0x77 0x88
通道2(PIPE2)地址: 0x02 0x55 0x66 0x77 0x88
注意:PIPE1和PIPE2的高4位地址是相同的。
(2)实例代码
2.1 PTX0代码如下:
//地址常量定义
#define TX_ADR_WIDTH 5
unsigned char TX_ADDRESS[5] = {0x00,0x11,0x22,0x33,0x44}; //PTX0地址,即PRX的PIPE0地址,5字节
CE_L;
SPIRegWr(WRITE_REG+ SETUP_AW, 0x03); // 5 byte Address width
SPIWrRegBuf(WRITE_REG+ TX_ADDR, TX_ADDRESS, TX_ADR_WIDTH); // 写入发送地址
SPIWrRegBuf(W_REGISTER + RX_ADDR_P0, TX_ADDRESS, TX_ADR_WIDTH); // 为了接收 接收设备的ACK包,接收通道0地址和发送地址相同
SPIRegWr(WRITE_REG + EN_AA, 0x01); // Enable Auto ack data pipe 0
SPIRegWr(WRITE_REG + EN_RXADDR, 0x01); // 使能接收通道0
SPIRegWr(WRITE_REG + SETUP_RETR, 0x1F); // 自动重发。 自动重发延时等待500us+86us,自动重发15次
SPIRegWr(WRITE_REG + RF_CH, 11); // 选择射频通道11
SPIRegWr(WRITE_REG + RF_SETUP, 0x27); // 数据传输率250KBPS,7dbm TX power
SPIRegWr(WRITE_REG + CONFIG, 0x0E); // 上电, PTX mode
CE_H;
2.2 PTX1代码如下:
//地址常量定义
#define TX_ADR_WIDTH 5
unsigned char TX_ADDRESS[5] = {0x01,0x55,0x66,0x77,0x88}; //PTX1地址,即PRX的PIPE1地址,5字节
CE_L;
SPIRegWr(WRITE_REG+ SETUP_AW, 0x03); // 5 byte Address width
SPIWrRegBuf(WRITE_REG+ TX_ADDR, TX_ADDRESS, TX_ADR_WIDTH); // 写入发送地址
SPIWrRegBuf(W_REGISTER + RX_ADDR_P0, TX_ADDRESS, TX_ADR_WIDTH); // 为了接收接收设备的ACK包,接收通道0地址和发送地址相同
SPIRegWr(WRITE_REG + EN_AA, 0x01); // Enable Auto ack data pipe 0
SPIRegWr(WRITE_REG + EN_RXADDR, 0x01); // 使能接收通道0
SPIRegWr(WRITE_REG + SETUP_RETR, 0x1F); // 自动重发。 自动重发延时等待500us+86us,自动重发15次
SPIRegWr(WRITE_REG + RF_CH, 11); // 选择射频通道11
SPIRegWr(WRITE_REG + RF_SETUP, 0x27); // 数据传输率250KBPS,7dbm TX power
SPIRegWr(WRITE_REG + CONFIG, 0x0E); // 上电, PTX mode
CE_H;
2.3 PTX2代码如下:
//地址常量定义
#define TX_ADR_WIDTH 5
unsigned char TX_ADDRESS[5] = {0x02,0x55,0x66,0x77,0x88}; //PTX2地址,即PRX的PIPE2地址,5字节
CE_L;
SPIRegWr(WRITE_REG+ SETUP_AW, 0x03); // 5 byte Address width
SPIWrRegBuf(WRITE_REG+ TX_ADDR, TX_ADDRESS, TX_ADR_WIDTH); // 写入发送地址
SPIWrRegBuf(W_REGISTER + RX_ADDR_P0, TX_ADDRESS, TX_ADR_WIDTH); // 为了接收接收设备的ACK包,接收通道0地址和发送地址相同
SPIRegWr(WRITE_REG + EN_AA, 0x01); // Enable Auto ack data pipe 2
SPIRegWr(WRITE_REG + EN_RXADDR, 0x01); // 使能接收通道0
SPIRegWr(WRITE_REG + SETUP_RETR, 0x1F); // 自动重发。 自动重发延时等待500us+86us,自动重发15次
SPIRegWr(WRITE_REG + RF_CH, 11); // 选择射频通道11
SPIRegWr(WRITE_REG + RF_SETUP, 0x27); // 数据传输率250KBPS,7dbm TX power
SPIRegWr(WRITE_REG + CONFIG, 0x0E); // 上电, PTX mode
CE_H;
2.2 PRX代码
要实现接收端PRX的地址设置,一些关键的代码示例如下:
//地址常量定义
#define TX_ADR_WIDTH 5
unsigned char TX_ADDRESS1[5] = {0x00,0x11,0x22,0x33,0x44}; //PIPE0地址,和PTX0地址相同,5字节
unsigned char TX_ADDRESS2[5] = {0x01,0x55,0x66,0x77,0x88}; //PIPE1地址,和PTX1地址相同,5字节
//*** 特别注意 PIPE2地址,只有一个字节,因为高4位地址和PIPE1相同
unsigned char TX_ADDRESS3 = 0x02; //PIPE2地址,和PTX2地址相同,高4位字节和PIPE1相同,只需设置最低位字节
//***** 接收端设置 ******
CE_L;
SPIRegWr((WRITE_REG + SETUP_AW, 0x03); //设置地址宽度 5字节
SPIRegWr(WRITE_REG + EN_RXADDR, 0x07); //使能PIPE0、1、2
SPIWrRegBuf(WRITE_REG + RX_ADDR_P0, TX_ADDRESS1, TX_ADR_WIDTH); //设置 PRX PIPE0地址
SPIWrRegBuf(WRITE_REG + RX_ADDR_P1, TX_ADDRESS2, TX_ADR_WIDTH); //设置 PRX PIPE1地址
//** 注意:PIPE2地址只有一个字节,所以只需要用SPIRegWR命令 **//
SPIRegWr(WRITE_REG + RX_ADDR_P2, TX_ADDRESS3); //设置 PRX PIPE2地址,1个字节,**高四位字节不需要设置,和PIPE1相同**
SPIRegWr(WRITE_REG+RX_PW_P0,2); //PIPE0 管道 Payload固定长度
SPIRegWr(WRITE_REG+RX_PW_P1,2); //PIPE1 管道 Payload固定长度
SPIRegWr(WRITE_REG+RX_PW_P2,5); //PIPE2 管道 Payload固定长度
SPIRegWr(WRITE_REG + RF_CH, 11); //选择射频通道11
SPIRegWr(WRITE_REG + RF_SETUP, 0x27); //数据传输率250KBPS,7dbm TX power
SPIRegWr(WRITE_REG + CONFIG, 0x0f); //上电, ,PRX
CE_H;
6个发送端和1个接收端之间的通信,可以看成6对独立的通信单元,只是6个接收端合并成一个了,所以一对一通信模式的一些设置要求同样适应于6对1通信模式。6对1通信中,大家采用同一个频率点,分时通信。
6对1通信的难点就在于地址的设置,所以请仔细看下面地址的设置。
6对1通信相对于1对1通信,需要使能许多额外的功能,所以在写程序时,有许多使能控制字,需要去设置。
1.基本原理如下:
1) 接收端
接收端有6个接收管道(PIPE,即有6个不同的地址),每个管道能接收一个发射端发来的数据,最多能接收6个发射端发来的数据。接收端接收信号的频率和发射端发射信号的频率是相同的、数据率是相同的。接收端是通过每个通道的地址不同,来区分接收到的是哪一个发射端发射的信号。所以,要想使接收端正确接收不同发射端的信号,需要设置每一个接收管道地址与对应的发送端发送地址相同才能实现。
其中,需要注意的是,接收管道0有单独的5字节地址,管道1至管道5共用高4字节有效地址,最低位字节用于区别管道1至管道5。所以,管道1需要设置5字节地址,管道2至管道5只需要设置一个字节的地址,即最低位地址(其高四位地址已默认与管道1的高四位地址相同)。
管道0和管道1默认是开启的,而管道2至管道5默认是关闭的,需要在EN_RXADDR寄存器中使能各个管道才能打开。
此外,发射端如果发射的是ACK信号,则发射端还需要设置它自己的接收管道0地址与自身发送地址相同。
2)发射端
发射端的发射频率必须和接收端的接收频率相同(即二者的RF_CH寄存器值相同),数据率相同(RF_SETUP寄存器来设置数据率),发射端的发射地址,必须和接收端某一管道的地址相同才能实现正确的通信。
2.程序实例
下面给出一个完整的例子,请仔细阅读每一行代码和相应的注释。
(1)说明
这个例子包含3个发射端,PTX0、PTX1、PTX2,一个接收端PRX。
三个发射端的地址分配如下:
PTX0的地址(从低到高): 0x00 0x11 0x22 0x33 0x44
PTX1的地址(从低到高): 0x01 0x55 0x66 0x77 0x88
PTX2的地址(从低到高): 0x02 0x55 0x66 0x77 0x88
注意:PTX1和PTX2的高4位地址是相同的。
接收端PRX地址分配如下:
通道0(PIPE0)地址: 0x00 0x11 0x22 0x33 0x44
通道1(PIPE1)地址: 0x01 0x55 0x66 0x77 0x88
通道2(PIPE2)地址: 0x02 0x55 0x66 0x77 0x88
注意:PIPE1和PIPE2的高4位地址是相同的。
(2)实例代码
2.1 PTX0代码如下:
//地址常量定义
#define TX_ADR_WIDTH 5
unsigned char TX_ADDRESS[5] = {0x00,0x11,0x22,0x33,0x44}; //PTX0地址,即PRX的PIPE0地址,5字节
CE_L;
SPIRegWr(WRITE_REG+ SETUP_AW, 0x03); // 5 byte Address width
SPIWrRegBuf(WRITE_REG+ TX_ADDR, TX_ADDRESS, TX_ADR_WIDTH); // 写入发送地址
SPIWrRegBuf(W_REGISTER + RX_ADDR_P0, TX_ADDRESS, TX_ADR_WIDTH); // 为了接收 接收设备的ACK包,接收通道0地址和发送地址相同
SPIRegWr(WRITE_REG + EN_AA, 0x01); // Enable Auto ack data pipe 0
SPIRegWr(WRITE_REG + EN_RXADDR, 0x01); // 使能接收通道0
SPIRegWr(WRITE_REG + SETUP_RETR, 0x1F); // 自动重发。 自动重发延时等待500us+86us,自动重发15次
SPIRegWr(WRITE_REG + RF_CH, 11); // 选择射频通道11
SPIRegWr(WRITE_REG + RF_SETUP, 0x27); // 数据传输率250KBPS,7dbm TX power
SPIRegWr(WRITE_REG + CONFIG, 0x0E); // 上电, PTX mode
CE_H;
2.2 PTX1代码如下:
//地址常量定义
#define TX_ADR_WIDTH 5
unsigned char TX_ADDRESS[5] = {0x01,0x55,0x66,0x77,0x88}; //PTX1地址,即PRX的PIPE1地址,5字节
CE_L;
SPIRegWr(WRITE_REG+ SETUP_AW, 0x03); // 5 byte Address width
SPIWrRegBuf(WRITE_REG+ TX_ADDR, TX_ADDRESS, TX_ADR_WIDTH); // 写入发送地址
SPIWrRegBuf(W_REGISTER + RX_ADDR_P0, TX_ADDRESS, TX_ADR_WIDTH); // 为了接收接收设备的ACK包,接收通道0地址和发送地址相同
SPIRegWr(WRITE_REG + EN_AA, 0x01); // Enable Auto ack data pipe 0
SPIRegWr(WRITE_REG + EN_RXADDR, 0x01); // 使能接收通道0
SPIRegWr(WRITE_REG + SETUP_RETR, 0x1F); // 自动重发。 自动重发延时等待500us+86us,自动重发15次
SPIRegWr(WRITE_REG + RF_CH, 11); // 选择射频通道11
SPIRegWr(WRITE_REG + RF_SETUP, 0x27); // 数据传输率250KBPS,7dbm TX power
SPIRegWr(WRITE_REG + CONFIG, 0x0E); // 上电, PTX mode
CE_H;
2.3 PTX2代码如下:
//地址常量定义
#define TX_ADR_WIDTH 5
unsigned char TX_ADDRESS[5] = {0x02,0x55,0x66,0x77,0x88}; //PTX2地址,即PRX的PIPE2地址,5字节
CE_L;
SPIRegWr(WRITE_REG+ SETUP_AW, 0x03); // 5 byte Address width
SPIWrRegBuf(WRITE_REG+ TX_ADDR, TX_ADDRESS, TX_ADR_WIDTH); // 写入发送地址
SPIWrRegBuf(W_REGISTER + RX_ADDR_P0, TX_ADDRESS, TX_ADR_WIDTH); // 为了接收接收设备的ACK包,接收通道0地址和发送地址相同
SPIRegWr(WRITE_REG + EN_AA, 0x01); // Enable Auto ack data pipe 2
SPIRegWr(WRITE_REG + EN_RXADDR, 0x01); // 使能接收通道0
SPIRegWr(WRITE_REG + SETUP_RETR, 0x1F); // 自动重发。 自动重发延时等待500us+86us,自动重发15次
SPIRegWr(WRITE_REG + RF_CH, 11); // 选择射频通道11
SPIRegWr(WRITE_REG + RF_SETUP, 0x27); // 数据传输率250KBPS,7dbm TX power
SPIRegWr(WRITE_REG + CONFIG, 0x0E); // 上电, PTX mode
CE_H;
2.2 PRX代码
要实现接收端PRX的地址设置,一些关键的代码示例如下:
//地址常量定义
#define TX_ADR_WIDTH 5
unsigned char TX_ADDRESS1[5] = {0x00,0x11,0x22,0x33,0x44}; //PIPE0地址,和PTX0地址相同,5字节
unsigned char TX_ADDRESS2[5] = {0x01,0x55,0x66,0x77,0x88}; //PIPE1地址,和PTX1地址相同,5字节
//*** 特别注意 PIPE2地址,只有一个字节,因为高4位地址和PIPE1相同
unsigned char TX_ADDRESS3 = 0x02; //PIPE2地址,和PTX2地址相同,高4位字节和PIPE1相同,只需设置最低位字节
//***** 接收端设置 ******
CE_L;
SPIRegWr((WRITE_REG + SETUP_AW, 0x03); //设置地址宽度 5字节
SPIRegWr(WRITE_REG + EN_RXADDR, 0x07); //使能PIPE0、1、2
SPIWrRegBuf(WRITE_REG + RX_ADDR_P0, TX_ADDRESS1, TX_ADR_WIDTH); //设置 PRX PIPE0地址
SPIWrRegBuf(WRITE_REG + RX_ADDR_P1, TX_ADDRESS2, TX_ADR_WIDTH); //设置 PRX PIPE1地址
//** 注意:PIPE2地址只有一个字节,所以只需要用SPIRegWR命令 **//
SPIRegWr(WRITE_REG + RX_ADDR_P2, TX_ADDRESS3); //设置 PRX PIPE2地址,1个字节,**高四位字节不需要设置,和PIPE1相同**
SPIRegWr(WRITE_REG+RX_PW_P0,2); //PIPE0 管道 Payload固定长度
SPIRegWr(WRITE_REG+RX_PW_P1,2); //PIPE1 管道 Payload固定长度
SPIRegWr(WRITE_REG+RX_PW_P2,5); //PIPE2 管道 Payload固定长度
SPIRegWr(WRITE_REG + RF_CH, 11); //选择射频通道11
SPIRegWr(WRITE_REG + RF_SETUP, 0x27); //数据传输率250KBPS,7dbm TX power
SPIRegWr(WRITE_REG + CONFIG, 0x0f); //上电, ,PRX
CE_H;