【NCS随笔】Nordic芯片如何添加PA的驱动
·
NCS添加对PA的支持
PA(Power Amplifier)功率放大器,一般PA的作用顾名思义就是用来增大发射功率的,如果将蓝牙信号比作说话的声音,那么PA就是一个增大声音的喇叭,可以将声音传的更远,适合对于功耗没有要求,但是对连接距离和连接稳定性的用户。
这篇文章将给给读者介绍了在nRF52_SDK和在NCS驱动PA芯片的办法:
NCS
nRF Connect SDK 提供了使用多协议服务层 (MPSL) 库根据设备树 (DTS) 和 Kconfig 信息配置 FEM 的代码,针对普通的2线驱动PA和Nordic自身的nRF21540PA有两种驱动方式
普通2线方式驱动的是通过GPIO驱动,然而nRF21540可以通过GPIO驱动,也可以通过SPI驱动,nRF21540通过SPI的好处是可以选择nRF21540驱动的模式例如调整发射功率或者更换天线输出等
我目前是在ncs2.9.0下面测试的:
GPIO方式
在设备树里面添加如下GPIO定义,以skyworks为例或者用RFX2401C也一样
/ {
nrf_radio_fem: skyworks_fem {
compatible = "skyworks,sky66112-11", "generic-fem-two-ctrl-pins";
ctx-gpios = <&gpio0 13 GPIO_ACTIVE_HIGH>;
crx-gpios = <&gpio0 14 GPIO_ACTIVE_HIGH>;
};
};
以nRF21540为例的GPIO方式
/ {
nrf21540_fem: nrf21540_fem {
compatible = "nordic,nrf21540-fem";
tx-en-gpios = <&gpio0 13 GPIO_ACTIVE_HIGH>;
rx-en-gpios = <&gpio0 14 GPIO_ACTIVE_HIGH>;
pdn-gpios = <&gpio0 15 GPIO_ACTIVE_HIGH>;
};
};
nRF21540 的SPI方式
/{
nrf21540_fem: nrf21540_fem{
compatible = "nordic,nrf21540-fem";
tx-en-gpios = <&gpio0 24 GPIO_ACTIVE_HIGH>;
rx-en-gpios = <&gpio0 22 GPIO_ACTIVE_HIGH>;
pdn-gpios = <&gpio1 10 GPIO_ACTIVE_HIGH>;
mode-gpios = <&gpio1 13 GPIO_ACTIVE_HIGH>;
spi-if = <&nrf_radio_fem_spi>;
supply-voltage-mv = <3300>;
};
};
fem_spi: &spi3 {
status = "okay";
pinctrl-0 = <&spi3_default>;
pinctrl-1 = <&spi3_sleep>;
pinctrl-names = "default", "sleep";
cs-gpios = <&gpio1 1 GPIO_ACTIVE_LOW>;
nrf_radio_fem_spi: nrf21540_fem_spi@0 {
compatible = "nordic,nrf21540-fem-spi";
status = "okay";
reg = <0>;
spi-max-frequency = <8000000>;
};
};
&spi3_default {
group1{
psels = <NRF_PSEL(SPIM_SCK,1,6)>,
<NRF_PSEL(SPIM_MISO,1,4)>,
<NRF_PSEL(SPIM_MOSI,1,2)>;
};
};
&spi3_sleep {
group1{
psels = <NRF_PSEL(SPIM_SCK,1,6)>,
<NRF_PSEL(SPIM_MISO,1,4)>,
<NRF_PSEL(SPIM_MOSI,1,2)>;
low-power-enable;
};
};
nRF5_SDK
static void pa_assist(uint32_t gpio_pa_pin, uint32_t gpio_lna_pin)
{
static const uint32_t gpio_toggle_ch = 0;
static const uint32_t ppi_set_ch = 0;
static const uint32_t ppi_clr_ch = 1;
//Configure SoftDevice PA assist
ble_opt_t opt;
memset(&opt, 0, sizeof(opt));
opt.common_opt.pa_lna.gpiote_ch_id = gpio_toggle_ch;
opt.common_opt.pa_lna.ppi_ch_id_clr = ppi_set_ch;
opt.common_opt.pa_lna.ppi_ch_id_set = ppi_clr_ch;
opt.common_opt.pa_lna.pa_cfg.active_high = 1;
opt.common_opt.pa_lna.pa_cfg.enable = 1;
opt.common_opt.pa_lna.pa_cfg.gpio_pin = gpio_pa_pin;
opt.common_opt.pa_lna.lna_cfg.active_high = 1;
opt.common_opt.pa_lna.lna_cfg.enable = 1;
opt.common_opt.pa_lna.lna_cfg.gpio_pin = gpio_lna_pin;
APP_ERROR_CHECK(sd_ble_opt_set(BLE_COMMON_OPT_PA_LNA, &opt));
mesh_pa_lna_params.pa_cfg.active_high=1;
mesh_pa_lna_params.pa_cfg.enable =1;
mesh_pa_lna_params.pa_cfg.gpio_pin = gpio_pa_pin;
mesh_pa_lna_params.lna_cfg.active_high = 1;
mesh_pa_lna_params.lna_cfg.enable = 1;
mesh_pa_lna_params.lna_cfg.gpio_pin =gpio_lna_pin;
mesh_pa_lna_params.ppi_ch_id_clr = opt.common_opt.pa_lna.ppi_ch_id_clr;
mesh_pa_lna_params.ppi_ch_id_set = opt.common_opt.pa_lna.ppi_ch_id_set;
mesh_pa_lna_params.gpiote_ch_id = opt.common_opt.pa_lna.gpiote_ch_id = gpio_toggle_ch;
}
#endif
#define PA_TX NRF_GPIO_PIN_MAP(0,24)
#define PA_RX NRF_GPIO_PIN_MAP(0,20)
然后再main函数的协议栈初始化后面调用函数
怎么知道是否成功驱动起了PA
1、通过手机APP nRF Connect扫描,看下RSSI的信号强度是否变强了
2、功耗,正常PA驱动起来功耗会变高
3、逻辑分析仪或者示波器抓PA驱动的引脚,如果正常驱动起来,设备在广播的话,会有三个脉冲,而且频率是你的广播间隔,类似如下

最后一如既往的到了臭不要脸环节,作为一名精通Nordic硬件设计和软件开发的FAE,你的点赞、收藏和评论是对我最大的支持,有问题多多指教,如果有需要Nordic开发板、Nordic的芯片以及Nordic技术支持的可以在个人资料获取我的联系,感谢读者支持!
DAMO开发者矩阵,由阿里巴巴达摩院和中国互联网协会联合发起,致力于探讨最前沿的技术趋势与应用成果,搭建高质量的交流与分享平台,推动技术创新与产业应用链接,围绕“人工智能与新型计算”构建开放共享的开发者生态。
更多推荐
所有评论(0)