【蓝牙数据采集模块】-01-Sensor Controller 功能介绍

1、数组

CC2650芯片内部的结构框图如图,内部包含:app

一个Cortex-M3主控制器,用来作整个芯片的功能与任务实现ide

一个Cortex-M0射频控制器,用来驱动RF相关电路函数

一个Sensor Controller,能够用来在主控制器睡眠时实现传感器数据的采集,以下降系统总体功耗。工具

由图中咱们能够看到,Sensor Controller能够直接控制的模块包括:spa

1.模拟量采集,2.比较器,3.SPI和I2C接口,4.恒流源,5.定时器,6.2KB SRAM操作系统

不只如此,Sensor Controller还可以访问主控制器的一些外设:3d

1.UART串口,2.GPIO,调试

总的来讲,CC2650STK中使用到的CC2650RGZ芯片,能够经过Sensor Controller去控制整个芯片当中的16个引脚,其中有8个引脚能够用做模拟量采集。code

2、

虽然说这个Sensor Controller看起来很厉害,可是用它开发起来仍是有一些麻烦的。

1.须要使用专用的开发软件Sensor Controller Studio去进行程序开发;

2.功能调试完毕后须要将软件生成的驱动接口加入CC2650的CCS工程当中;

3.须要协调二者如何去进行数据交互,让主控制器去轮询或者传感器控制器去触发中断。

无论这些了,先看一看Sensor Controller Studio这个软件吧。软件的界面以下。

把右边的Start Page成为导航窗口吧,其中包括了四个项目,

1.工程:创建新工程,打开现有工程,最近的工程目录

2.例程:主要包括了SmartRF06EB和我用到的SensorTag两个板子的例子

3.工具的相关文档目录4.在线文档和资源

由于有现成的例子,我们直接打开SensorTag的I2C Light Sensor这个例子来介绍这个软件的使用。

双击I2C Light Sensor这个例程,会弹出下面一个窗口

凡是后面带有...按钮的都是能够修改的选项,

第一个是选择一个目录保存该工程,

再下来有一个TI-RTOS releas的选项,由于我以后在CCS中要用2.13进行开发,这里也就选了2.13,

对应的,下面在Overrides中有不少选项,都选择tirtos_simplelink_2_13_00_06版本和xdctools_3_31_01_33_core,至于选别的会不会影响最后的程序调用,我也不清楚,第一次仍是不要乱搞了的好

点击OK,直接跳转到了这个工程的配置目录,下图。全部的保持默认便可。

在最下边有一栏叫作Sensor Controller Tasks,能够用来在这个工程中建立新的任务。毕竟这个仍是个带操做系统的协处理器,就是高端,还能配置任务。

在左边点击“-”号旁边的目录(这个就是我们这个工程的第一个Task),能够看到下面的界面。在这个界面当中能够配置该工程使用到的模块,须要哪一个,点勾就能够了。其中一些模块还能进行参数配置,这个须要本身慢慢琢磨研究了。当选了一个模块后,这个模块对应的一些宏定义,驱动函数接口,就会自动加入到工程中去了。

在左侧窗口中再往下看,能够看到这个任务重包含了四部分的代码,软件直接定义好了。有初始化代码,执行代码,事件处理代码,结束代码。故名思意,它们的名称就是它们要作的事情。这里就不详细的说了。

直接看Execution Code 和 Event Handler Code的代码。

Execution Code:

 1 // Configure and start the next measurement
 2 i2cStart();
 3 i2cTx(I2C_OP_WRITE | ALS_I2C_ADDR);
 4 i2cTx(ALS_REG_CFG);
 5 i2cTx(ALS_CFG_ONE_SHOT >> 8);
 6 i2cTx(ALS_CFG_ONE_SHOT >> 0);
 7 i2cStop();
 8 
 9 // Read the result after 100 milliseconds + a 20% margin
10 evhSetupTimerTrigger(0, 120, 2);
11 
12 // Schedule the next execution
13 fwScheduleTask(1);
View Code

Event Handler Code:

 1 // If a measurement was successfully started during the last execution ...
 2 if (state.i2cStatus == 0x0000) {
 3     
 4     // Select the result register
 5     i2cStart();
 6     i2cTx(I2C_OP_WRITE | ALS_I2C_ADDR);
 7     i2cTx(ALS_REG_RESULT);
 8     
 9     // If successful ...
10     if (state.i2cStatus == 0x0000) {
11         U16 resultRegH;
12         U16 resultRegL;
13         
14         // Read the result
15         i2cRepeatedStart();
16         i2cTx(I2C_OP_READ | ALS_I2C_ADDR);
17         i2cRxAck(resultRegH);
18         i2cRxNack(resultRegL);
19         i2cStop();
20         
21         // Convert the result (4-bit exponent + 12-bit mantissa) into 16-bit fixed-point
22         U16 exp = resultRegH >> 4;
23         U16 mant = (resultRegH << 12) | (resultRegL << 4);
24         // The exponent is in range 0 to 11
25         U16 value = mant >> (11 - exp);
26         output.value = value;
27         
28         // Notify the application with the result is below the low threshold or above the high threshold
29         if (value < cfg.lowThreshold) {
30             fwGenAlertInterrupt();
31         }
32         if (value > cfg.highThreshold) {
33             fwGenAlertInterrupt();
34         }
35         
36     } else {
37         i2cStop();
38     }
39 }
View Code

 

仔细琢磨一下吧,也不复杂。主要功能就是读取SensorTag上面的光照传感器的数据,并进行上下阈值比较,超出范围后会触发一个中断信号到主控制器(这个以后再讨论)。

在这个代码当中,像i2c的驱动函数,任务、事件处理函数,中断触发函数都是在前面说到的选择功能模块后自动增长进来的。在程序中直接进行调用,不用进行声明、包含之类的操做。

再往下点到I/O Mapping,能够进行功能引脚的配置。在这个工程中咱们只使用到了I2C模块,因此直接配置SDA和SCL两个引脚便可。经过鼠标点击对应的引脚框就可以完成I/O管脚配置。

下面接着是Code Generator,就当他是用来编译的吧。它实际将机器代码最后放到了C文件内的一个数组当中,在主控制器程序中,会将该部分代码编译到特定的地址空间,实现Sensor Controller的程序运行。(具体还不太明白,有错误的话再来修改这里)

点击右边下边的Generate driver source code,没有错误的话就可以封装这个工程的代码,并生成CCS中相关的驱动程序。在中间咱们还能看到这个工程使用资源的状况。

最后就是仿真先关的了,Task Testing。

除了上图中的调试流程(simplified workflow)外,还有一种(low-level workflow),以下图。根据实际须要选择便可。

最后,咱们链接板子,并按运行按钮,便可看到Sensor Controller采集到的光照强度信号,并可以用曲线显示。

这样,咱们有关于Sensor Controller的基本功能都已经了解了。一些具体的功能,须要在实际使用中去体会了。如今我所知道的一些状况有,它的类C语言语法功能不全,变量类只有16位有符号、16位无符号、1位比特类型,多个任务不能调用同一个外设模块。

后面,个人预想是把全部的传感器模块在Sensor Controller中实现读写,并封装驱动。不知道空间会不会占满不够用。

相关文章
相关标签/搜索