Hello:
I am follow Developer's guide page 88 : 6.3.1 PIN , modify simpleBLEPeripheral.c:
step 3 always show error ?
This thread has been locked.
If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.
#define DEFAULT_ADVERTISING_INTERVAL 160
#define DEFAULT_DISCOVERABLE_MODE GAP_ADTYPE_FLAGS_GENERAL
#ifndef FEATURE_OAD
#define DEFAULT_DESIRED_MIN_CONN_INTERVAL 80
#define DEFAULT_DESIRED_MAX_CONN_INTERVAL 800
#define DEFAULT_DESIRED_SLAVE_LATENCY 0
#define DEFAULT_DESIRED_CONN_TIMEOUT 1000
#define DEFAULT_ENABLE_UPDATE_REQUEST TRUE
#define DEFAULT_CONN_PAUSE_PERIPHERAL 6
#define SBP_PERIODIC_EVT_PERIOD 5000
// Task configuration
#define SBP_TASK_PRIORITY 1
// Internal Events for RTOS application
#define SBP_STATE_CHANGE_EVT 0x0001
#define SBP_CHAR_CHANGE_EVT 0x0002
#define SBP_PERIODIC_EVT 0x0004
#define SBP_CONN_EVT_END_EVT 0x0008
// App event passed from profiles.
typedef struct
{
appEvtHdr_t hdr;
} sbpEvt_t;
static PIN_Config SBP_configTable[]=
{
Board_LED1 | PIN_GPIO_OUTPUT_EN | PIN_GPIO_HIGH | PIN_PUSHPULL | PIN_DRVSTR_MAX,
Board_KEY_UP | PIN_INPUT_EN | PIN_PULLUP | PIN_IRQ_NEGEDGE,
PIN_TERMINATE
};
static PIN_State sbpPins;
static PIN_Handle hSbpPins;
static buttonCallbackFxn(PIN_Handle nPin, PIN_Id pinId)
{
uint32_t currVal = 0;
if (!PIN_getInputValue(pinId)){
switch (pinId){
case Board_KEY_UP:
currVal = PIN_getOutputValue(Board_LED1);
PIN_setOutputValue(hSbpPins, Board_LED1, !currVal);
break;
default:
break;
}
}
}
static void buttonHwiFxn(PIN_Handle hPin, PIN_Id pinId){
events |= SBP_BTN_EVT;
Semaphore_post(sem);
}
Hello YiKai :
How strange . In this code , I found another events .
static void SimpleBLEPeripheral_clockHandler(UArg arg){
// Store the event.
events |= arg;
//Wake up the application.
Semaphore_post(sem);
}
building succeed ?
Try to use my revised simpleBLEPeripheral.c.
/************************************************************************************************** Filename: simpleBLEPeripheral.c Revised: $Date: 2015-07-13 11:43:11 -0700 (Mon, 13 Jul 2015) $ Revision: $Revision: 44336 $ Description: This file contains the Simple BLE Peripheral sample application for use with the CC2650 Bluetooth Low Energy Protocol Stack. Copyright 2013 - 2015 Texas Instruments Incorporated. All rights reserved. IMPORTANT: Your use of this Software is limited to those specific rights granted under the terms of a software license agreement between the user who downloaded the software, his/her employer (which must be your employer) and Texas Instruments Incorporated (the "License"). You may not use this Software unless you agree to abide by the terms of the License. The License limits your use, and you acknowledge, that the Software may not be modified, copied or distributed unless embedded on a Texas Instruments microcontroller or used solely and exclusively in conjunction with a Texas Instruments radio frequency transceiver, which is integrated into your product. Other than for the foregoing purpose, you may not use, reproduce, copy, prepare derivative works of, modify, distribute, perform, display or sell this Software and/or its documentation for any purpose. YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE PROVIDED �AS IS� WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF MERCHANTABILITY, TITLE, NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT, NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER LEGAL EQUITABLE THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES INCLUDING BUT NOT LIMITED TO ANY INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE OR CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST DATA, COST OF PROCUREMENT OF SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY THIRD PARTIES (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS. Should you have any questions regarding your right to use this Software, contact Texas Instruments Incorporated at www.TI.com. **************************************************************************************************/ /********************************************************************* * INCLUDES */ #include <string.h> #include <ti/sysbios/knl/Task.h> #include <ti/sysbios/knl/Clock.h> #include <ti/sysbios/knl/Semaphore.h> #include <ti/sysbios/knl/Queue.h> #include "hci_tl.h" #include "gatt.h" #include "gapgattserver.h" #include "gattservapp.h" #include "devinfoservice.h" #include "simpleGATTprofile.h" #if defined(SENSORTAG_HW) #include "bsp_spi.h" #endif // SENSORTAG_HW #if defined(FEATURE_OAD) || defined(IMAGE_INVALIDATE) #include "oad_target.h" #include "oad.h" #endif //FEATURE_OAD || IMAGE_INVALIDATE #include "peripheral.h" #include "gapbondmgr.h" #include "osal_snv.h" #include "ICallBleAPIMSG.h" #include "util.h" #include "board_lcd.h" #include "board_key.h" #include "Board.h" #include "simpleBLEPeripheral.h" #include <ti/drivers/lcd/LCDDogm1286.h> #include <ti/drivers/pin/PINCC26XX.h> /********************************************************************* * CONSTANTS */ // Advertising interval when device is discoverable (units of 625us, 160=100ms) #define DEFAULT_ADVERTISING_INTERVAL 160 // Limited discoverable mode advertises for 30.72s, and then stops // General discoverable mode advertises indefinitely #define DEFAULT_DISCOVERABLE_MODE GAP_ADTYPE_FLAGS_GENERAL #ifndef FEATURE_OAD // Minimum connection interval (units of 1.25ms, 80=100ms) if automatic // parameter update request is enabled #define DEFAULT_DESIRED_MIN_CONN_INTERVAL 80 // Maximum connection interval (units of 1.25ms, 800=1000ms) if automatic // parameter update request is enabled #define DEFAULT_DESIRED_MAX_CONN_INTERVAL 800 #else // Minimum connection interval (units of 1.25ms, 8=10ms) if automatic // parameter update request is enabled #define DEFAULT_DESIRED_MIN_CONN_INTERVAL 8 // Maximum connection interval (units of 1.25ms, 8=10ms) if automatic // parameter update request is enabled #define DEFAULT_DESIRED_MAX_CONN_INTERVAL 8 #endif // FEATURE_OAD // Slave latency to use if automatic parameter update request is enabled #define DEFAULT_DESIRED_SLAVE_LATENCY 0 // Supervision timeout value (units of 10ms, 1000=10s) if automatic parameter // update request is enabled #define DEFAULT_DESIRED_CONN_TIMEOUT 1000 // Whether to enable automatic parameter update request when a connection is // formed #define DEFAULT_ENABLE_UPDATE_REQUEST TRUE // Connection Pause Peripheral time value (in seconds) #define DEFAULT_CONN_PAUSE_PERIPHERAL 6 // How often to perform periodic event (in msec) #define SBP_PERIODIC_EVT_PERIOD 5000 #ifdef FEATURE_OAD // The size of an OAD packet. #define OAD_PACKET_SIZE ((OAD_BLOCK_SIZE) + 2) #endif // FEATURE_OAD // Task configuration #define SBP_TASK_PRIORITY 1 #ifndef SBP_TASK_STACK_SIZE #define SBP_TASK_STACK_SIZE 644 #endif // Internal Events for RTOS application #define SBP_STATE_CHANGE_EVT 0x0001 #define SBP_CHAR_CHANGE_EVT 0x0002 #define SBP_PERIODIC_EVT 0x0004 #define SBP_CONN_EVT_END_EVT 0x0008 #define SBP_BTN_EVT 0x0010 /********************************************************************* * TYPEDEFS */ // App event passed from profiles. typedef struct { appEvtHdr_t hdr; // event header. } sbpEvt_t; /********************************************************************* * LOCAL VARIABLES */ /********************************************************************* * LOCAL VARIABLES */ // Entity ID globally used to check for source and/or destination of messages static ICall_EntityID selfEntity; // Semaphore globally used to post events to the application thread static ICall_Semaphore sem; // Clock instances for internal periodic events. static Clock_Struct periodicClock; // Queue object used for app messages static Queue_Struct appMsg; static Queue_Handle appMsgQueue; #if defined(FEATURE_OAD) // Event data from OAD profile. static Queue_Struct oadQ; static Queue_Handle hOadQ; #endif //FEATURE_OAD // events flag for internal application events. static uint16_t events; // Task configuration Task_Struct sbpTask; Char sbpTaskStack[SBP_TASK_STACK_SIZE]; // Profile state and parameters //static gaprole_States_t gapProfileState = GAPROLE_INIT; // GAP - SCAN RSP data (max size = 31 bytes) static uint8_t scanRspData[] = { // complete name 0x14, // length of this data GAP_ADTYPE_LOCAL_NAME_COMPLETE, 0x53, // 'S' 0x69, // 'i' 0x6d, // 'm' 0x70, // 'p' 0x6c, // 'l' 0x65, // 'e' 0x42, // 'B' 0x4c, // 'L' 0x45, // 'E' 0x50, // 'P' 0x65, // 'e' 0x72, // 'r' 0x69, // 'i' 0x70, // 'p' 0x68, // 'h' 0x65, // 'e' 0x72, // 'r' 0x61, // 'a' 0x6c, // 'l' // connection interval range 0x05, // length of this data GAP_ADTYPE_SLAVE_CONN_INTERVAL_RANGE, LO_UINT16(DEFAULT_DESIRED_MIN_CONN_INTERVAL), // 100ms HI_UINT16(DEFAULT_DESIRED_MIN_CONN_INTERVAL), LO_UINT16(DEFAULT_DESIRED_MAX_CONN_INTERVAL), // 1s HI_UINT16(DEFAULT_DESIRED_MAX_CONN_INTERVAL), // Tx power level 0x02, // length of this data GAP_ADTYPE_POWER_LEVEL, 0 // 0dBm }; // GAP - Advertisement data (max size = 31 bytes, though this is // best kept short to conserve power while advertisting) static uint8_t advertData[] = { // Flags; this sets the device to use limited discoverable // mode (advertises for 30 seconds at a time) instead of general // discoverable mode (advertises indefinitely) 0x02, // length of this data GAP_ADTYPE_FLAGS, DEFAULT_DISCOVERABLE_MODE | GAP_ADTYPE_FLAGS_BREDR_NOT_SUPPORTED, // service UUID, to notify central devices what services are included // in this peripheral 0x03, // length of this data GAP_ADTYPE_16BIT_MORE, // some of the UUID's, but not all #ifdef FEATURE_OAD LO_UINT16(OAD_SERVICE_UUID), HI_UINT16(OAD_SERVICE_UUID) #else LO_UINT16(SIMPLEPROFILE_SERV_UUID), HI_UINT16(SIMPLEPROFILE_SERV_UUID) #endif //!FEATURE_OAD }; // GAP GATT Attributes static uint8_t attDeviceName[GAP_DEVICE_NAME_LEN] = "Simple BLE Peripheral"; // Globals used for ATT Response retransmission static gattMsgEvent_t *pAttRsp = NULL; static uint8_t rspTxRetry = 0; static PIN_Config SBP_configTable[] = { Board_LED1 | PIN_GPIO_OUTPUT_EN | PIN_GPIO_LOW | PIN_PUSHPULL | PIN_DRVSTR_MAX, Board_KEY_UP | PIN_INPUT_EN | PIN_PULLUP | PIN_HYSTERESIS, PIN_TERMINATE }; static PIN_State sbpPins; static PIN_Handle hSbpPins; /********************************************************************* * LOCAL FUNCTIONS */ static void SimpleBLEPeripheral_init( void ); static void SimpleBLEPeripheral_taskFxn(UArg a0, UArg a1); static uint8_t SimpleBLEPeripheral_processStackMsg(ICall_Hdr *pMsg); static uint8_t SimpleBLEPeripheral_processGATTMsg(gattMsgEvent_t *pMsg); static void SimpleBLEPeripheral_processAppMsg(sbpEvt_t *pMsg); static void SimpleBLEPeripheral_processStateChangeEvt(gaprole_States_t newState); static void SimpleBLEPeripheral_processCharValueChangeEvt(uint8_t paramID); static void SimpleBLEPeripheral_performPeriodicTask(void); static void SimpleBLEPeripheral_sendAttRsp(void); static void SimpleBLEPeripheral_freeAttRsp(uint8_t status); static void SimpleBLEPeripheral_stateChangeCB(gaprole_States_t newState); #ifndef FEATURE_OAD static void SimpleBLEPeripheral_charValueChangeCB(uint8_t paramID); #endif //!FEATURE_OAD static void SimpleBLEPeripheral_enqueueMsg(uint8_t event, uint8_t state); #ifdef FEATURE_OAD void SimpleBLEPeripheral_processOadWriteCB(uint8_t event, uint16_t connHandle, uint8_t *pData); #endif //FEATURE_OAD static void SimpleBLEPeripheral_clockHandler(UArg arg); /********************************************************************* * PROFILE CALLBACKS */ // GAP Role Callbacks static gapRolesCBs_t SimpleBLEPeripheral_gapRoleCBs = { SimpleBLEPeripheral_stateChangeCB // Profile State Change Callbacks }; // GAP Bond Manager Callbacks static gapBondCBs_t simpleBLEPeripheral_BondMgrCBs = { NULL, // Passcode callback (not used by application) NULL // Pairing / Bonding state Callback (not used by application) }; // Simple GATT Profile Callbacks #ifndef FEATURE_OAD static simpleProfileCBs_t SimpleBLEPeripheral_simpleProfileCBs = { SimpleBLEPeripheral_charValueChangeCB // Characteristic value change callback }; #endif //!FEATURE_OAD #ifdef FEATURE_OAD static oadTargetCBs_t simpleBLEPeripheral_oadCBs = { SimpleBLEPeripheral_processOadWriteCB // Write Callback. }; #endif //FEATURE_OAD /********************************************************************* * PUBLIC FUNCTIONS */ static void buttonHwiFxn(PIN_Handle hPin, PIN_Id pinId) { // set event in SBP task to process outside of hwi context events |= SBP_BTN_EVT; // Wake up the application. Semaphore_post(sem); } /********************************************************************* * @fn SimpleBLEPeripheral_createTask * * @brief Task creation function for the Simple BLE Peripheral. * * @param None. * * @return None. */ void SimpleBLEPeripheral_createTask(void) { Task_Params taskParams; // Configure task Task_Params_init(&taskParams); taskParams.stack = sbpTaskStack; taskParams.stackSize = SBP_TASK_STACK_SIZE; taskParams.priority = SBP_TASK_PRIORITY; Task_construct(&sbpTask, SimpleBLEPeripheral_taskFxn, &taskParams, NULL); } /********************************************************************* * @fn SimpleBLEPeripheral_init * * @brief Called during initialization and contains application * specific initialization (ie. hardware initialization/setup, * table initialization, power up notification, etc), and * profile initialization/setup. * * @param None. * * @return None. */ static void SimpleBLEPeripheral_init(void) { // ****************************************************************** // N0 STACK API CALLS CAN OCCUR BEFORE THIS CALL TO ICall_registerApp // ****************************************************************** // Register the current thread as an ICall dispatcher application // so that the application can send and receive messages. ICall_registerApp(&selfEntity, &sem); // Hard code the BD Address till CC2650 board gets its own IEEE address //uint8 bdAddress[B_ADDR_LEN] = { 0xAD, 0xD0, 0x0A, 0xAD, 0xD0, 0x0A }; //HCI_EXT_SetBDADDRCmd(bdAddress); // Set device's Sleep Clock Accuracy //HCI_EXT_SetSCACmd(40); // Create an RTOS queue for message from profile to be sent to app. appMsgQueue = Util_constructQueue(&appMsg); // Create one-shot clocks for internal periodic events. Util_constructClock(&periodicClock, SimpleBLEPeripheral_clockHandler, SBP_PERIODIC_EVT_PERIOD, 0, false, SBP_PERIODIC_EVT); #ifndef SENSORTAG_HW Board_openLCD(); #endif //SENSORTAG_HW #if SENSORTAG_HW // Setup SPI bus for serial flash and Devpack interface bspSpiOpen(); #endif //SENSORTAG_HW // Setup the GAP GAP_SetParamValue(TGAP_CONN_PAUSE_PERIPHERAL, DEFAULT_CONN_PAUSE_PERIPHERAL); // Setup the GAP Peripheral Role Profile { // For all hardware platforms, device starts advertising upon initialization uint8_t initialAdvertEnable = TRUE; // By setting this to zero, the device will go into the waiting state after // being discoverable for 30.72 second, and will not being advertising again // until the enabler is set back to TRUE uint16_t advertOffTime = 0; uint8_t enableUpdateRequest = DEFAULT_ENABLE_UPDATE_REQUEST; uint16_t desiredMinInterval = DEFAULT_DESIRED_MIN_CONN_INTERVAL; uint16_t desiredMaxInterval = DEFAULT_DESIRED_MAX_CONN_INTERVAL; uint16_t desiredSlaveLatency = DEFAULT_DESIRED_SLAVE_LATENCY; uint16_t desiredConnTimeout = DEFAULT_DESIRED_CONN_TIMEOUT; ti_sysbios_knl_Task_sleep(10*100); // Set the GAP Role Parameters GAPRole_SetParameter(GAPROLE_ADVERT_ENABLED, sizeof(uint8_t), &initialAdvertEnable); GAPRole_SetParameter(GAPROLE_ADVERT_OFF_TIME, sizeof(uint16_t), &advertOffTime); GAPRole_SetParameter(GAPROLE_SCAN_RSP_DATA, sizeof(scanRspData), scanRspData); GAPRole_SetParameter(GAPROLE_ADVERT_DATA, sizeof(advertData), advertData); GAPRole_SetParameter(GAPROLE_PARAM_UPDATE_ENABLE, sizeof(uint8_t), &enableUpdateRequest); GAPRole_SetParameter(GAPROLE_MIN_CONN_INTERVAL, sizeof(uint16_t), &desiredMinInterval); GAPRole_SetParameter(GAPROLE_MAX_CONN_INTERVAL, sizeof(uint16_t), &desiredMaxInterval); GAPRole_SetParameter(GAPROLE_SLAVE_LATENCY, sizeof(uint16_t), &desiredSlaveLatency); GAPRole_SetParameter(GAPROLE_TIMEOUT_MULTIPLIER, sizeof(uint16_t), &desiredConnTimeout); } // Set the GAP Characteristics GGS_SetParameter(GGS_DEVICE_NAME_ATT, GAP_DEVICE_NAME_LEN, attDeviceName); // Set advertising interval { uint16_t advInt = DEFAULT_ADVERTISING_INTERVAL; GAP_SetParamValue(TGAP_LIM_DISC_ADV_INT_MIN, advInt); GAP_SetParamValue(TGAP_LIM_DISC_ADV_INT_MAX, advInt); GAP_SetParamValue(TGAP_GEN_DISC_ADV_INT_MIN, advInt); GAP_SetParamValue(TGAP_GEN_DISC_ADV_INT_MAX, advInt); } // Setup the GAP Bond Manager { uint32_t passkey = 0; // passkey "000000" uint8_t pairMode = GAPBOND_PAIRING_MODE_WAIT_FOR_REQ; uint8_t mitm = TRUE; uint8_t ioCap = GAPBOND_IO_CAP_DISPLAY_ONLY; uint8_t bonding = TRUE; GAPBondMgr_SetParameter(GAPBOND_DEFAULT_PASSCODE, sizeof(uint32_t), &passkey); GAPBondMgr_SetParameter(GAPBOND_PAIRING_MODE, sizeof(uint8_t), &pairMode); GAPBondMgr_SetParameter(GAPBOND_MITM_PROTECTION, sizeof(uint8_t), &mitm); GAPBondMgr_SetParameter(GAPBOND_IO_CAPABILITIES, sizeof(uint8_t), &ioCap); GAPBondMgr_SetParameter(GAPBOND_BONDING_ENABLED, sizeof(uint8_t), &bonding); } // Initialize GATT attributes GGS_AddService(GATT_ALL_SERVICES); // GAP GATTServApp_AddService(GATT_ALL_SERVICES); // GATT attributes DevInfo_AddService(); // Device Information Service #ifndef FEATURE_OAD SimpleProfile_AddService(GATT_ALL_SERVICES); // Simple GATT Profile #endif //!FEATURE_OAD #ifdef FEATURE_OAD VOID OAD_addService(); // OAD Profile OAD_register((oadTargetCBs_t *)&simpleBLEPeripheral_oadCBs); hOadQ = Util_constructQueue(&oadQ); #endif #ifdef IMAGE_INVALIDATE Reset_addService(); #endif //IMAGE_INVALIDATE #ifndef FEATURE_OAD // Setup the SimpleProfile Characteristic Values { uint8_t charValue1 = 1; uint8_t charValue2 = 2; uint8_t charValue3 = 3; uint8_t charValue4 = 4; uint8_t charValue5[SIMPLEPROFILE_CHAR5_LEN] = { 1, 2, 3, 4, 5 }; SimpleProfile_SetParameter(SIMPLEPROFILE_CHAR1, sizeof(uint8_t), &charValue1); SimpleProfile_SetParameter(SIMPLEPROFILE_CHAR2, sizeof(uint8_t), &charValue2); SimpleProfile_SetParameter(SIMPLEPROFILE_CHAR3, sizeof(uint8_t), &charValue3); SimpleProfile_SetParameter(SIMPLEPROFILE_CHAR4, sizeof(uint8_t), &charValue4); SimpleProfile_SetParameter(SIMPLEPROFILE_CHAR5, SIMPLEPROFILE_CHAR5_LEN, charValue5); } // Register callback with SimpleGATTprofile SimpleProfile_RegisterAppCBs(&SimpleBLEPeripheral_simpleProfileCBs); #endif //!FEATURE_OAD // Start the Device VOID GAPRole_StartDevice(&SimpleBLEPeripheral_gapRoleCBs); // Start Bond Manager VOID GAPBondMgr_Register(&simpleBLEPeripheral_BondMgrCBs); // Register with GAP for HCI/Host messages GAP_RegisterForMsgs(selfEntity); // Register for GATT local events and ATT Responses pending for transmission GATT_RegisterForMsgs(selfEntity); #if defined FEATURE_OAD #if defined (HAL_IMAGE_A) LCD_WRITE_STRING("BLE Peripheral A", LCD_PAGE0); #else LCD_WRITE_STRING("BLE Peripheral B", LCD_PAGE0); #endif // HAL_IMAGE_A #else LCD_WRITE_STRING("BLE Peripheral", LCD_PAGE0); #endif // FEATURE_OAD } /********************************************************************* * @fn SimpleBLEPeripheral_taskFxn * * @brief Application task entry point for the Simple BLE Peripheral. * * @param a0, a1 - not used. * * @return None. */ static void SimpleBLEPeripheral_taskFxn(UArg a0, UArg a1) { // Initialize application SimpleBLEPeripheral_init(); // Application main loop for (;;) { // Waits for a signal to the semaphore associated with the calling thread. // Note that the semaphore associated with a thread is signaled when a // message is queued to the message receive queue of the thread or when // ICall_signal() function is called onto the semaphore. ICall_Errno errno = ICall_wait(ICALL_TIMEOUT_FOREVER); if (errno == ICALL_ERRNO_SUCCESS) { ICall_EntityID dest; ICall_ServiceEnum src; ICall_HciExtEvt *pMsg = NULL; if (ICall_fetchServiceMsg(&src, &dest, (void **)&pMsg) == ICALL_ERRNO_SUCCESS) { uint8 safeToDealloc = TRUE; if ((src == ICALL_SERVICE_CLASS_BLE) && (dest == selfEntity)) { ICall_Event *pEvt = (ICall_Event *)pMsg; // Check for BLE stack events first if (pEvt->signature == 0xffff) { if (pEvt->event_flag & SBP_CONN_EVT_END_EVT) { // Try to retransmit pending ATT Response (if any) SimpleBLEPeripheral_sendAttRsp(); } } else { // Process inter-task message safeToDealloc = SimpleBLEPeripheral_processStackMsg((ICall_Hdr *)pMsg); } } if (pMsg && safeToDealloc) { ICall_freeMsg(pMsg); } } // If RTOS queue is not empty, process app message. while (!Queue_empty(appMsgQueue)) { sbpEvt_t *pMsg = (sbpEvt_t *)Util_dequeueMsg(appMsgQueue); if (pMsg) { // Process message. SimpleBLEPeripheral_processAppMsg(pMsg); // Free the space from the message. ICall_free(pMsg); } } } if (events & SBP_PERIODIC_EVT) { events &= ~SBP_PERIODIC_EVT; Util_startClock(&periodicClock); // Perform periodic application task SimpleBLEPeripheral_performPeriodicTask(); } #ifdef FEATURE_OAD while (!Queue_empty(hOadQ)) { oadTargetWrite_t *oadWriteEvt = Queue_dequeue(hOadQ); // Identify new image. if (oadWriteEvt->event == OAD_WRITE_IDENTIFY_REQ) { OAD_imgIdentifyWrite(oadWriteEvt->connHandle, oadWriteEvt->pData); } // Write a next block request. else if (oadWriteEvt->event == OAD_WRITE_BLOCK_REQ) { OAD_imgBlockWrite(oadWriteEvt->connHandle, oadWriteEvt->pData); } // Free buffer. ICall_free(oadWriteEvt); } #endif //FEATURE_OAD } } /********************************************************************* * @fn SimpleBLEPeripheral_processStackMsg * * @brief Process an incoming stack message. * * @param pMsg - message to process * * @return TRUE if safe to deallocate incoming message, FALSE otherwise. */ static uint8_t SimpleBLEPeripheral_processStackMsg(ICall_Hdr *pMsg) { uint8_t safeToDealloc = TRUE; switch (pMsg->event) { case GATT_MSG_EVENT: // Process GATT message safeToDealloc = SimpleBLEPeripheral_processGATTMsg((gattMsgEvent_t *)pMsg); break; case HCI_GAP_EVENT_EVENT: { // Process HCI message switch(pMsg->status) { case HCI_COMMAND_COMPLETE_EVENT_CODE: // Process HCI Command Complete Event break; default: break; } } break; default: // do nothing break; } return (safeToDealloc); } /********************************************************************* * @fn SimpleBLEPeripheral_processGATTMsg * * @brief Process GATT messages and events. * * @return TRUE if safe to deallocate incoming message, FALSE otherwise. */ static uint8_t SimpleBLEPeripheral_processGATTMsg(gattMsgEvent_t *pMsg) { // See if GATT server was unable to transmit an ATT response if (pMsg->hdr.status == blePending) { // No HCI buffer was available. Let's try to retransmit the response // on the next connection event. if (HCI_EXT_ConnEventNoticeCmd(pMsg->connHandle, selfEntity, SBP_CONN_EVT_END_EVT) == SUCCESS) { // First free any pending response SimpleBLEPeripheral_freeAttRsp(FAILURE); // Hold on to the response message for retransmission pAttRsp = pMsg; // Don't free the response message yet return (FALSE); } } else if (pMsg->method == ATT_FLOW_CTRL_VIOLATED_EVENT) { // ATT request-response or indication-confirmation flow control is // violated. All subsequent ATT requests or indications will be dropped. // The app is informed in case it wants to drop the connection. // Display the opcode of the message that caused the violation. LCD_WRITE_STRING_VALUE("FC Violated:", pMsg->msg.flowCtrlEvt.opcode, 10, LCD_PAGE5); } else if (pMsg->method == ATT_MTU_UPDATED_EVENT) { // MTU size updated LCD_WRITE_STRING_VALUE("MTU Size:", pMsg->msg.mtuEvt.MTU, 10, LCD_PAGE5); } // Free message payload. Needed only for ATT Protocol messages GATT_bm_free(&pMsg->msg, pMsg->method); // It's safe to free the incoming message return (TRUE); } /********************************************************************* * @fn SimpleBLEPeripheral_sendAttRsp * * @brief Send a pending ATT response message. * * @param none * * @return none */ static void SimpleBLEPeripheral_sendAttRsp(void) { // See if there's a pending ATT Response to be transmitted if (pAttRsp != NULL) { uint8_t status; // Increment retransmission count rspTxRetry++; // Try to retransmit ATT response till either we're successful or // the ATT Client times out (after 30s) and drops the connection. status = GATT_SendRsp(pAttRsp->connHandle, pAttRsp->method, &(pAttRsp->msg)); if ((status != blePending) && (status != MSG_BUFFER_NOT_AVAIL)) { // Disable connection event end notice HCI_EXT_ConnEventNoticeCmd(pAttRsp->connHandle, selfEntity, 0); // We're done with the response message SimpleBLEPeripheral_freeAttRsp(status); } else { // Continue retrying LCD_WRITE_STRING_VALUE("Rsp send retry:", rspTxRetry, 10, LCD_PAGE5); } } } /********************************************************************* * @fn SimpleBLEPeripheral_freeAttRsp * * @brief Free ATT response message. * * @param status - response transmit status * * @return none */ static void SimpleBLEPeripheral_freeAttRsp(uint8_t status) { // See if there's a pending ATT response message if (pAttRsp != NULL) { // See if the response was sent out successfully if (status == SUCCESS) { LCD_WRITE_STRING_VALUE("Rsp sent, retry:", rspTxRetry, 10, LCD_PAGE5); } else { // Free response payload GATT_bm_free(&pAttRsp->msg, pAttRsp->method); LCD_WRITE_STRING_VALUE("Rsp retry failed:", rspTxRetry, 10, LCD_PAGE5); } // Free response message ICall_freeMsg(pAttRsp); // Reset our globals pAttRsp = NULL; rspTxRetry = 0; } } /********************************************************************* * @fn SimpleBLEPeripheral_processAppMsg * * @brief Process an incoming callback from a profile. * * @param pMsg - message to process * * @return None. */ static void SimpleBLEPeripheral_processAppMsg(sbpEvt_t *pMsg) { switch (pMsg->hdr.event) { case SBP_STATE_CHANGE_EVT: SimpleBLEPeripheral_processStateChangeEvt((gaprole_States_t)pMsg-> hdr.state); break; case SBP_CHAR_CHANGE_EVT: SimpleBLEPeripheral_processCharValueChangeEvt(pMsg->hdr.state); break; default: // Do nothing. break; } } /********************************************************************* * @fn SimpleBLEPeripheral_stateChangeCB * * @brief Callback from GAP Role indicating a role state change. * * @param newState - new state * * @return None. */ static void SimpleBLEPeripheral_stateChangeCB(gaprole_States_t newState) { SimpleBLEPeripheral_enqueueMsg(SBP_STATE_CHANGE_EVT, newState); } /********************************************************************* * @fn SimpleBLEPeripheral_processStateChangeEvt * * @brief Process a pending GAP Role state change event. * * @param newState - new state * * @return None. */ static void SimpleBLEPeripheral_processStateChangeEvt(gaprole_States_t newState) { #ifdef PLUS_BROADCASTER static bool firstConnFlag = false; #endif // PLUS_BROADCASTER switch ( newState ) { case GAPROLE_STARTED: { uint8_t ownAddress[B_ADDR_LEN]; uint8_t systemId[DEVINFO_SYSTEM_ID_LEN]; GAPRole_GetParameter(GAPROLE_BD_ADDR, ownAddress); // use 6 bytes of device address for 8 bytes of system ID value systemId[0] = ownAddress[0]; systemId[1] = ownAddress[1]; systemId[2] = ownAddress[2]; // set middle bytes to zero systemId[4] = 0x00; systemId[3] = 0x00; // shift three bytes up systemId[7] = ownAddress[5]; systemId[6] = ownAddress[4]; systemId[5] = ownAddress[3]; DevInfo_SetParameter(DEVINFO_SYSTEM_ID, DEVINFO_SYSTEM_ID_LEN, systemId); // Display device address LCD_WRITE_STRING(Util_convertBdAddr2Str(ownAddress), LCD_PAGE1); LCD_WRITE_STRING("Initialized", LCD_PAGE2); } break; case GAPROLE_ADVERTISING: LCD_WRITE_STRING("Advertising", LCD_PAGE2); break; #ifdef PLUS_BROADCASTER /* After a connection is dropped a device in PLUS_BROADCASTER will continue * sending non-connectable advertisements and shall sending this change of * state to the application. These are then disabled here so that sending * connectable advertisements can resume. */ case GAPROLE_ADVERTISING_NONCONN: { uint8_t advertEnabled = FALSE; // Disable non-connectable advertising. GAPRole_SetParameter(GAPROLE_ADV_NONCONN_ENABLED, sizeof(uint8_t), &advertEnabled); advertEnabled = TRUE; // Enabled connectable advertising. GAPRole_SetParameter(GAPROLE_ADVERT_ENABLED, sizeof(uint8_t), &advertEnabled); // Reset flag for next connection. firstConnFlag = false; SimpleBLEPeripheral_freeAttRsp(bleNotConnected); } break; #endif //PLUS_BROADCASTER case GAPROLE_CONNECTED: { uint8_t peerAddress[B_ADDR_LEN]; GAPRole_GetParameter(GAPROLE_CONN_BD_ADDR, peerAddress); Util_startClock(&periodicClock); LCD_WRITE_STRING("Connected", LCD_PAGE2); LCD_WRITE_STRING(Util_convertBdAddr2Str(peerAddress), LCD_PAGE3); #ifdef PLUS_BROADCASTER // Only turn advertising on for this state when we first connect // otherwise, when we go from connected_advertising back to this state // we will be turning advertising back on. if (firstConnFlag == false) { uint8_t advertEnabled = FALSE; // Turn on Advertising // Disable connectable advertising. GAPRole_SetParameter(GAPROLE_ADVERT_ENABLED, sizeof(uint8_t), &advertEnabled); // Set to true for non-connectabel advertising. advertEnabled = TRUE; // Enable non-connectable advertising. GAPRole_SetParameter(GAPROLE_ADV_NONCONN_ENABLED, sizeof(uint8_t), &advertEnabled); firstConnFlag = true; } #endif // PLUS_BROADCASTER } break; case GAPROLE_CONNECTED_ADV: LCD_WRITE_STRING("Connected Advertising", LCD_PAGE2); break; case GAPROLE_WAITING: Util_stopClock(&periodicClock); SimpleBLEPeripheral_freeAttRsp(bleNotConnected); LCD_WRITE_STRING("Disconnected", LCD_PAGE2); // Clear remaining lines LCD_WRITE_STRING("", LCD_PAGE3); LCD_WRITE_STRING("", LCD_PAGE4); LCD_WRITE_STRING("", LCD_PAGE5); break; case GAPROLE_WAITING_AFTER_TIMEOUT: SimpleBLEPeripheral_freeAttRsp(bleNotConnected); LCD_WRITE_STRING("Timed Out", LCD_PAGE2); // Clear remaining lines LCD_WRITE_STRING("", LCD_PAGE3); LCD_WRITE_STRING("", LCD_PAGE4); LCD_WRITE_STRING("", LCD_PAGE5); #ifdef PLUS_BROADCASTER // Reset flag for next connection. firstConnFlag = false; #endif //#ifdef (PLUS_BROADCASTER) break; case GAPROLE_ERROR: LCD_WRITE_STRING("Error", LCD_PAGE2); break; default: LCD_WRITE_STRING("", LCD_PAGE2); break; } // Update the state //gapProfileState = newState; } #ifndef FEATURE_OAD /********************************************************************* * @fn SimpleBLEPeripheral_charValueChangeCB * * @brief Callback from Simple Profile indicating a characteristic * value change. * * @param paramID - parameter ID of the value that was changed. * * @return None. */ static void SimpleBLEPeripheral_charValueChangeCB(uint8_t paramID) { SimpleBLEPeripheral_enqueueMsg(SBP_CHAR_CHANGE_EVT, paramID); } #endif //!FEATURE_OAD /********************************************************************* * @fn SimpleBLEPeripheral_processCharValueChangeEvt * * @brief Process a pending Simple Profile characteristic value change * event. * * @param paramID - parameter ID of the value that was changed. * * @return None. */ static void SimpleBLEPeripheral_processCharValueChangeEvt(uint8_t paramID) { #ifndef FEATURE_OAD uint8_t newValue; switch(paramID) { case SIMPLEPROFILE_CHAR1: SimpleProfile_GetParameter(SIMPLEPROFILE_CHAR1, &newValue); LCD_WRITE_STRING_VALUE("Char 1:", (uint16_t)newValue, 10, LCD_PAGE4); break; case SIMPLEPROFILE_CHAR3: SimpleProfile_GetParameter(SIMPLEPROFILE_CHAR3, &newValue); LCD_WRITE_STRING_VALUE("Char 3:", (uint16_t)newValue, 10, LCD_PAGE4); break; default: // should not reach here! break; } #endif //!FEATURE_OAD } /********************************************************************* * @fn SimpleBLEPeripheral_performPeriodicTask * * @brief Perform a periodic application task. This function gets called * every five seconds (SBP_PERIODIC_EVT_PERIOD). In this example, * the value of the third characteristic in the SimpleGATTProfile * service is retrieved from the profile, and then copied into the * value of the the fourth characteristic. * * @param None. * * @return None. */ static void SimpleBLEPeripheral_performPeriodicTask(void) { #ifndef FEATURE_OAD uint8_t valueToCopy; // Call to retrieve the value of the third characteristic in the profile if (SimpleProfile_GetParameter(SIMPLEPROFILE_CHAR3, &valueToCopy) == SUCCESS) { // Call to set that value of the fourth characteristic in the profile. // Note that if notifications of the fourth characteristic have been // enabled by a GATT client device, then a notification will be sent // every time this function is called. SimpleProfile_SetParameter(SIMPLEPROFILE_CHAR4, sizeof(uint8_t), &valueToCopy); } #endif //!FEATURE_OAD } #if defined(FEATURE_OAD) /********************************************************************* * @fn SimpleBLEPeripheral_processOadWriteCB * * @brief Process a write request to the OAD profile. * * @param event - event type: * OAD_WRITE_IDENTIFY_REQ * OAD_WRITE_BLOCK_REQ * @param connHandle - the connection Handle this request is from. * @param pData - pointer to data for processing and/or storing. * * @return None. */ void SimpleBLEPeripheral_processOadWriteCB(uint8_t event, uint16_t connHandle, uint8_t *pData) { oadTargetWrite_t *oadWriteEvt = ICall_malloc( sizeof(oadTargetWrite_t) + \ sizeof(uint8_t) * OAD_PACKET_SIZE); if ( oadWriteEvt != NULL ) { oadWriteEvt->event = event; oadWriteEvt->connHandle = connHandle; oadWriteEvt->pData = (uint8_t *)(&oadWriteEvt->pData + 1); memcpy(oadWriteEvt->pData, pData, OAD_PACKET_SIZE); Queue_enqueue(hOadQ, (Queue_Elem *)oadWriteEvt); // Post the application's semaphore. Semaphore_post(sem); } else { // Fail silently. } } #endif //FEATURE_OAD /********************************************************************* * @fn SimpleBLEPeripheral_clockHandler * * @brief Handler function for clock timeouts. * * @param arg - event type * * @return None. */ static void SimpleBLEPeripheral_clockHandler(UArg arg) { // Store the event. events |= arg; // Wake up the application. Semaphore_post(sem); } /********************************************************************* * @fn SimpleBLEPeripheral_enqueueMsg * * @brief Creates a message and puts the message in RTOS queue. * * @param event - message event. * @param state - message state. * * @return None. */ static void SimpleBLEPeripheral_enqueueMsg(uint8_t event, uint8_t state) { sbpEvt_t *pMsg; // Create dynamic pointer to message. if ((pMsg = ICall_malloc(sizeof(sbpEvt_t)))) { pMsg->hdr.event = event; pMsg->hdr.state = state; // Enqueue the message. Util_enqueueMsg(appMsgQueue, sem, (uint8*)pMsg); } } /********************************************************************* *********************************************************************/
Hello Yikai :
Your code is working without error
but I try to follow SWRU393A chapter 6.3.1 PIN Step 4 :
SimpleBLEPeripheral_taskFxn(UArg a0, UArg a1)
{
// Initialize application
SimpleBLEPeripheral_init();
if (events & SBP_BTN_EVT)
{
events &= ~SBP_BTN_EVT;
if(LED_value){
PIN_setOutputValue(hSbpPins, Board_LED1 , LED_value--);
}else{
PIN_setOutputValue(hSbpPins, Board_LED1, LED_value++);
}
}
}
will show identifier "LED_value" is undefined
and Step 5 : In SimpleBLEPeripheral_init()
Hello Yikai:
So I need to edit Board.c file :
C:\ti\tirtos_simplelink_2_13_00_06\packages\ti\boards\SRF06EB\CC2650EM_7ID
PIN_Config BoardGpioInitTable[] = {
Board_SDA | PIN_GPIO_OUTPUT_EN | PIN_GPIO_LOW | PIN_PUSHPULL | PIN_DRVSTR_MAX,
Board_SCL | PIN_GPIO_OUTPUT_EN | PIN_GPIO_LOW | PIN_PUSHPULL | PIN_DRVSTR_MAX,
Board_LED3 | PIN_GPIO_OUTPUT_EN | PIN_GPIO_LOW | PIN_PUSHPULL | PIN_DRVSTR_MAX,
Board_LED4 | PIN_GPIO_OUTPUT_EN | PIN_GPIO_LOW | PIN_PUSHPULL | PIN_DRVSTR_MAX
PIN_TERMINATE /* Terminate list */
};
#include <ti/drivers/I2C/I2CCC26XX.h>
I2CCC26XX_Object i2cCC26XXObjects[CC2650_I2CCOUNT];
const I2CCC26XX_HWAttrs i2cCC26XXHWAttrs[CC2650_I2CCOUNT] = {
{
.baseAddr = I2C0_BASE,
.intNum = INT_I2C,
.powerMngrId = PERIPH_I2C0,
.sdaPin = Board_SDA,
.sclPin = Board_SCL
},
};
---------------OK----------------
but If I add this line :
const I2C_Config I2C_config[] = {
{ &I2CCC26XX_fxnTable, &i2cCC26XXObjects[0], &i2cCC26XXHWAttrs[0] },
{ NULL, NULL, NULL}
};
building error....
Hello Yikai:
I edit Board.c file:
C:\ti\tirtos_simplelink_2_13_00_06\packages\ti\boards\SRF06EB\CC2650EM_7ID
It's not building succeed when I add this line :
const I2C_Config I2C_config[] = {
{ &I2CCC26XX_fxnTable, &i2cCC26XXObjects[0], &i2cCC26XXHWAttrs[0] },
{ NULL, NULL, NULL}
};
Board.h
/* Leds */
#define Board_LED_ON 1 /* LEDs on CC2650 are active high */
#define Board_LED_OFF 0
#define Board_LED1 IOID_25 /* RF2.11 */
#define Board_LED2 IOID_27 /* RF2.13 */
#define Board_LED3 IOID_7 /* RF1.2 */
#define Board_LED4 IOID_6 /* RF1.4 */
/* I2C */
#define Board_I2C0_SDA0 IOID_25
#define Board_I2C0_SCL0 IOID_27
Board.c
#include <ti/drivers/I2C/I2CCC26XX.h>
I2CCC26XX_Object i2cCC26XXObjects[CC2650_I2CCOUNT];
const I2CCC26XX_HWAttrs i2cCC26XXHWAttrs[CC2650_I2CCOUNT] = {
{
.baseAddr = I2C0_BASE,
.intNum = INT_I2C,
.powerMngrId = PERIPH_I2C0,
.sdaPin = Board_I2C0_SDA0,
.sclPin = Board_I2C0_SCL0,
},
};
const I2C_Config I2C_config[] = {
{ &I2CCC26XX_fxnTable, &i2cCC26XXObjects[0], &i2cCC26XXHWAttrs[0] },
{ NULL, NULL, NULL}
};
I attach my Board.h and Board.c. You can replace the one in C:\ti\tirtos_simplelink_2_13_00_06\packages\ti\boards\SRF06EB\CC2650EM_7ID and build again.
/* * Copyright (c) 2015, Texas Instruments Incorporated * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * * Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * * Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * * * Neither the name of Texas Instruments Incorporated nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, * EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ /* * ====================== Board.c ============================================= * This file is responsible for setting up the board specific items for the * SRF06EB with the CC2650EM_7ID board. */ /* * ====================== Includes ============================================ */ #include <inc/hw_memmap.h> #include <inc/hw_ints.h> #include <driverlib/ioc.h> #include <driverlib/udma.h> #include <xdc/std.h> #include <xdc/runtime/System.h> #include <ti/sysbios/family/arm/m3/Hwi.h> #include <ti/sysbios/family/arm/cc26xx/Power.h> #include <ti/sysbios/family/arm/cc26xx/PowerCC2650.h> #include <ti/drivers/PIN.h> #include "Board.h" /* Include drivers */ #include <ti/drivers/i2c/I2CCC26XX.h> /* * ========================= IO driver initialization ========================= * From main, PIN_init(BoardGpioInitTable) should be called to setup safe * settings for this board. * When a pin is allocated and then de-allocated, it will revert to the state * configured in this table. */ PIN_Config BoardGpioInitTable[] = { Board_LED1 | PIN_GPIO_OUTPUT_EN | PIN_GPIO_LOW | PIN_PUSHPULL | PIN_DRVSTR_MAX, /* LED initially off */ Board_LED2 | PIN_GPIO_OUTPUT_EN | PIN_GPIO_LOW | PIN_PUSHPULL | PIN_DRVSTR_MAX, /* LED initially off */ Board_LED3 | PIN_GPIO_OUTPUT_EN | PIN_GPIO_LOW | PIN_PUSHPULL | PIN_DRVSTR_MAX, /* LED initially off */ Board_LED4 | PIN_GPIO_OUTPUT_EN | PIN_GPIO_LOW | PIN_PUSHPULL | PIN_DRVSTR_MAX, /* LED initially off */ Board_KEY_SELECT | PIN_INPUT_EN | PIN_PULLUP | PIN_HYSTERESIS, /* Button is active low */ Board_KEY_UP | PIN_INPUT_EN | PIN_PULLUP | PIN_HYSTERESIS, /* Button is active low */ Board_KEY_DOWN | PIN_INPUT_EN | PIN_PULLUP | PIN_HYSTERESIS, /* Button is active low */ Board_KEY_LEFT | PIN_INPUT_EN | PIN_PULLUP | PIN_HYSTERESIS, /* Button is active low */ Board_KEY_RIGHT | PIN_INPUT_EN | PIN_PULLUP | PIN_HYSTERESIS, /* Button is active low */ Board_3V3_EN | PIN_GPIO_OUTPUT_EN | PIN_GPIO_LOW | PIN_PUSHPULL, /* 3V3 domain off initially */ Board_LCD_MODE | PIN_GPIO_OUTPUT_EN | PIN_GPIO_HIGH | PIN_PUSHPULL, /* LCD pin high initially */ Board_LCD_RST | PIN_GPIO_OUTPUT_EN | PIN_GPIO_HIGH | PIN_PUSHPULL, /* LCD pin high initially */ Board_LCD_CSN | PIN_GPIO_OUTPUT_EN | PIN_GPIO_HIGH | PIN_PUSHPULL, /* LCD pin high initially */ Board_UART_TX | PIN_GPIO_OUTPUT_EN | PIN_GPIO_HIGH | PIN_PUSHPULL, /* UART TX pin at inactive level */ PIN_TERMINATE /* Terminate list */ }; /*============================================================================*/ /* * ============================= UART begin =================================== */ #if defined(__TI_COMPILER_VERSION__) #pragma DATA_SECTION(UART_config, ".const:UART_config") #pragma DATA_SECTION(uartCC26XXHWAttrs, ".const:uartCC26XXHWAttrs") #endif /* Include drivers */ #include <ti/drivers/UART.h> #include <ti/drivers/uart/UARTCC26XX.h> /* UART objects */ UARTCC26XX_Object uartCC26XXObjects[CC2650_UARTCOUNT]; /* UART hardware parameter structure, also used to assign UART pins */ const UARTCC26XX_HWAttrs uartCC26XXHWAttrs[CC2650_UARTCOUNT] = { { /* CC2650_UART0 */ .baseAddr = UART0_BASE, .intNum = INT_UART0, .powerMngrId = PERIPH_UART0, .txPin = Board_UART_TX, .rxPin = Board_UART_RX, .ctsPin = PIN_UNASSIGNED, .rtsPin = PIN_UNASSIGNED }, }; /* UART configuration structure */ const UART_Config UART_config[] = { { &UARTCC26XX_fxnTable, &uartCC26XXObjects[0], &uartCC26XXHWAttrs[0] }, { NULL, NULL, NULL } }; /* * ============================= UART end ===================================== */ /* I2C objects */ I2CCC26XX_Object i2cCC26xxObjects[CC2650_I2CCOUNT]; /* I2C configuration structure, describing which pins are to be used */ const I2CCC26XX_HWAttrs i2cCC26xxHWAttrs[CC2650_I2CCOUNT] = { { .baseAddr = I2C0_BASE, .intNum = INT_I2C, .powerMngrId = PERIPH_I2C0, .sdaPin = Board_I2C0_SDA0, .sclPin = Board_I2C0_SCL0, } }; const I2C_Config I2C_config[] = { {&I2CCC26XX_fxnTable, &i2cCC26xxObjects[0], &i2cCC26xxHWAttrs[0]}, {NULL, NULL, NULL} }; /* * ============================= UDMA begin =================================== */ /* Place into subsections to allow the TI linker to remove items properly */ #if defined(__TI_COMPILER_VERSION__) #pragma DATA_SECTION(UDMACC26XX_config, ".const:UDMACC26XX_config") #pragma DATA_SECTION(udmaHWAttrs, ".const:udmaHWAttrs") #endif /* Include drivers */ #include <ti/drivers/dma/UDMACC26XX.h> /* UDMA objects */ UDMACC26XX_Object UdmaObjects[CC2650_UDMACOUNT]; /* UDMA configuration structure */ const UDMACC26XX_HWAttrs udmaHWAttrs[CC2650_UDMACOUNT] = { { UDMA0_BASE, INT_UDMAERR, PERIPH_UDMA }, }; /* UDMA configuration structure */ const UDMACC26XX_Config UDMACC26XX_config[] = { {&UdmaObjects[0], &udmaHWAttrs[0]}, {NULL, NULL}, }; /* * ============================= UDMA end ===================================== */ /* * ========================== SPI DMA begin =================================== */ /* Place into subsections to allow the TI linker to remove items properly */ #if defined(__TI_COMPILER_VERSION__) #pragma DATA_SECTION(SPI_config, ".const:SPI_config") #pragma DATA_SECTION(spiCC26XXDMAHWAttrs, ".const:spiCC26XXDMAHWAttrs") #endif /* Include drivers */ #include <ti/drivers/spi/SPICC26XXDMA.h> /* SPI objects */ SPICC26XX_Object spiCC26XXDMAObjects[CC2650_SPICOUNT]; /* SPI configuration structure, describing which pins are to be used */ const SPICC26XX_HWAttrs spiCC26XXDMAHWAttrs[CC2650_SPICOUNT] = { { /* SRF06EB_CC2650_SPI0 */ .baseAddr = SSI0_BASE, .intNum = INT_SSI0, .defaultTxBufValue = 0, .powerMngrId = PERIPH_SSI0, .rxChannelBitMask = 1<<UDMA_CHAN_SSI0_RX, .txChannelBitMask = 1<<UDMA_CHAN_SSI0_TX, .mosiPin = Board_SPI0_MOSI, .misoPin = Board_SPI0_MISO, .clkPin = Board_SPI0_CLK, .csnPin = Board_SPI0_CSN }, { /* SRF06EB_CC2650_SPI1 */ .baseAddr = SSI1_BASE, .intNum = INT_SSI1, .defaultTxBufValue = 0, .powerMngrId = PERIPH_SSI1, .rxChannelBitMask = 1<<UDMA_CHAN_SSI1_RX, .txChannelBitMask = 1<<UDMA_CHAN_SSI1_TX, .mosiPin = Board_SPI1_MOSI, .misoPin = Board_SPI1_MISO, .clkPin = Board_SPI1_CLK, .csnPin = Board_SPI1_CSN } }; /* SPI configuration structure */ const SPI_Config SPI_config[] = { /* SRF06EB_CC2650_SPI0 */ {&SPICC26XXDMA_fxnTable, &spiCC26XXDMAObjects[0], &spiCC26XXDMAHWAttrs[0]}, /* SRF06EB_CC2650_SPI1 */ {&SPICC26XXDMA_fxnTable, &spiCC26XXDMAObjects[1], &spiCC26XXDMAHWAttrs[1]}, {NULL, NULL, NULL}, }; /* * ========================== SPI DMA end ===================================== */ /* * ========================== LCD begin ======================================= */ /* Place into subsections to allow the TI linker to remove items properly */ #if defined(__TI_COMPILER_VERSION__) #pragma DATA_SECTION(LCD_config, ".const:LCD_config") #pragma DATA_SECTION(lcdHWAttrs, ".const:lcdHWAttrs") #endif /* Include drivers */ #include <ti/drivers/lcd/LCDDogm1286.h> /* LCD object */ LCD_Object lcdObject; /* LCD hardware attribute structure */ const LCD_HWAttrs lcdHWAttrs = { .LCD_initCmd = &LCD_initCmd, .lcdResetPin = Board_LCD_RST, /* LCD reset pin */ .lcdModePin = Board_LCD_MODE, /* LCD mode pin */ .lcdCsnPin = Board_LCD_CSN, /* LCD CSn pin */ .spiIndex = Board_SPI0 }; /* LCD configuration structure */ const LCD_Config LCD_config = {&lcdObject, &lcdHWAttrs}; /* * ========================== LCD end ========================================= */ /* * ========================== Crypto begin ======================================= * NOTE: The Crypto implementaion should be considered experimental and not validated! */ /* Place into subsections to allow the TI linker to remove items properly */ #if defined(__TI_COMPILER_VERSION__) #pragma DATA_SECTION(CryptoCC26XX_config, ".const:CryptoCC26XX_config") #pragma DATA_SECTION(cryptoCC26XXHWAttrs, ".const:cryptoCC26XXHWAttrs") #endif /* Include drivers */ #include <ti/drivers/crypto/CryptoCC26XX.h> /* Crypto objects */ CryptoCC26XX_Object cryptoCC26XXObjects[CC2650_CRYPTOCOUNT]; /* Crypto configuration structure, describing which pins are to be used */ const CryptoCC26XX_HWAttrs cryptoCC26XXHWAttrs[CC2650_CRYPTOCOUNT] = { {CRYPTO_BASE, INT_CRYPTO, PERIPH_CRYPTO} }; /* Crypto configuration structure */ const CryptoCC26XX_Config CryptoCC26XX_config[] = { {&cryptoCC26XXObjects[0], &cryptoCC26XXHWAttrs[0]}, {NULL, NULL} }; /* * ========================== Crypto end ========================================= */
I try to new import
C:\ti\simplelink\ble_cc26xx_2_01_00_44423\Projects\ble\SimpleBLEPeripheral\CC26xx\CCS\SimpleBLEPeripheral
And building again , it's still not working.
In fact , I remove SimpleBLEPeripheral project and C:\ti\simplelink , tirtos_simplelink_2_13_00_06
then I rebuilding project , It's OK , no any error messages . By the way , LCD also can display messages.
Thank you very much .
And one question , If I want to see I2C write / read on LCD , how can I do ? I know LCD_WRITE_STRING() , but don't know how to display messages on LCD .
Because even building is success , I can't see any result . According to Software Develope's Guide Chapter 6.3.4 Step 5 :
Compile, download, and run. This will perform a 5-byte I2C write / read.
5-byte ? where ?
Hello Yikai:
I see , at least I know I2C basic define . I import i2ctmp006 project and see step , I know it's project for SensorTag , I don't have SensorTag, but
I have this :
I define TMP006's SCL is DIO_6 and TMP006's SDA is DIO_5
Board.c
Board_I2C0_SDA0 | PIN_GPIO_OUTPUT_EN | PIN_GPIO_LOW | PIN_PUSHPULL | PIN_DRVSTR_MAX,
Board_I2C0_SCL0 | PIN_GPIO_OUTPUT_EN | PIN_GPIO_LOW | PIN_PUSHPULL | PIN_DRVSTR_MAX,
Board.h
#define Board_I2C0_SDA0 IOID_5
#define Board_I2C0_SCL0 IOID_6
and modify i2ctmp006_cc26xx.c
but seems "i2ctmp006" project Board.h and Board.c do not define DIO pin ..