車輛監(jiān)控、遙控、遙測、小型無線網(wǎng)絡(luò)、無線抄表、門禁系統(tǒng)、小區(qū)傳呼、工業(yè)數(shù)據(jù)采集系統(tǒng)、無線標簽、身份識別、非接觸RF智能卡、小型無線數(shù)據(jù)終端、安全防火系統(tǒng)、無線遙控系統(tǒng)、生物信號采集、水文氣象監(jiān)控、機器人控制、無線232數(shù)據(jù)通信、無線485/422數(shù)據(jù)通信、數(shù)字音頻、數(shù)字圖像傳輸?shù)取?/strong>
【模塊 尺寸】
34mm-17.5mm 板厚:1mm
【基本特性】
(1) 2.4Ghz 全球開放頻段免許可證使用
(2) FSK調(diào)制使其擁有更好的靈敏度,GFSK調(diào)制給予了更好的頻率效率
(3) 擁有1Mbps或者2Mbps的空中數(shù)據(jù)傳送速率
(4) 可編程的輸出功率有:-35, -25, -15, -5, 0, 5 dBm
(5) 在0 dBm的輸出功率下,發(fā)送模式消耗14mA的功耗;
(6) 在1Mbps數(shù)據(jù)傳送速率下,接受模式消耗21mA的功耗
(7) 允許+/- 60ppm 16 MHz的晶振
(8) 具有三級可變長度的有效載荷,長度可以1到32字節(jié)。或者一級可變長度的有效載荷,長度為1-255字節(jié)
(9) 自動數(shù)據(jù)處理功能
(10)適合于1:6星形網(wǎng)絡(luò)的6數(shù)據(jù)通道,可以同時接收6個不同頻率通道的數(shù)據(jù)包
(11)供應(yīng)電源為1.9V到3.6V
(12)在POWERDOWN模式下為3uA的直流電流,在standby-I模式下為410uA直流電流
(13)帶有最大時鐘速率為8Mbps MCU的4針SPI接口
(14)RF2411有20個固定引腳,4x4 mm QFN的封裝
【優(yōu)點】
發(fā)射功率大(5 dBm),所以最大通信距離要不nRF24L01遠一些。大批量使用價格更低。
【缺點】
待機時功耗、正常模式下功耗都比nRF24L01要大,且收發(fā)狀態(tài)切換時間比nRF24L01長。
編程指南配置BK2411模塊是通過SPI方式進行的,可配置為FIFO方式和直接方式,我們推薦BK2411工作于FIFO收發(fā)模式,這種工作模式下,系統(tǒng)的程序編制會更加簡單,并且穩(wěn)定性也會更高,因此,下文著重介紹把BK2411配置為FIFO收發(fā)模式的器件配置方法。
使用BK2411模塊無需掌握任何專業(yè)無線或高頻方面的理論,讀者只需要具備一定的C語言程序基礎(chǔ)即可。其中配置BK2411主要包括載波頻率、調(diào)制方式、數(shù)據(jù)發(fā)送速率、CRC校驗、前導(dǎo)碼、同步字、數(shù)據(jù)頭、地址等,本文檔沒有涉及到的問題,讀者可以參考BK2411官方手冊或向我們尋求技術(shù)支持。同時,為便于用戶開發(fā),我們提供系列配套評估套件,為產(chǎn)品開發(fā)保駕護航,使無線應(yīng)用開發(fā)大大加速,并避免不必要的誤區(qū)。
程序分析命令寄存器宏定義//詳細請參照英文PDF文檔第16-17頁
#define READ_REG 0x00 //讀操作寄存器命令
#define WRITE_REG 0x20 //寫操作寄存器命令
#define RD_RX_PLOAD 0x61 //讀接收到數(shù)據(jù)命令
#define WR_TX_PLOAD 0xA0 //寫待發(fā)送數(shù)據(jù)命令
#define FLUSH_TX 0xE1 //刷新發(fā)送FIFO命令
#define FLUSH_RX 0xE2 //刷新接收FIFO命令
#define REUSE_TX_PL 0xE3 //數(shù)據(jù)重發(fā)命令
#define W_TX_PAYLOAD_NOACK_CMD 0xb0 //在發(fā)送模式下使用,關(guān)閉自動應(yīng)答
#define W_ACK_PAYLOAD_CMD 0xa8
//在接收模式下使用,將數(shù)據(jù)和ACK一起寫到通道0的FIFO
#define ACTIVATE_CMD 0x50 //用于激活處于掉電模式或待機模式
#define R_RX_PL_WID_CMD 0x60 //從FIFO最高開始讀數(shù)據(jù)
#define NOP 0xFF // 空操作
工作方式配置寄存器宏定義//詳細請參照英文PDF文檔第19-24頁.
#define CONFIG 0x00
//配置寄存器。主要配置工作方式
#define EN_AA 0x01
//各通道自動應(yīng)答設(shè)置寄存器,打開或關(guān)閉通道P0-P5的ACK
#define EN_RXADDR 0x02
//各通道選擇寄存器,用于打開或關(guān)閉通道P0-P5
#define SETUP_AW 0x03
//地址長度寄存器,用于設(shè)置地址長度,最小3字節(jié),最大5字節(jié)
#define SETUP_RETR 0x04
//設(shè)置自動發(fā)送時間間隔
#define RF_CH 0x05
//工作頻率設(shè)置寄存器,用于設(shè)置無線工作頻率
#define RF_SETUP 0x06
// RF模式配置,用于設(shè)置功率大小,空中速率等
#define STATUS 0x07
//狀態(tài)寄存器
#define OBSERVE_TX 0x08
//發(fā)送檢測寄存器
#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 // 發(fā)送地址
#define RX_PW_P0 0x11 // P0接收數(shù)據(jù)長度
#define RX_PW_P1 0x12 // P1接收數(shù)據(jù)長度
#define RX_PW_P2 0x13 // P2接收數(shù)據(jù)長度
#define RX_PW_P3 0x14 // P3接收數(shù)據(jù)長度
#define RX_PW_P4 0x15 // P4接收數(shù)據(jù)長度
#define RX_PW_P5 0x16 // P5接收數(shù)據(jù)長度
#define FIFO_STATUS 0x17 // FIFO狀態(tài)寄存器,檢測FIFO狀態(tài)
#define PAYLOAD_WIDTH 0x1f // address 發(fā)送數(shù)據(jù)長度設(shè)置寄存器
//RF2411狀態(tài)寄存器,詳細請參照英文PDF文檔第19頁
#define STATUS_RX_DR 0x40 // 數(shù)據(jù)接收狀態(tài)標志位
#define STATUS_TX_DS 0x20 // 數(shù)據(jù)發(fā)送狀態(tài)標志位
#define STATUS_MAX_RT 0x10 //
#define STATUS_TX_FULL 0x01 //
狀態(tài)寄存器宏定義//詳細請參照英文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
自動應(yīng)答寄存器宏定義#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引腳狀態(tài)用于指示狀態(tài)信息,配置為16位CRC校驗,內(nèi)部上電開啟,
{1,0x3F}, //EN_AA ,所有通道都允許自動應(yīng)答功能
{2,0x3F}, //EN_RXADDR,p0-p5通道全部打開
{3,0x03}, //SETUP_AW,地址長度設(shè)置為5字節(jié)
{4,0x31}, //SETUP_RETR
{5,0x17}, //RF_CH,工作頻率設(shè)置為2.423GHZ
{6,0x15}, //RF_SETUP,{6,0x17},//1Mbps速率,功率設(shè)置為最大5db
{7,0x07}, //STATUS ,配置為數(shù)據(jù)包傳輸模式
{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狀態(tài)寄存器
{28,0x3F}, //支持可變長數(shù)據(jù)包模式
{29,0x07}
};
BK2411發(fā)送模式設(shè)置void SwitchToTxMode(void)
{
unsigned char value;
SPI_Write_Reg(FLUSH_TX,0); //刷新 Tx-FIFO
value=SPI_Read_Reg(CONFIG); //讀取CONTIG狀態(tài)
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 上電啟動,并切換為發(fā)送模式
}
BK2411數(shù)據(jù)發(fā)送流程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,是否發(fā)送完畢
SPI_Write_Reg(0x07|WRITE_REG,0x70); //刷新狀態(tài)寄存器,為一次一收發(fā)數(shù)據(jù)準備
}
BK2411接收模式設(shè)置void SwitchToRxMode(void)
{
unsigned char value;
SPI_Write_Reg(FLUSH_RX,0); //刷新 Rx-FIFO
value=SPI_Read_Reg(STATUS); //讀取工作狀態(tài)
SPI_Write_Reg(WRITE_REG+STATUS,value);
// clear RX_DR or TX_DS or MAX_RT interrupt flag
value=SPI_Read_Reg(CONFIG); //讀取CONTIG狀態(tài)
value=value&0xfd;
SPI_Write_Reg(WRITE_REG + CONFIG, value); //先POWER DOWN 掉電
value=value|0x01;
SPI_Write_Reg(WRITE_REG + CONFIG, value); //設(shè)置為發(fā)送模式
value=value|0x02;
SPI_Write_Reg(WRITE_REG + CONFIG, value); //上電啟動,并切換為接收模式
RF2411_CE=1;
}
BK2411接收數(shù)據(jù)流程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);
}
無線應(yīng)用注意事項(1) 無線模塊的VCC電壓范圍為 1.8V-3.6V之間,不能在這個區(qū)間之外,超過3.6V將會燒毀模塊。推薦電壓3.3V左右。
(2) 除電源VCC和接地端,其余腳都可以直接和普通的51單片機IO口直接相連,無需電平轉(zhuǎn)換。當然對3V左右的單片機更加適用了。
(3) 硬件上面沒有SPI的單片機也可以控制本模塊,用普通單片機IO口模擬SPI不需要單片機真正的串口介入,只需要普通的單片機IO口就可以了,當然用串口也可以了。模塊按照接口提示和母板的邏輯地連接起來
(4) 標準DIP插針,如需要其他封裝接口,或其他形式的接口,可聯(lián)系我們定做。
(5) 任何單片機都可實現(xiàn)對無線模塊的數(shù)據(jù)收發(fā)控制,并可根據(jù)我們提供的程序,然后結(jié)合自己擅長的單片機型號進行移植;
(6) 頻道的間隔的說明:實際要想2個模塊同時發(fā)射不相互干擾,兩者頻道間隔應(yīng)該至少相差1MHZ,這在組網(wǎng)時必須注意,否則同頻比干擾。
(7) 實際用戶可能會應(yīng)用其他自己熟悉的單片機做為主控芯片,所以,建議大家在移植時注意以下4點:
A:確保IO是輸入輸出方式,且必須設(shè)置成數(shù)字IO;
B:注意與使用的IO相關(guān)的寄存器設(shè)置,尤其是帶外部中斷、帶AD功能的IO,相關(guān)寄存器一定要設(shè)置好;
C:調(diào)試時先寫配置字,然后控制數(shù)據(jù)收發(fā)
D:注意工作模式切換時間