Nordic NRF-52 深度解析

本次就来深入分析下Nordic的最新蓝牙芯片nRF52832。

目前有很多的芯片原厂发布了自己的BLE SoC芯片,其中NORDIC半导体的nRF52832是知名的nRF51822的后续作品,它将BLE SoC带到了一个新的高度。这款产品有很多让人兴奋的地方,它带来了更高的性能、更低的功耗以及更多的功能。知名的nRF51822是一颗Bluetooth Low Energy的SoC,它拥有Cortex-M0内核,运行频率为16Mhz。而nRF52832则是Cortex-M4F内核,并且拥有更大的RAM和Flash,还有更多的功能以及更好的RF性能。

下表对比了nRF52832和nRF51822还有另外一个厂家的BLE芯片:

下面我们全面的看一下他们的亮点

  •   Active-mode RX:5.5 mA
  •   Active-mode TX @ 0dBm: 5.
好的,对于nrf52系列芯片实现USB HID设备功能,一般需要以下几个步骤: 1. 配置nrf52芯片的USB模块。nrf52芯片内置了USB硬件模块,需要使用nrf5 SDK提供的USB库进行配置,设置USB模块的参数以及中断处理函数等。 2. 定义HID设备的报告描述符。报告描述符是HID设备与主机通信时使用的协议,需要在设备端定义报告描述符,包括输入报告、输出报告、特性报告等。 3. 在nrf52芯片中实现USB HID设备的功能。根据定义的报告描述符,在nrf52芯片中实现对应的功能,例如读取按键状态、控制LED、发送数据等。 4. 编写上位机代码。在PC端,需要使用对应的USB HID驱动程序,然后编写上位机代码,与nrf52芯片进行通信。上位机代码可以使用C、C++、Python等语言编写,使用开源的USB HID库,例如libusb、hidapi等。 下面是一个简单的nrf52 USB HID设备的示例代码: ``` #include "nrf.h" #include "nrf_drv_usbd.h" #include "app_usbd.h" #include "app_usbd_hid_generic.h" #define REPORT_ID 1 static app_usbd_hid_generic_t m_hid_generic; static uint8_t m_report_desc[] = { 0x06, 0x00, 0xff, // Usage Page (Vendor Defined) 0x09, 0x01, // Usage (Vendor Usage 1) 0xa1, 0x01, // Collection (Application) 0x15, 0x00, // Logical Minimum (0) 0x26, 0xff, 0x00, // Logical Maximum (255) 0x75, 0x08, // Report Size (8) 0x95, 0x40, // Report Count (64) 0x09, 0x01, // Usage (Vendor Usage 1) 0x81, 0x02, // Input (Data,Var,Abs) 0x95, 0x40, // Report Count (64) 0x09, 0x01, // Usage (Vendor Usage 1) 0x91, 0x02, // Output (Data,Var,Abs) 0xc0 // End Collection }; static void hid_user_ev_handler(app_usbd_class_inst_t const * p_inst, app_usbd_hid_user_event_t event); void usbd_hid_init(void) { ret_code_t ret; static const app_usbd_config_t usbd_config = { .ev_state_proc = app_usbd_event_execute, }; app_usbd_hid_generic_config_t hid_generic_config = { .report_desc.p_data = m_report_desc, .report_desc.size = sizeof(m_report_desc), .hid_dev_rel_num = 0x0001, .hid_dev_country_code = 0, .hid_dev_flags = APP_USBD_HID_SUBCLASS_BOOT, }; app_usbd_class_inst_t const * class_inst_generic; ret = app_usbd_init(&usbd_config); APP_ERROR_CHECK(ret); ret = app_usbd_class_append( &app_usbd_hid_generic_class, app_usbd_hid_generic_descriptor_handle, &class_inst_generic); APP_ERROR_CHECK(ret); ret = app_usbd_class_inst_get( &app_usbd_hid_generic_class, class_inst_generic->id, &m_hid_generic); APP_ERROR_CHECK(ret); app_usbd_hid_user_ev_handler_set(m_hid_generic.p_instance, hid_user_ev_handler); ret = app_usbd_hid_generic_in_report_set(&m_hid_generic, REPORT_ID, NULL, 0); APP_ERROR_CHECK(ret); ret = app_usbd_hid_generic_out_report_set(&m_hid_generic, REPORT_ID, NULL, 0); APP_ERROR_CHECK(ret); ret = app_usbd_hid_generic_idle_set(&m_hid_generic, REPORT_ID, 0); APP_ERROR_CHECK(ret); ret = app_usbd_power_events_enable(); APP_ERROR_CHECK(ret); } static void hid_user_ev_handler(app_usbd_class_inst_t const * p_inst, app_usbd_hid_user_event_t event) { switch (event) { case APP_USBD_HID_USER_EVT_OUT_REPORT_READY: { uint8_t report[64]; size_t report_size; ret_code_t ret = app_usbd_hid_generic_out_report_get(&m_hid_generic, REPORT_ID, report, &report_size); APP_ERROR_CHECK(ret); // 处理接收到的报告数据 break; } default: break; } } int main(void) { usbd_hid_init(); while (true) { // 处理设备的功能 } } ``` 这是一个简单的USB HID设备示例代码,实现了一个只有输入报告的设备。在这个示例代码中,使用了nrf5 SDK提供的USB库和USB HID库来实现USB HID设备的功能,包括定义报告描述符、处理输入报告等。 上位机代码可以使用开源的USB HID库,例如libusb、hidapi等。以下是一个使用hidapi库的示例代码: ``` #include <stdio.h> #include <hidapi/hidapi.h> #define VENDOR_ID 0x1234 #define PRODUCT_ID 0x5678 int main() { hid_device *handle; unsigned char buf[64]; int res; if (hid_init() != 0) { printf("Failed to initialize HID library\n"); return -1; } handle = hid_open(VENDOR_ID, PRODUCT_ID, NULL); if (!handle) { printf("Failed to open HID device\n"); return -1; } // 发送输出报告 buf[0] = 0x01; buf[1] = 0x02; res = hid_write(handle, buf, sizeof(buf)); if (res < 0) { printf("Failed to write output report\n"); hid_close(handle); hid_exit(); return -1; } // 接收输入报告 res = hid_read_timeout(handle, buf, sizeof(buf), 1000); if (res < 0) { printf("Failed to read input report\n"); hid_close(handle); hid_exit(); return -1; } // 处理接收到的报告数据 hid_close(handle); hid_exit(); return 0; } ``` 以上是一个简单的nrf52 USB HID设备的示例代码以及使用hidapi库的上位机代码。需要注意的是,实际开发中代码的具体实现可能会有所不同,这里只是提供了一个参考。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值