Skip to main content
Serial Port Profile with CC2650 and CC2640R2 (part 2)

Modified to transfer ADC values up to PC

Step 1: 
Include ACD.h library
#include <ti/drivers/ADC.h> 

Step 2:
Insert period event in order to update ADC read values from the potentiometer

#define SSSS_ICALL_EVT                         ICALL_MSG_EVENT_ID // Event_Id_31
#define SSSS_QUEUE_EVT                         UTIL_QUEUE_EVENT_ID // Event_Id_30
#define SSSS_PERIODIC_EVT                      Event_Id_00 //SOLUTION

// Bitwise OR of all events to pend on
#define SSSS_ALL_EVENTS                        (SSSS_ICALL_EVT        | \
                                                                          SSSS_QUEUE_EVT        | \
                                                                          SSSS_PERIODIC_EVT) 

Declare handle period 
// Clock instances for internal periodic events.

static Clock_Struct periodicClock;

and initialized it in SimpleSerialSocketServer_init() 
Util_constructClock(&periodicClock, SimplePeripheral_clockHandler,

                          SBP_PERIODIC_EVT_PERIOD, 0, false, SSSS_PERIODIC_EVT);
Step 3: declare ADC handle, variables  and Initialized ADC 

static ADC_Handle   adc; // my add
static ADC_Params   params;// my add
char *adcStr = NULL; // adc had 12 bit
uint16_t adcValue;  //my add

uint8_t adcReady = 0;   // make to separate with send text from PC via UART

Next, in SimpleSerialSocketServer_init() function we initialize ADC 

// ADC initialize
  ADC_init();
  ADC_Params_init(&params);

  adc = ADC_open(Board_ADC0, &params);

if (adc == NULL) {
      //Log_error0("Error initializing ADC channel 0\n");
      PIN_setOutputValue(ledPinHandle, Board_RLED, 1); //indicate mistake
      Task_exit();;

       }
Step 4:
Add process for Periodic Event in SimpleSerialSocketServer_taskFxn(UArg a0, UArg a1)

if (events & SSSS_PERIODIC_EVT)
      {
          Util_startClock(&periodicClock);

          ADC_convert(adc, &adcValue);

          adcStr = Byte2String(&adcValue);
          adcReady = 1; //notify to send adcValue

          SimpleSerialSocketServer_enqueueMsg(SSSS_OUTGOING_DATA, NULL, NULL, 6 );//sizeof(adcStr) 6 chars = 4 digits  and two chars '\n and \r'

      }

Here we add a Byte2String function to change the value from uint_16 to string with assume data has 12 bit so the data string will have 4 digits and 2 characters which are  '\n' and '\r'

Step 4.2  declare extern function Byte2String
extern char *Byte2String(uint16_t *adcValue);

and add the Byte2String function into util.c

char *Byte2String(uint16_t *adcValue)
{
    uint16_t     num, div;

    char        hex[] = "0123456789"; //char
    static char str[4 + 2]; //More character for \n\r
    char        *pStr = str;

    //*pStr++ = '0';
    //*pStr++ = 'x';

      // Start from end of addr
    //  pAddr += B_ADDR_LEN;
     num = *adcValue;
     div = 1000;
     while(div > 0)
     {
         *pStr++ = hex[num/div];
         num = num%div;
         div = div/10;

     }
     *pStr++ = '\n';
     *pStr++ = '\r';

      pStr = NULL;

      return str;
}

Step 5: add Util_startClock to start clock function when two devices connected in function SimpleSerialSocketServer_processStateChangeEvt(gaprole_States_t newState)

..
case GAPROLE_CONNECTED:
      {
        uint8_t numActive = 0;

        Util_startClock(&periodicClock); // SOLUTION

        numActive = linkDB_NumActive();
..
case GAPROLE_WAITING:
      {
        Util_stopClock(&periodicClock); //SOLUTION
        SimpleSerialSocketServer_freeAttRsp(bleNotConnected);
..
case GAPROLE_WAITING_AFTER_TIMEOUT:
      {

          Util_stopClock(&periodicClock); //SOLUTION
          SimpleSerialSocketServer_freeAttRsp(bleNotConnected);
..
Step 6: Compile and programming the board
And we got the ADC values as the figure 2



Comments

Popular posts from this blog

Arduino Code for test Heart Rate 7 Click

Heart Rate 7 Click is the newest module from MikroE which uses VEM8080 photodetector has a wide range spectrum from 300nm - 1000nm. To control and acquisition data, AFE4404 from TI inc. is adopted. This chip permits control 3 LED channels, and sample heart rate default 100 SPS.  A 22-bit ADC permit collecting very small changed voltage from a PD sensor. In this example we config Arduino Mega  2650 as below: Pin 4 for RST PIN 5 CLK PIN 6 INT PIN 20 SDA PIN 21 SCL Config registers follow the default of AFE4404 datasheet Page 27 with some minor changes. 1. Config Internal Clock through  AFE_CONTROL2 register addr.: 0x23 value: 0x104218  // setup all dynamic power to save energy 2. Control LED2 current through AFE_LEDCNTRL register addr: 0x22 value: 0x000100 3. Read data using PROG_TG_EN signal through AFE_TIA_GAIN register addr: 0x21 value: 0x000125 Time to start and end of PROG_TG setup through two registers: AFE_PROG_TG_STC register (...
Serial Port Profile with CC2650 and CC2640R2 This test based on code from TI support under link: For CC2650: https://github.com/ti-simplelink/ble_examples/blob/ble_examples-2.2/docs/spp_ble.md For CC2640R2: https://github.com/ti-simplelink/ble_examples/blob/simplelink_cc2640r2_sdk-2.20/examples/rtos/CC2640R2_LAUNCHXL/bleapps/simple_serial_socket_client/readme.md In this experiment, I use CC2640R2 as Server (Peripheral) and CC2650 as Client (Central) as the image below: Step1: import project spp_ble_client_cc2650lp (app and stack) for CC2650 Step2: modify Code of Service in file serial_port_service:               C0E0 ==> C0C0               C0E1 ==> C0C1               C0E2 ==> C0C2 If you don't change, Two Blue Tooth Board cant know to service each other. Step 3: import project simple_serial_socket_client_CC2640r2 for CC2640R2 here we using RealTerm...