2596|1

74

帖子

0

TA的资源

一粒金砂(中级)

楼主
 

【LAUNCHXL-CC2650】simple_peripheral例程分析 [复制链接]

CC2650是双核系统,蓝牙协议栈运行在Cortex-M0的内核中,应用程序运行在Cortex-M3的内核中。simple_peripheral_cc2650lp_stack为协议栈,运行在Cortex-M0的内核中。simple_peripheral_cc2650lp_app为应用程序,运行在Cortex-M3的内核中。这里主要介绍运行在Cortex-M3内核中的应用程序。

一、主程序

在应用程序中的main()主函数的内容如下:

  /* Register Application callback to trap asserts raised in the Stack */
  RegisterAssertCback(AssertHandler);

  PIN_init(BoardGpioInitTable);
  // Enable iCache prefetching
  VIMSConfigure(VIMS_BASE, TRUE, TRUE);

  // Enable cache
  VIMSModeSet(VIMS_BASE, VIMS_MODE_ENABLED);
  /* Initialize ICall module */
  ICall_init();

  /* Start tasks of external images - Priority 5 */
  ICall_createRemoteTasks();

  /* Kick off profile - Priority 3 */
  GAPRole_createTask();

  SimpleBLEPeripheral_createTask();

  /* enable interrupts and start SYS/BIOS */
  BIOS_start();

RegisterAssertCback(AssertHandler);用于注册应用程序的断言处理程序。

PIN_init(BoardGpioInitTable);初始化板卡上使用到的GPIO口,初始化了LED引脚、按键引脚、UART引脚和SPI引脚。具体的BoardGpioInitTable在CC2650_LAUNCHXL。

VIMSConfigure(VIMS_BASE, TRUE, TRUE);使能iCache。

VIMSModeSet(VIMS_BASE, VIMS_MODE_ENABLED);使能cache。

由于应用程序和协议栈运行在不同的内核中,应用程序和协议栈通过ICall模块进行通信服务和RTOS某些原始服务(例如线程同步)。ICall允许应用程序和协议栈在统一的RTOS环境中高效运行,共享资源。所以在启动SYS/BIOS内核调度程序之前,应用程序必须要实例化和初始化ICall服务。

 ICall_init();初始化ICall初级服务和框架。调用ICall_createRemoteTasks()创建但不起用蓝牙协议栈任务。在使用ICall协议服务之前,服务器和客户端必须注册ICall。在协议栈程序的osal_icall_ble.c文件中使用ICall服务,注册协议栈服务(服务器)的调用。

 

 

 ICall_createRemoteTasks();使用自己已知地址的入口函数为每个外部映像创建一个任务。

GAPRole_createTask();为GAP外设角色创建任务功能。调用gapRole_init()进行初始化并处理GAP事件。

SimpleBLEPeripheral_createTask();为运用程序创建任务功能。初始化应用程序并处理应用程序事件。

BIOS_start();开启中断并启动SYS/BIOS调度。

二、设备信息

设备信息包括型号、固件版本、硬件版本、软件版本、厂商名称等。

设备信息在devinfoservice.c文件中,可以根据设备进行修改。

具体代码如下:

// System ID characteristic
static uint8 devInfoSystemIdProps = GATT_PROP_READ;
static uint8 devInfoSystemId[DEVINFO_SYSTEM_ID_LEN] = {0, 0, 0, 0, 0, 0, 0, 0};

// Model Number String characteristic
static uint8 devInfoModelNumberProps = GATT_PROP_READ;
static uint8 devInfoModelNumber[DEVINFO_STR_ATTR_LEN+1] = "Model Number";

// Serial Number String characteristic
static uint8 devInfoSerialNumberProps = GATT_PROP_READ;
static uint8 devInfoSerialNumber[DEVINFO_STR_ATTR_LEN+1] = "Serial Number";

// Firmware Revision String characteristic
static uint8 devInfoFirmwareRevProps = GATT_PROP_READ;
static uint8 devInfoFirmwareRev[DEVINFO_STR_ATTR_LEN+1] = "Firmware Revision";

// Hardware Revision String characteristic
static uint8 devInfoHardwareRevProps = GATT_PROP_READ;
static uint8 devInfoHardwareRev[DEVINFO_STR_ATTR_LEN+1] = "Hardware Revision";

// Software Revision String characteristic
static uint8 devInfoSoftwareRevProps = GATT_PROP_READ;
static uint8 devInfoSoftwareRev[DEVINFO_STR_ATTR_LEN+1] = "Software Revision";

// Manufacturer Name String characteristic
static uint8 devInfoMfrNameProps = GATT_PROP_READ;
static uint8 devInfoMfrName[DEVINFO_STR_ATTR_LEN+1] = "Manufacturer Name";

// IEEE 11073-20601 Regulatory Certification Data List characteristic
static uint8 devInfo11073CertProps = GATT_PROP_READ;
static uint8 defaultDevInfo11073Cert[] =
{
  DEVINFO_11073_BODY_EXP,     // authoritative body type
  0x00,                       // authoritative body structure type
                              // authoritative body data follows below:
  'e', 'x', 'p', 'e', 'r', 'i', 'm', 'e', 'n', 't', 'a', 'l'
};

// The length of this characteristic is not fixed
static uint8 *devInfo11073Cert = defaultDevInfo11073Cert;
static uint8 devInfo11073CertLen = sizeof(defaultDevInfo11073Cert);

// PnP ID characteristic
static uint8 devInfoPnpIdProps = GATT_PROP_READ;
static uint8 devInfoPnpId[DEVINFO_PNP_ID_LEN] =
{
  1,                                      // Vendor ID source (1=Bluetooth SIG)
  LO_UINT16(0x000D), HI_UINT16(0x000D),   // Vendor ID (Texas Instruments)
  LO_UINT16(0x0000), HI_UINT16(0x0000),   // Product ID (vendor-specific)
  LO_UINT16(0x0110), HI_UINT16(0x0110)    // Product version (JJ.M.N)
};

其中是System ID在simple_peripheral.c文件中有进行的重新定义,若要修改,需要在改文件中进行修改,重新定义源码如下。

// use 6 bytes of device address for 8 bytes of system ID value
systemId[0] = ownAddress[0];
systemId[1] = ownAddress[1];
systemId[2] = ownAddress[2];

// set middle bytes to zero
systemId[4] = 0x00;
systemId[3] = 0x00;

// shift three bytes up
systemId[7] = ownAddress[5];
systemId[6] = ownAddress[4];
systemId[5] = ownAddress[3];

使用nRF Connect连接开发板,可以读取相应的设备信息。

另外,在这边可以发现没有设备的名称,设备名称在simple_peripheral.c文件中进行了定义。

三、特征

该例程中定义了五个特征。在simple_gatt_profile文件中,对五个特征进行了定义,包括特征名称,UUID等。

在simple_peripheral.c中用SimpleProfile_SetParameter函数给5个特征分别赋值。

同时,当开启特征4通知时,特征4每隔5秒会读取特征3的值,并以特征3的值赋值给特征4。

在nRF Connect连接后,可以获取相应的特征信息。

此帖出自RF/无线论坛

最新回复

例程分析的很详细   详情 回复 发表于 2021-5-21 07:38
点赞 关注
 

回复
举报

1702

帖子

0

TA的资源

五彩晶圆(初级)

沙发
 

例程分析的很详细

此帖出自RF/无线论坛
 
 

回复
您需要登录后才可以回帖 登录 | 注册

查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
快速回复 返回顶部 返回列表