本笔记是可穿戴芯片nRF51822 的2.4G无线通信测试程序。
一、大概了解
(1) 通信速率设定,与平常我们使用的24L01一样,可设为三种不同的速率——250ksps,1Msps ,和2Msps
(2)发送端输出功率可编程,从+4dB到-20dBm , 一次以4dB的步进。省电模式:-30dBm
接收器集成了最大接收灵敏度的通道滤波器。动态负载长度。
(3)8位,16位,24位可编程CRC校验
(4)集成了DMA 功能,有利于复杂数据的管理和传输。
二、程序编写
1、初始化
1) 使用16MHz 晶振,并关闭低频晶振。等待起振。
NRF_CLOCK->EVENTS_HFCLKSTARTED = 0;
NRF_CLOCK->TASKS_HFCLKSTART = 1;
while (NRF_CLOCK->EVENTS_HFCLKSTARTED == 0);
2)设置按键为上拉输入。
nrf_gpio_range_cfg_input(BUTTON_START, BUTTON_STOP, NRF_GPIO_PIN_PULLUP);
2、 配置RADIO
发送功率——有8种可选的功率——
这里选择0dBm,
NRF_RADIO->TXPOWER = (RADIO_TXPOWER_TXPOWER_0dBm << RADIO_TXPOWER_TXPOWER_Pos);
说明: RADIO_TXPOWER_TXPOWER_Pos 这里宏定义为0x00, 其实如上图可知,这个TXPOWER寄存器有32位,但并不是全部都用上,只用上了后8位,所以起始位为0x00 , 假如用上了8~15位,这里
RADIO_TXPOWER_TXPOWER_Pos 就应该宏定义为0x08 了。
3、具体配置程序
/*
* 2.4 无线通信配置程序
*/
#include "radio_config.h"
#include "nrf_delay.h"
#define PACKET0_S1_SIZE (0UL) // 无符号长整型 0
#define PACKET0_S0_SIZE (0UL) //
#define PACKET0_PAYLOAD_SIZE (0UL) //包0负载大小
#define PACKET1_BASE_ADDRESS_LENGTH (4UL) //基地址长度
#define PACKET1_STATIC_LENGTH (1UL) //静态存储长度
#define PACKET1_PAYLOAD_SIZE (1UL) //包1负载大小
void radio_configure()
{
// Radio config
//(Pos 是有效位,每一个寄存器都是32位,但是用到的只有几个,其余都是保留位,所以要移位)
/*发送功率
RADIO_TXPOWER_TXPOWER_Pos4dBm
RADIO_TXPOWER_TXPOWER_0dBm
RADIO_TXPOWER_TXPOWER_Neg4dBm
RADIO_TXPOWER_TXPOWER_Neg8dBm
RADIO_TXPOWER_TXPOWER_Neg12dBm
RADIO_TXPOWER_TXPOWER_Neg16dBm
RADIO_TXPOWER_TXPOWER_Neg20dBm
RADIO_TXPOWER_TXPOWER_Neg30dBm
*/
NRF_RADIO->TXPOWER = (RADIO_TXPOWER_TXPOWER_0dBm << RADIO_TXPOWER_TXPOWER_Pos);
//RF 频率 = 2400+ A(MHz) ,A最大83,因为ISM 给的频率最大就是2.4835GHz
NRF_RADIO->FREQUENCY = 7UL; // Frequency bin 7, 2407MHz
/*
* 发送速率设定,有四种
*RADIO_MODE_MODE_Nrf_1Mbit
RADIO_MODE_MODE_Nrf_2Mbit
RADIO_MODE_MODE_Nrf_250Kbit
RADIO_MODE_MODE_Ble_1Mbit
*/
NRF_RADIO->MODE = (RADIO_MODE_MODE_Nrf_2Mbit << RADIO_MODE_MODE_Pos);
// Radio address config
NRF_RADIO->PREFIX0 = 0xC4C3C2E7UL; // Prefix byte of addresses 3 to 0
NRF_RADIO->PREFIX1 = 0xC5C6C7C8UL; // Prefix byte of addresses 7 to 4
NRF_RADIO->BASE0 = 0xE7E7E7E7UL; // Base address for prefix 0
NRF_RADIO->BASE1 = 0x00C2C2C2UL; // Base address for prefix 1-7
NRF_RADIO->TXADDRESS = 0x00UL; // Set device address 0 to use when transmitting
NRF_RADIO->RXADDRESSES = 0x01UL; // Enable device address 0 to use which receiving
// 数据包配置
NRF_RADIO->PCNF0 = (PACKET0_S1_SIZE << RADIO_PCNF0_S1LEN_Pos) |
(PACKET0_S0_SIZE << RADIO_PCNF0_S0LEN_Pos) |
(PACKET0_PAYLOAD_SIZE << RADIO_PCNF0_LFLEN_Pos);
// 数据包配置
/*
* 不对信号美白
最大有效位在前
静态长度为1,比设定而多发送或者接受的字节存储空间
包长为1
*/
NRF_RADIO->PCNF1 = (RADIO_PCNF1_WHITEEN_Disabled << RADIO_PCNF1_WHITEEN_Pos) |
(RADIO_PCNF1_ENDIAN_Big << RADIO_PCNF1_ENDIAN_Pos) |
(PACKET1_BASE_ADDRESS_LENGTH << RADIO_PCNF1_BALEN_Pos) |
(PACKET1_STATIC_LENGTH << RADIO_PCNF1_STATLEN_Pos) |
(PACKET1_PAYLOAD_SIZE << RADIO_PCNF1_MAXLEN_Pos); //lint !e845 "The right argument to operator '|' is certain to be 0"
// CRC Config
/*
CRC检验字节数,2个
*/
NRF_RADIO->CRCCNF = (RADIO_CRCCNF_LEN_Two << RADIO_CRCCNF_LEN_Pos); // Number of checksum bits
if ((NRF_RADIO->CRCCNF & RADIO_CRCCNF_LEN_Msk) == (RADIO_CRCCNF_LEN_Two << RADIO_CRCCNF_LEN_Pos))
{
NRF_RADIO->CRCINIT = 0xFFFFUL; // Initial value
NRF_RADIO->CRCPOLY = 0x11021UL; // CRC poly: x^16+x^12^x^5+1
}
else if ((NRF_RADIO->CRCCNF & RADIO_CRCCNF_LEN_Msk) == (RADIO_CRCCNF_LEN_One << RADIO_CRCCNF_LEN_Pos))
{
NRF_RADIO->CRCINIT = 0xFFUL; // Initial value
NRF_RADIO->CRCPOLY = 0x107UL; // CRC poly: x^8+x^2^x^1+1
}
nrf_delay_ms(3);
}
文章评论(0条评论)
登录后参与讨论