BK2411 是由博通(BEKEN)推出一款国产2.4G无线收发芯片,与nRF24L01 硬件引脚兼容,软件上和nRF24L01也是基本相同,可以说是nRF24L01的国产仿制品,针对工业控制、门禁、考勤、监控、安防等行业应用特点推出。
【模块】RF2411B
【说明】RF2411B是基于BK2411芯片开发而成的无线数传模块
【应用领域】
车辆监控、遥控、遥测、小型无线网络、无线抄表、门禁系统、小区传呼、工业数据采集系统、无线标签、身份识别、非接触RF智能卡、小型无线数据终端、安全防火系统、无线遥控系统、生物信号采集、水文气象监控、机器人控制、无线232数据通信、无线485/422数据通信、数字音频、数字图像传输等。
【模块 尺寸】
34mm-17.5mm 板厚:1mm
【基本特性】
(1) 2.4Ghz 全球开放频段免许可证使用 (2) FSK调制使其拥有更好的灵敏度,GFSK调制给予了更好的频率效率 (3) 拥有1Mbps或者2Mbps的空中数据传送速率 (4) 可编程的输出功率有:-35, -25, -15, -5, 0, 5 dBm (5) 在0 dBm的输出功率下,发送模式消耗14mA的功耗; (6) 在1Mbps数据传送速率下,接受模式消耗21mA的功耗 (7) 允许+/- 60ppm 16 MHz的晶振 (8) 具有三级可变长度的有效载荷,长度可以1到32字节。或者一级可变长度的有效载荷,长度为1-255字节 (9) 自动数据处理功能 (10)适合于1:6星形网络的6数据通道,可以同时接收6个不同频率通道的数据包 (11)供应电源为1.9V到3.6V (12)在POWERDOWN模式下为3uA的直流电流,在standby-I模式下为410uA直流电流 (13)带有最大时钟速率为8Mbps MCU的4针SPI接口 (14)RF2411有20个固定引脚,4x4 mm QFN的封装
【优点】 发射功率大(5 dBm),所以最大通信距离要不nRF24L01远一些。大批量使用价格更低。
【缺点】 待机时功耗、正常模式下功耗都比nRF24L01要大,且收发状态切换时间比nRF24L01长。
编程指南配置BK2411模块是通过SPI方式进行的,可配置为FIFO方式和直接方式,我们推荐BK2411工作于FIFO收发模式,这种工作模式下,系统的程序编制会更加简单,并且稳定性也会更高,因此,下文着重介绍把BK2411配置为FIFO收发模式的器件配置方法。 使用BK2411模块无需掌握任何专业无线或高频方面的理论,读者只需要具备一定的C语言程序基础即可。其中配置BK2411主要包括载波频率、调制方式、数据发送速率、CRC校验、前导码、同步字、数据头、地址等,本文档没有涉及到的问题,读者可以参考BK2411官方手册或向我们寻求技术支持。同时,为便于用户开发,我们提供系列配套评估套件,为产品开发保驾护航,使无线应用开发大大加速,并避免不必要的误区。 程序分析命令寄存器宏定义//详细请参照英文PDF文档第16-17页 #define READ_REG 0x00 //读操作寄存器命令 #define WRITE_REG 0x20 //写操作寄存器命令 #define RD_RX_PLOAD 0x61 //读接收到数据命令 #define WR_TX_PLOAD 0xA0 //写待发送数据命令 #define FLUSH_TX 0xE1 //刷新发送FIFO命令 #define FLUSH_RX 0xE2 //刷新接收FIFO命令 #define REUSE_TX_PL 0xE3 //数据重发命令 #define W_TX_PAYLOAD_NOACK_CMD 0xb0 //在发送模式下使用,关闭自动应答 #define W_ACK_PAYLOAD_CMD 0xa8 //在接收模式下使用,将数据和ACK一起写到通道0的FIFO #define ACTIVATE_CMD 0x50 //用于激活处于掉电模式或待机模式 #define R_RX_PL_WID_CMD 0x60 //从FIFO最高开始读数据 #define NOP 0xFF // 空操作 工作方式配置寄存器宏定义//详细请参照英文PDF文档第19-24页. #define CONFIG 0x00 //配置寄存器。主要配置工作方式 #define EN_AA 0x01 //各通道自动应答设置寄存器,打开或关闭通道P0-P5的ACK #define EN_RXADDR 0x02 //各通道选择寄存器,用于打开或关闭通道P0-P5 #define SETUP_AW 0x03 //地址长度寄存器,用于设置地址长度,最小3字节,最大5字节 #define SETUP_RETR 0x04 //设置自动发送时间间隔 #define RF_CH 0x05 //工作频率设置寄存器,用于设置无线工作频率 #define RF_SETUP 0x06 // RF模式配置,用于设置功率大小,空中速率等 #define STATUS 0x07 //状态寄存器 #define OBSERVE_TX 0x08 //发送检测寄存器 #define CD 0x09 //载波侦听寄存器,用于检测空中是否有无线信号 #define RX_ADDR_P0 0x0A // P0接收地址 #define RX_ADDR_P1 0x0B // P0接收地址 #define RX_ADDR_P2 0x0C // P1接收地址 #define RX_ADDR_P3 0x0D // P2接收地址 #define RX_ADDR_P4 0x0E // P2接收地址 #define RX_ADDR_P5 0x0F // P3接收地址 #define TX_ADDR 0x10 // 发送地址 #define RX_PW_P0 0x11 // P0接收数据长度 #define RX_PW_P1 0x12 // P1接收数据长度 #define RX_PW_P2 0x13 // P2接收数据长度 #define RX_PW_P3 0x14 // P3接收数据长度 #define RX_PW_P4 0x15 // P4接收数据长度 #define RX_PW_P5 0x16 // P5接收数据长度 #define FIFO_STATUS 0x17 // FIFO状态寄存器,检测FIFO状态 #define PAYLOAD_WIDTH 0x1f // address 发送数据长度设置寄存器 //RF2411状态寄存器,详细请参照英文PDF文档第19页 #define STATUS_RX_DR 0x40 // 数据接收状态标志位 #define STATUS_TX_DS 0x20 // 数据发送状态标志位 #define STATUS_MAX_RT 0x10 // #define STATUS_TX_FULL 0x01 // 状态寄存器宏定义//详细请参照英文PDF文档第23页 #define FIFO_STATUS_TX_REUSE 0x40 #define FIFO_STATUS_TX_FULL 0x20 #define FIFO_STATUS_TX_EMPTY 0x10 #define FIFO_STATUS_RX_FULL 0x02 #define FIFO_STATUS_RX_EMPTY 0x01 自动应答寄存器宏定义#define REG2_BUFFER_COUNT 0x02 #define REG3_STATUS 0x03 #define ASK_Rx_Full (1<<7) #define ASK_Rx_Empty (1<<6) #define ASK_Tx_Full (1<<5) #define ASK_Tx_Empty (1<<4) #define ASK__Reserved (1<<3) #define ASK__Irqn_Tx_Err (1<<2) #define ASK_Irqn_Rx_Done (1<<1) #define ASK_Irqn_Tx_Done (1<<0) #define ASK_Irqn_ALL (ASK__Irqn_Tx_Err|ASK_Irqn_Rx_Done|ASK_Irqn_Tx_Done) BK2411 SPI读写时序操作char SPI_RW(char _char) { char bit_ctr; for(bit_ctr=0;bit_ctr<8;bit_ctr++) // output 8-bit { RF2411_MOSI = (_char & 0x80); // output 'char', MSB to MOSI _char = (_char << 1); // shift next bit into MSB.. RF2411_SCK = 1; // Set SCK high.. _char |= RF2411_MISO; // capture current MISO bit RF2411_SCK = 0; // ..then set SCK low again } return(_char); // return read char } BK2411 SPI写寄存器操作void SPI_Write_Reg(char reg, char value) { RF2411_CSN = 0; // CSN low, init SPI transaction op_status = SPI_RW(reg); // select register SPI_RW(value); // ..and write value to it.. RF2411_CSN = 1; // CSN high again } BK2411 SPI读寄存器操作char SPI_Read_Reg(char reg) { char value; RF2411_CSN = 0; // CSN low, initialize SPI communication... op_status=SPI_RW(reg); // Select register to read from.. value = SPI_RW(0); // ..then read registervalue RF2411_CSN = 1; // CSN high, terminate SPI communication return(value); // return register value } 工作模式初始化unsigned char code RegArrFSK[][2]= { {0,0x0e}, //CONFIG配置,IRQ引脚状态用于指示状态信息,配置为16位CRC校验,内部上电开启, {1,0x3F}, //EN_AA ,所有通道都允许自动应答功能 {2,0x3F}, //EN_RXADDR,p0-p5通道全部打开 {3,0x03}, //SETUP_AW,地址长度设置为5字节 {4,0x31}, //SETUP_RETR {5,0x17}, //RF_CH,工作频率设置为2.423GHZ {6,0x15}, //RF_SETUP,{6,0x17},//1Mbps速率,功率设置为最大5db {7,0x07}, //STATUS ,配置为数据包传输模式 {8,0x00}, //OBSERVE_TX {9,0x00}, //CD {12,0xc3}, //RX_ADDR_P2 {13,0xc4}, //RX_ADDR_P3 {14,0xc5}, //RX_ADDR_P4 {15,0xc6}, //RX_ADDR_P5 {17,0x20}, //RX_PW_P0 {18,0x20}, //RX_PW_P1 {19,0x20}, //RX_PW_P2 {20,0x20}, //RX_PW_P3 {21,0x20}, //RX_PW_P4 {22,0x20}, //RX_PW_P5 {23,0x00}, //FIFO状态寄存器 {28,0x3F}, //支持可变长数据包模式 {29,0x07} }; BK2411发送模式设置void SwitchToTxMode(void) { unsigned char value; SPI_Write_Reg(FLUSH_TX,0); //刷新 Tx-FIFO value=SPI_Read_Reg(CONFIG); //读取CONTIG状态 value=value&0xfd; //POWER DOWN 掉电 SPI_Write_Reg(WRITE_REG + CONFIG, value); value=value&0xfe; SPI_Write_Reg(WRITE_REG + CONFIG, value); //接收模式 value=value|0x02; SPI_Write_Reg(WRITE_REG + CONFIG, value); //POWER ON 上电启动,并切换为发送模式 } BK2411数据发送流程void RF2411_SendPacket(unsigned char* buf,unsigned char len) { unsigned char temp=0; SPI_Write_Buf(W_TX_PAYLOAD_NOACK_CMD,buf, len); RF2411_Delay(400); do { temp = SPI_Read_Reg(0x07); }while(!(temp&0x70)); //判断 TX_DS,是否发送完毕 SPI_Write_Reg(0x07|WRITE_REG,0x70); //刷新状态寄存器,为一次一收发数据准备 } BK2411接收模式设置void SwitchToRxMode(void) { unsigned char value; SPI_Write_Reg(FLUSH_RX,0); //刷新 Rx-FIFO value=SPI_Read_Reg(STATUS); //读取工作状态 SPI_Write_Reg(WRITE_REG+STATUS,value); // clear RX_DR or TX_DS or MAX_RT interrupt flag value=SPI_Read_Reg(CONFIG); //读取CONTIG状态 value=value&0xfd; SPI_Write_Reg(WRITE_REG + CONFIG, value); //先POWER DOWN 掉电 value=value|0x01; SPI_Write_Reg(WRITE_REG + CONFIG, value); //设置为发送模式 value=value|0x02; SPI_Write_Reg(WRITE_REG + CONFIG, value); //上电启动,并切换为接收模式 RF2411_CE=1; } BK2411接收数据流程void RF2411_ReceivePacket(unsigned char* buf) { unsigned char payloadLen; payloadLen=SPI_Read_Reg(R_RX_PL_WID_CMD); SPI_Read_Buf(RD_RX_PLOAD,buf,payloadLen); } 无线应用注意事项(1) 无线模块的VCC电压范围为 1.8V-3.6V之间,不能在这个区间之外,超过3.6V将会烧毁模块。推荐电压3.3V左右。 (2) 除电源VCC和接地端,其余脚都可以直接和普通的51单片机IO口直接相连,无需电平转换。当然对3V左右的单片机更加适用了。 (3) 硬件上面没有SPI的单片机也可以控制本模块,用普通单片机IO口模拟SPI不需要单片机真正的串口介入,只需要普通的单片机IO口就可以了,当然用串口也可以了。模块按照接口提示和母板的逻辑地连接起来 (4) 标准DIP插针,如需要其他封装接口,或其他形式的接口,可联系我们定做。 (5) 任何单片机都可实现对无线模块的数据收发控制,并可根据我们提供的程序,然后结合自己擅长的单片机型号进行移植; (6) 频道的间隔的说明:实际要想2个模块同时发射不相互干扰,两者频道间隔应该至少相差1MHZ,这在组网时必须注意,否则同频比干扰。 (7) 实际用户可能会应用其他自己熟悉的单片机做为主控芯片,所以,建议大家在移植时注意以下4点: A:确保IO是输入输出方式,且必须设置成数字IO; B:注意与使用的IO相关的寄存器设置,尤其是带外部中断、带AD功能的IO,相关寄存器一定要设置好; C:调试时先写配置字,然后控制数据收发 D:注意工作模式切换时间
|