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技术支持的可以在个人资料获取我的联系,感谢读者支持!
Logo

DAMO开发者矩阵,由阿里巴巴达摩院和中国互联网协会联合发起,致力于探讨最前沿的技术趋势与应用成果,搭建高质量的交流与分享平台,推动技术创新与产业应用链接,围绕“人工智能与新型计算”构建开放共享的开发者生态。

更多推荐