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);
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 }
仔細琢磨一下吧,也不復雜。主要功能就是讀取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中實現讀寫,並封裝驅動。不知道空間會不會佔滿不夠用。