Other Parts Discussed in Thread: SYSCONFIG, CC2340R5
Tool/software:
I am using CC2340-R5 launchpad and running Basic_BLE project in broadcaster mode only with limited advertising. My device advertises 3 packets at interval of 1000ms and disable the advertising, after that i turn on the advertisement again for after 30 sec using a timer clock as shown in the training module. but my power consumption during the non-transmission period is 3.8 mA (checked using power analyser). Below is the code (app_broadcaster.c) with some changes that i have made . i have disabled the LED GPIO's in sysconfig. still the current is high how do i reduce this current to uAmps or nAmps as stated in datasheet
#include "ti_ble_config.h" #include <ti/bleapp/ble_app_util/inc/bleapputil_api.h> #include <ti/bleapp/menu_module/menu_module.h> #include <app_main.h> #include <ti/drivers/dpl/ClockP.h> #include <ti/bleapp/ble_app_util/inc/bleapputil_internal.h> static ClockP_Struct clkPeriodic; ClockP_Params clockpParams; ClockP_Handle clockHandle; //***************************************************************************** //! constants //***************************************************************************** #define ADV_MAX_LEN 18 #define ADVDATA_MANUF_DATA_IDX 5 #define ADVDATA_SENSOR_DATA_IDX (ADVDATA_MANUF_DATA_IDX+B_ADDR_LEN) #define SP_PERIODIC_EVT_PERIOD 30000 #define CLOCK_MS 1000 #define KEY 0xAA //***************************************************************************** //! Prototypes //***************************************************************************** void Broadcaster_AdvEventHandler(uint32 event, BLEAppUtil_msgHdr_t *pMsgData); void Broadcaster_AppEventHandler(); //***************************************************************************** //! Globals //***************************************************************************** uint8_t MACaddress[B_ADDR_LEN]; int8_t u8Temperature = 0; uint8_t fPressure = 0; uint8_t fAcc=0; uint8_t fVolt=100; uint8_t Vehicle_status=0x02; uint8_t Sensor_status=0x03; uint8_t BLE_FW_VER=0x01; uint8_t TPMS_FW_VER=0x01; uint8_t incr_temp_flg=1; uint8_t incr_pres_flg=1; uint8_t rep_flg=0; uint8_t rep_cntr=0; BLEAppUtil_EventHandler_t broadcasterAdvHandler = { .handlerType = BLEAPPUTIL_GAP_ADV_TYPE, .pEventHandler = Broadcaster_AdvEventHandler, .eventMask = BLEAPPUTIL_ADV_START_AFTER_ENABLE | BLEAPPUTIL_ADV_END_AFTER_DISABLE| BLEAPPUTIL_ADV_END }; //! Store handle needed for each advertise set uint8 broadcasterAdvHandle_1; const BLEAppUtil_AdvInit_t broadcasterInitAdvSet1 = { /* Advertise data and length */ .advDataLen = sizeof(advData1), .advData = advData1, /* Scan respond data and length */ .scanRespDataLen = 0, .scanRespData = NULL, .advParam = &advParams1 }; const BLEAppUtil_AdvStart_t broadcasterStartAdvSet1 = { .enableOptions =GAP_ADV_ENABLE_OPTIONS_USE_MAX_EVENTS, .durationOrMaxEvents = 3 }; /*const BLEAppUtil_AdvStart_t broadcasterStartAdvSet1 = { .enableOptions = GAP_ADV_ENABLE_OPTIONS_USE_MAX, .durationOrMaxEvents = 0 }; */ //***************************************************************************** //! Functions //***************************************************************************** /********************************************************************* * @fn Broadcaster_AdvEventHandler * * @brief The purpose of this function is to handle advertise events * that rise from the GAP and were registered in * @ref BLEAppUtil_RegisterGAPEvent * * @param event - message event. * @param pMsgData - pointer to message data. * * @return none */ void Broadcaster_AdvEventHandler(uint32 event, BLEAppUtil_msgHdr_t *pMsgData) { switch(event) { case BLEAPPUTIL_ADV_START_AFTER_ENABLE: { MenuModule_printf(APP_MENU_ADV_EVENT, 0, "Adv status: Started - handle: " MENU_MODULE_COLOR_YELLOW "%d" MENU_MODULE_COLOR_RESET, ((BLEAppUtil_AdvEventData_t *)pMsgData)->pBuf->advHandle); /** New Code **/ BLEAppUtil_AdvEventData_t * pkt = (BLEAppUtil_AdvEventData_t *)pMsgData; if (pkt->pBuf->advHandle == broadcasterAdvHandle_1) { bStatus_t status = FAILURE; status = GapAdv_prepareLoadByHandle(broadcasterAdvHandle_1, GAP_ADV_FREE_OPTION_DONT_FREE); if (status != SUCCESS) for(;;); // Loop uint8_t ADV_DATA1_LEN = 11; uint8_t i=0; uint8_t *devAddr = NULL; uint8_t pressure =0; // get MAC address of BLE devAddr = GAP_GetDevAddress(TRUE); memcpy( &MACaddress[0], &devAddr[0], 6 ); advData1[i++] = 0x02; advData1[i++] = GAP_ADTYPE_FLAGS; advData1[i++] = GAP_ADTYPE_FLAGS_BREDR_NOT_SUPPORTED | GAP_ADTYPE_FLAGS_GENERAL; advData1[i++] = ADV_MAX_LEN - i - 1; // length of this data advData1[i++] = GAP_ADTYPE_MANUFACTURER_SPECIFIC; i=ADVDATA_MANUF_DATA_IDX; advData1[i++] = MACaddress[5]; advData1[i++] = MACaddress[4]; advData1[i++] = MACaddress[3]; advData1[i++] = MACaddress[2]; advData1[i++] = MACaddress[1]; advData1[i++] = MACaddress[0]; i = ADVDATA_SENSOR_DATA_IDX; advData1[i++] = Vehicle_status; advData1[i++] = (u8Temperature+40); pressure=(fPressure*2.5); advData1[i++] =pressure; advData1[i++] = fVolt ; advData1[i++] = Sensor_status; advData1[i++] = BLE_FW_VER ; advData1[i++] = TPMS_FW_VER; broadcasterAdvHandler.eventMask = BLEAPPUTIL_ADV_END_AFTER_DISABLE; status = GapAdv_loadByHandle(broadcasterAdvHandle_1, GAP_ADV_DATA_TYPE_ADV, ADV_MAX_LEN, advData1); if (status != SUCCESS) for(;;); ClockP_start(clockHandle); /** End New Code **/ } break; } case BLEAPPUTIL_ADV_END_AFTER_DISABLE: { MenuModule_printf(APP_MENU_ADV_EVENT, 0, "Adv status: Ended - handle: " MENU_MODULE_COLOR_YELLOW "%d" MENU_MODULE_COLOR_RESET, // ((BLEAppUtil_AdvEventData_t *)pMsgData)->pBuf->advHandle); break; } default: { break; } } } /********************************************************************* * @fn Broadcaster_start * * @brief This function is called after stack initialization, * the purpose of this function is to initialize and * register the specific events handlers of the broadcaster * application module * * @return SUCCESS, errorInfo */ bStatus_t Broadcaster_start() { bStatus_t status = SUCCESS; status = BLEAppUtil_registerEventHandler(&broadcasterAdvHandler); if(status != SUCCESS) { // Return status value return(status); } status = BLEAppUtil_initAdvSet(&broadcasterAdvHandle_1, &broadcasterInitAdvSet1); if(status != SUCCESS) { // Return status value return(status); } // Setup parameters. ClockP_Params_init(&clockpParams); // Convert clockDuration in milliseconds to ticks. uint32_t clockTicks = SP_PERIODIC_EVT_PERIOD * (CLOCK_MS/ 1); // If period is 0, this is a one-shot timer. If not 0, the it’s a periodic clock. clockpParams.period = 0; //clockTicks; // Starts immediately after construction if true, otherwise wait for a call // to start. clockpParams.startFlag = false; clockpParams.arg = (uintptr_t)Broadcaster_AppEventHandler; // Initialize clock instance. clockHandle = ClockP_construct(&clkPeriodic, (void *)BLEAppUtil_invokeFunctionNoData, clockTicks, &clockpParams); status = BLEAppUtil_advStart(broadcasterAdvHandle_1, &broadcasterStartAdvSet1); if(status != SUCCESS) { // Return status value return(status); } // Return status value return(status); } void Broadcaster_AppEventHandler() { //add your code here bStatus_t status = FAILURE; status = GapAdv_prepareLoadByHandle(broadcasterAdvHandle_1, GAP_ADV_FREE_OPTION_DONT_FREE); if (status != SUCCESS) for(;;); // Loop uint8_t ADV_DATA1_LEN = 11; uint8_t i=0; uint8_t pressure =0; advData1[i++] = 0x02; advData1[i++] = GAP_ADTYPE_FLAGS; advData1[i++] = GAP_ADTYPE_FLAGS_BREDR_NOT_SUPPORTED | GAP_ADTYPE_FLAGS_GENERAL; advData1[i++] = ADV_MAX_LEN - i - 1; // length of this data advData1[i++] = GAP_ADTYPE_MANUFACTURER_SPECIFIC; i=ADVDATA_MANUF_DATA_IDX; advData1[i++] = MACaddress[5]; advData1[i++] = MACaddress[4]; advData1[i++] = MACaddress[3]; advData1[i++] = MACaddress[2]; advData1[i++] = MACaddress[1]; advData1[i++] = MACaddress[0]; i = ADVDATA_SENSOR_DATA_IDX; if(u8Temperature>=100) incr_temp_flg=0; if(u8Temperature<=0) incr_temp_flg=1; if(incr_temp_flg) u8Temperature++; else u8Temperature--; if(fPressure>=40) incr_pres_flg=0; if(fPressure<=0) incr_pres_flg=1; if(incr_pres_flg) fPressure++; else fPressure--; if((!incr_pres_flg)) Vehicle_status=Vehicle_status|0x04; else if((incr_pres_flg)) Vehicle_status=Vehicle_status &~ 0x04; advData1[i++] = Vehicle_status; advData1[i++] = (u8Temperature+40); pressure=(fPressure*2.5); advData1[i++] =pressure ; advData1[i++] = fVolt ; advData1[i++] = Sensor_status; advData1[i++] = BLE_FW_VER; advData1[i++] = TPMS_FW_VER; broadcasterAdvHandler.eventMask = BLEAPPUTIL_ADV_END_AFTER_DISABLE; status = GapAdv_loadByHandle(broadcasterAdvHandle_1, GAP_ADV_DATA_TYPE_ADV, ADV_MAX_LEN, advData1); BLEAppUtil_advStart(broadcasterAdvHandle_1, &broadcasterStartAdvSet1); if (status != SUCCESS) for(;;); ClockP_start(clockHandle); /** End New Code **/ } //#endif //( HOST_CONFIG & ( BROADCASTER_CFG ) )
