【藍牙數據採集模塊】-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中實現讀寫,並封裝驅動。不知道空間會不會佔滿不夠用。

相關文章
相關標籤/搜索