在Keil开发环境下,基于nRF52832芯片和S132 SoftDevice的所有错误码(err_code)的具体含义和完整列表,这是 Nordic 开发中排查问题的关键参考。
有以下几点:
- Nordic错误码核心分为通用错误码(nrf_error.h)和S132专用错误码(蓝牙相关),非0值均代表错误;
- 开发中高频遇到的错误码包括NRF_ERROR_BUSY(资源忙)、NRF_ERROR_INVALID_PARAM(参数错误)、NRF_ERROR_TIMEOUT(超时)、NRF_ERROR_BLE_STACK_BUSY(蓝牙栈忙);
- 在Keil中可通过查看头文件或编写错误码解析函数,快速定位错误码含义,提高调试效率。
一、错误码核心说明
Nordic 的错误码体系主要分为两类:
- 通用错误码:适用于所有 nRF52 系列和 SoftDevice(如 S132),定义在nrf_error.h
- SoftDevice 专用错误码:S132 蓝牙协议栈专属,定义在s132_nrf52_<版本号>_softdevice_api.h(如s132_nrf52_6.1.1_softdevice_api.h)
错误码均为uint32_t类型,非0值代表错误,NRF_SUCCESS (0)代表执行成功。
二、核心错误码列表及含义(Keil环境通用)
以下是开发中最常用的错误码,按功能分类整理:
1. 通用基础错误码(nrf_error.h)
错误码常量 | 数值 | 含义 |
NRF_SUCCESS | 0 | 操作成功 |
NRF_ERROR_SVC_HANDLER_MISSING | 1 | SVC 处理函数缺失(SoftDevice 初始化前未配置中断) |
NRF_ERROR_SOFTDEVICE_NOT_ENABLED | 2 | SoftDevice 未启用 |
NRF_ERROR_INTERNAL | 3 | 内部错误(协议栈内部逻辑异常) |
NRF_ERROR_NO_MEM | 4 | 内存不足(如申请缓冲区失败) |
NRF_ERROR_NOT_FOUND | 5 | 未找到指定资源(如未找到蓝牙服务/特征) |
NRF_ERROR_NOT_SUPPORTED | 6 | 不支持的操作(如调用了S132不支持的蓝牙功能) |
NRF_ERROR_INVALID_PARAM | 7 | 参数无效(传入非法值,如空指针、超出范围) |
NRF_ERROR_INVALID_STATE | 8 | 状态错误(如蓝牙未初始化就发送数据) |
NRF_ERROR_INVALID_LENGTH | 9 | 长度错误(如数据长度超过MTU值) |
NRF_ERROR_INVALID_FLAGS | 10 | 标志位错误(如传入非法的蓝牙连接标志) |
NRF_ERROR_INVALID_DATA | 11 | 数据错误(如格式错误、校验失败) |
NRF_ERROR_DATA_SIZE | 12 | 数据大小超出限制 |
NRF_ERROR_TIMEOUT | 13 | 超时(如蓝牙连接超时、广播超时) |
NRF_ERROR_NULL | 14 | 空指针错误 |
NRF_ERROR_FORBIDDEN | 15 | 操作被禁止(如权限不足) |
NRF_ERROR_INVALID_ADDR | 16 | 地址无效(如蓝牙MAC地址错误) |
NRF_ERROR_BUSY | 17 | 资源忙(如SoftDevice正在处理其他请求) |
NRF_ERROR_CONN_COUNT | 18 | 连接数超出限制(S132最大支持8个连接) |
2. S132 SoftDevice 专用错误码(蓝牙相关)
错误码常量 | 数值 | 含义 |
NRF_ERROR_BLE_INVALID_CONN_HANDLE | 0x0080 | 无效的蓝牙连接句柄 |
NRF_ERROR_BLE_STACK_BUSY | 0x0081 | 蓝牙协议栈忙 |
NRF_ERROR_BLE_INVALID_ATTR_HANDLE | 0x0082 | 无效的属性句柄(如特征句柄错误) |
NRF_ERROR_BLE_NO_TX_BUFFERS | 0x0083 | 发送缓冲区耗尽(蓝牙数据发送缓存不足) |
NRF_ERROR_BLE_NO_RX_BUFFERS | 0x0084 | 接收缓冲区耗尽 |
NRF_ERROR_BLE_TX_OVERFLOW | 0x0085 | 发送数据溢出 |
NRF_ERROR_BLE_RX_OVERFLOW | 0x0086 | 接收数据溢出 |
NRF_ERROR_BLE_AUTH_FAILURE | 0x0087 | 蓝牙认证失败(如配对密钥错误) |
NRF_ERROR_BLE_PIN_OR_KEY_MISSING | 0x0088 | 配对码/密钥缺失 |
NRF_ERROR_BLE_LL_REJECTED_PARAMS | 0x0089 | 链路层拒绝参数(如连接参数协商失败) |
NRF_ERROR_BLE_LL_CONN_REJECTED | 0x008A | 链路层拒绝连接(如对方设备拒绝) |
NRF_ERROR_BLE_GAP_INVALID_BLE_ADDR | 0x008B | 无效的蓝牙地址 |
NRF_ERROR_BLE_GAP_SEC_PARAMS_INVALID | 0x008C | 安全参数无效(如加密参数错误) |
NRF_ERROR_BLE_GATT_INVALID_CCCD | 0x008D | 无效的客户端特征配置描述符(CCCD) |
NRF_ERROR_BLE_GATT_WRITE_NOT_PERMITTED | 0x008E | GATT写操作不被允许 |
NRF_ERROR_BLE_GATT_READ_NOT_PERMITTED | 0x008F | GATT读操作不被允许 |
3. 硬件/驱动相关错误码
错误码常量 | 数值 | 含义 |
NRF_ERROR_INVALID_IRQ | 20 | 无效的中断号 |
NRF_ERROR_DMA_FAILED | 21 | DMA传输失败 |
NRF_ERROR_PIN_INVALID | 22 | 引脚号无效(如配置了nRF52832不存在的引脚) |
NRF_ERROR_UNALIGNED_ADDR | 23 | 地址未对齐 |
三、Keil环境下快速查询错误码的实用方法
在Keil中开发时,可通过以下方式快速定位错误码含义:
1. 直接查看头文件(最准确)
- 通用错误码:nRF5_SDK_<版本>/components/softdevice/common/nrf_error.h
- S132专用错误码:nRF5_SDK_<版本>/components/softdevice/s132/headers/s132_nrf52_<版本>_softdevice_api.h
- 蓝牙GAP/GATT错误码:nRF5_SDK_<版本>/components/ble/ble_gap.h、ble_gatt.h
2. 编写错误码解析函数(Keil中直接调用)
C |
使用说明:
- 将此函数添加到工程中,需确保开启串口打印(如使用nrf_uart);
- 调用SoftDevice API后,将返回的err_code传入该函数,即可在串口终端看到可读的错误描述;
- 可根据开发需求,在switch中补充更多错误码的解析。
四、关键注意事项
- 版本兼容性:不同版本的S132(如6.1.1、7.3.0)错误码数值可能略有差异,需以对应版本的头文件为准;
- 错误码范围:Nordic错误码数值通常为32位,低16位为核心错误码,高16位可能为扩展信息;
- Keil调试技巧:在Keil的Watch窗口中输入err_code,可直接查看错误码数值,再对照上述列表定位问题。