nRF24LE1无线监控通信开发文档
4.4跳频子函数
在跳频通信过程中主要是如何实现接收端和发送端在改变频道的过程中频道的统一,而且在频道转换过程中应当尽可能地少花费时间。nRF24LE1的频道转换时间可以满足这个要求。下面来如何从软件上实现跳频。
首先,要编辑一个随机数表: const uint8_t code
FreBuf[12]={0x28,0x49,0x38,0x07,0x19,0x17,0x2f,0x1f,0x14,0x16,0x06,0x33};
这是一个数组,称为跳频频道表,而更换频道就是用这个数组中的每个值作为一个频道,通过迅速的改变这些值实现跳频通信。跳频频道表一般不采用 1, 2, 3, 4??的顺序安排, 因为如果一个信道受到干扰, 那么与之相邻的信道很有可能也受到干扰, 考虑到W-LAN的信道带宽为22MHz, 可以用公式i+j×22 ( j=1, 2, 3, 4, 5; i=1, 2, 3) 的顺序安排跳频频道表。
//*********************************** //功能:发送端改变频道
//***********************************
void Fswitchchannel(uint8_t fre) {
CE_LOW();
hal_nrf_set_rf_channel(fre); //CE_HIGH();
hal_nrf_set_power_mode(HAL_NRF_PWR_UP); radio_status = RF_IDLE; }
//*********************************** //功能:接收端改变频道
//***********************************
void Jswitchchannel(uint8_t fre) {
CE_LOW();
hal_nrf_set_rf_channel(fre); CE_HIGH();
radio_status = RF_IDLE;
21
nRF24LE1无线监控通信开发文档
}
在这里只用到了12个频道。其实在实际应用中可以适当的增加或减少所用的频道。
4.5 发送和接收子模块
发送和接收模块是nRF24LE1的一个重要功能模块。本模块可通过调用SDK中的radio.c文件来实现。
示例代码如下: #include \
//*********************************** //功能:发送一个数据包
//*********************************** void send_packet(uint8_t command) {
bool packet_sent; uint8_t data_length; // Assemble packet
packet[0] = CMD_SEND_DATA; //相当于帧头吧 Add TYPE (data = 0x00)
//CMD_SEND_DATA=0:send a new command
//可以把第一帧设为地址(本机ID号) packet[1] = data_length = 1; // Add LENGTH (1 byte)
packet[DATA_POS] = command; //Add DATA to send;DATA_POS=7 : Defines
//the start-position of the data in packet
//可以加和校验位和尾帧 // Send packet with radio
radio_send_packet(packet, data_length+DATA_POS);
//void radio_send_packet(uint8_t *payload(待发数组的地址), uint8_t //length(总长度))
// Wait for respons from radio, TX_DS or MAX_RT
22
nRF24LE1无线监控通信开发文档
while(radio_busy()); //等到nRF产生中断,改变radio_status的值,才会
//跳出while
packet_sent = radio_packet_sent(); //改变radio_status为RF_IDLE if(packet_sent) {
LED1_BLINK(); // Packet sent, flash LED1 } else {
LED0_BLINK(); // Packet lost, flash LED0 } }
//*********************************** //功能:接收一个数据包,并放入指定的数组中 //*********************************** uint8_t read_packet(void) {
uint8_t nrf_data, data_length,type, pck_length; // Get the packet from radio
pck_length = radio_read_data(packet); //这是接受到的有效位的长度 // Disassemble packet
type = packet[0]; // Get TYPE of message data_length = packet[1]; // Get LENGTH of data part // .... Room for decryption of message ....
nrf_data = packet[DATA_POS]; // Get the received nrf_data return nrf_data; } Main() {
23
nRF24LE1无线监控通信开发文档
…
RFCKEN = 1; // enable L01 clock RF部分的CLK使能 RF = 1; // enable RF interrupt EA = 1; // Global interrupt enable …
radio_init(x); //射频收发器初始化,x=0则为接收模式;x=1则为发送模式 //************************************* //功能:若设为发送模式,发送一个数据包 //************************************* while(radio_busy()); // Wait until radio ready send_packet(CMD1); //发送数据包 //*************************************
//功能:若设为接收模式时,检测到完整数据包后接收数据 //************************************* if(radio_data_received()) //若收到完整的数据包 command = read_packet(); //读取数据包至指定数组 }
下面重点讲解一下radio.c文件。
//************************************** //功能:射频收发器初始化
//************************************** void radio_init(uint8_t operation_mode) {
CE_LOW(); // Disable radio
hal_nrf_enable_ack_payload(true); // Enable dynamic ack hal_nrf_enable_dynamic_payload(true); // Enable dynamic payload hal_nrf_setup_dynamic_payload(0xFF); // All pipes uses dynamic ack.
24
nRF24LE1无线监控通信开发文档
hal_nrf_close_pipe(HAL_NRF_ALL); // First close all radio pipes // Pipe 0 and 1 open by default hal_nrf_open_pipe(HAL_NRF_PIPE0, true); // Open pipe0, with autoack
hal_nrf_set_crc_mode(HAL_NRF_CRC_16BIT); // Operates in 16bits CRC mode hal_nrf_set_auto_retr(15, 250); // 250 delay, 15 retransmits
hal_nrf_set_address_width(HAL_NRF_AW_5BYTES); // 5 bytes address width hal_nrf_set_address(HAL_NRF_TX, address); // Set device's addresses hal_nrf_set_address(HAL_NRF_PIPE0, address); // Pipe0 used for auto ACK //hal_nrf_set_datarate(hal_nrf_datarate_t datarate)//调用来设置传输速率,默
//认为2Mbps
if(operation_mode == 0) // Mode depentant settings {
hal_nrf_set_operation_mode(HAL_NRF_PRX); // Enter RX mode CE_HIGH(); // Enable radio }
else // Mode depentant settings {
hal_nrf_set_operation_mode(HAL_NRF_PTX); // Enter TX mode }
hal_nrf_set_rf_channel(40); // Using channel 40 (2440MHz) hal_nrf_set_power_mode(HAL_NRF_PWR_UP); // Power up device
radio_status = RF_IDLE; // Radio ready, i.e. RF_IDLE }
//***************************************** //功能:射频收发器发送数据包子函数
25