以SES
环境使能CONFIG_NFCT_PINS_AS_GPIOS
为例。仅仅在预编译宏中添加CONFIG_NFCT_PINS_AS_GPIOS
宏定义是无效的。需要修改linker
文件。
这里,我们需要在0x1000120C
地址写入0xFFFFFFFE
。首先在linker
文件的MEMORY
段中定义这个地址如下:
UICR_NFC_MEM (r) : ORIGIN = 0x1000120C, LENGTH = 0x04
然后新建一个SECTIONS
描述如下:
SECTIONS
{
.uicr_nfc :
{
KEEP(*(.uicr_nfc))
} > UICR_NFC_MEM
}
接下来我们在一个确定会编译的c文件中加入如下代码,一般我们放在main.c
中:
#ifdef CONFIG_NFCT_PINS_AS_GPIOS
volatile uint32_t UICR_ADDR_0x20C __attribute__((section("uicr_nfc"))) = 0xFFFFFFFE;
#endif
其中,变量名可以随意定义。宏定义也非必须。
最后,我们对芯片执行全部擦除,然后项目执行rebuild
,之后再烧录就可以正常写入UICR
配置了。
指定#define NRF_SDH_BLE_GATT_MAX_MTU_SIZE 247
宏开启最大MTU
在advertising_init()
中添加init.config.ble_adv_extended_enabled = true;
配置即可直接使能扩展广播
BLE从机发送缓冲区溢出会导致发送中断,并在下一次发送时发生断开。需要捕获和处理报错。
可以额外添加一级缓冲,并对超出缓冲区的部分做丢弃处理。
当m_advertising.adv_data.adv_data.len
与其中EIR
长度之和不等时,发生的解析错误可能将相邻广播包连接起来。
其机制还需进一步分析了解。
使用ble_advertising_advdata_update
更新广播信息时。
在广播开启时,更改内容实时生效,更改广播长度在下一次开启广播时生效
CSW-V1
上,在250ms
连接间隔下,使用request
方式通信只能达到2Hz左右的频率。CSW-V1
上,在250ms
连接间隔下,使用command
方式通信,延迟在1-2个连接间隔。CSW-B5
上,在250ms
连接间隔下,使用command
方式通信,延迟在几十ms之内,且在80ms内即返回了24个数据包。同时,测试功耗没有异常。更改gap_conn_cfg.event_length
至16
可实现每个连接间隔可返回20+
个数据包
gap_conn_cfg.event_length
默认值为3
,其为一个以1.25ms
为单位的窗口时间,每个连接间隔能够通信的时长由这个窗口的时间决定。
断开原因为:0x08(timeout
)
考虑调整晶振精度参数,降低精度要求:比如从20ppm
改为50ppm
可能原因有:
Case ID: 207373
问题: 在o2优化等级下,被写入的数据指针会有非 word 对齐的情况,此时会报错。
解决: 对需要使用 fds 写入的数据均使用强制 word 对齐。在 SES 中可使用__ALIGN(4)
编译时更改
去掉CONFIG_GPIO_AS_PINRESET
宏,重新完全编译。
使用nrfjrog -eraseuicr
擦除 UICR 区域。因为使用 IDE 烧录是不会主动擦除 UICR 的,会导致 reset 引脚的配置没有改变。
发行后更改
使用如下函数可以禁用UICR中的reset引脚复位功能。
/** Function to disable pin reset by writing an invalid configuration (all 0) to PSELRESET[1] */
static void disable_pin_reset(void)
{
// Only perform if needed (which is the first time this code runs)
if (NRF_UICR->PSELRESET[1] != 0)
{
NRF_LOG_INFO("Disabling pin reset.");
NRF_NVMC->CONFIG = NVMC_CONFIG_WEN_Wen;
while (NRF_NVMC->READY == NVMC_READY_READY_Busy){}
NRF_UICR->PSELRESET[1] = 0;
NRF_NVMC->CONFIG = NVMC_CONFIG_WEN_Ren;
while (NRF_NVMC->READY == NVMC_READY_READY_Busy){}
// System reset is needed to update UICR registers.
NVIC_SystemReset();
}
}
参考: https://electronut.in/nrf52-i2s-ws2812
sck
引脚功能被占据时,会导致除lrck
引脚外的其他引脚输出异常。而lrck
仍能正常输出时钟信号。NRFX_I2S_STATUS_NEXT_BUFFERS_NEEDED
事件回调。NEXT_BUFFER
事件,在这里设置第二缓冲NEXT_BUFFER
事件,以此作为波形输出结束的标志。在此时关闭i2s输出0x00000000
的填充,就可以避免有效数据被剪切掉。0x8888E888
则 WS2812 收到 0x80