今天我們做一個(gè)簡(jiǎn)單的數(shù)據(jù)傳輸實(shí)驗(yàn)竭讳,就是用TI提供的lightblue 來點(diǎn)亮控制LED
首先我們來看一下用手機(jī)APP來控制led缓醋,我是用app來控制cc2540這個(gè)模塊目锭,那么我的模塊就是從機(jī)限府,從機(jī)一般都是service儒喊,那么手機(jī)就是主機(jī)蛹尝,是client后豫。
這個(gè)很簡(jiǎn)單,我沒有用協(xié)議棧里面的hal_led突那,因?yàn)槲铱戳舜炷穑@個(gè)很麻煩,明明兩句話的事情非搞得那么復(fù)雜愕难,廢話不說直接來分析早龟。打開cc2540協(xié)議棧中的例子SimpleBLEPeripheral.eww。
首先我們得把hal_led的宏關(guān)了猫缭,
添加HAL_LED=FALSE葱弟,這樣 BLE協(xié)議棧里面的HAL_LED就算是廢了。
接下來看我的猜丹,首先對(duì)led初始化芝加,這個(gè)就簡(jiǎn)單了,就是和我們的51是一樣的射窒,
我是在InitBoard函數(shù)里面添加的led初始化:
P1DIR |= 0x02藏杖; //設(shè)置P1_0,P1_1的io為輸出模式
P1_0 = 0; //關(guān)閉led1
P1_1 = 0; //關(guān)閉led2
就這樣初始化搞定了,下面我們就回顧一下轮洋,client向主機(jī)發(fā)送數(shù)據(jù)用的是write制市,就是手機(jī)把數(shù)據(jù)寫進(jìn)cc2540里面去。在我們的lightblue這個(gè)軟件里弊予,characteristic3有些的屬性祥楣。因此我們就可以更改一下源代碼。
首先我們定義我們的任務(wù)事件
define MYTASCK_EVENT 0x0002;
定義完以后我們得觸發(fā)事件啊 對(duì)吧?
那我們就在SBP_START_DEVICE_EVT (自己定義的SimpleBLEPeripheral_Init 這個(gè)事件 用的是
osal_set_event( simpleBLEPeripheral_TaskID, SBP_START_DEVICE_EVT );這個(gè)函數(shù)觸發(fā)我們的SimpleBLEPeripheral_Init 事件) 事件里面進(jìn)行操作误褪。
那么我們?cè)撊绾斡|發(fā)自己定義的 mytasckevent 事件呢责鳍?
在這之前我們得介紹一下新的api osal_start_timerEx
osal_start_timerEx( SampleApp_TaskID, SAMPLEAPP_SEND_PERIODIC_MSG_EVT,
(SAMPLEAPP_SEND_PERIODIC_MSG_TIMEOUT+ (osal_rand() & 0x00FF)) );
該函數(shù)是每隔5s顯示一次,去掉后兽间,節(jié)點(diǎn)加入網(wǎng)絡(luò)后历葛,只顯示一次,就是說這個(gè)函數(shù)但是一個(gè)定
時(shí)出發(fā)的函數(shù)嘀略,每隔(SAMPLEAPP_SEND_PERIODIC_MSG_TIMEOUT+ (osal_rand() & 0x00FF)) 這么
長(zhǎng)時(shí)間就會(huì)執(zhí)行SAMPLEAPP_SEND_PERIODIC_MSG_EVT觸發(fā)的函數(shù)
我們可以500個(gè)時(shí)間單位觸發(fā)一次所以代碼該這么寫:
define MY_TASCK_EVT_PERIOD 500
if ( events & SBP_START_DEVICE_EVT )
{
// Start the Device
VOID GAPRole_StartDevice( &simpleBLEPeripheral_PeripheralCBs );
// Start Bond Manager
VOID GAPBondMgr_Register( &simpleBLEPeripheral_BondMgrCBs );
// Set timer for first periodic event
osal_start_timerEx( simpleBLEPeripheral_TaskID, SBP_PERIODIC_EVT, MY_TASCK_EVT_PERIOD);
return ( events ^ SBP_START_DEVICE_EVT );
}
if ( events & MYTASCK_EVENT)
{
//重新啟動(dòng)計(jì)時(shí)器
if ( MY_TASCK_EVT_PERIOD)
{
osal_start_timerEx( simpleBLEPeripheral_TaskID, SBP_PERIODIC_EVT, MY_TASCK_EVT_PERIOD);
}
//執(zhí)行自己的任務(wù)
mytasck();
return (events ^ MYTASCK_EVENT);
}
void mytasck()
{
uint8 valueToCopy;
uint8 stat;
stat = SimpleProfile_GetParameter( SIMPLEPROFILE_CHAR3, &valueToCopy);
if(valueToCopy == 0x01) {
P1_0 = 1;
P1_1 = 1;
} else {
P1_0 = 0;
P1_1 = 0;
}
}
就這樣恤溶,編譯以后把程序燒到板子里面就ok了,
在這里輸入1帜羊,那么我們的led就亮了咒程,輸入其他的數(shù)值我們的led就會(huì)熄滅。