昇润CC2640 SDK应用入门教程二

发布日期:2017.02.08     浏览次数:301

    通过上次的演示说明,相信大家对蓝牙的开发环境及CC2640  SDK开发套件已基本熟悉。那么,这次我们教大家如何使用昇润SDK工具实现简单的蓝牙控制,通过APP实现LED的开、关和闪烁。
首先上图,目标板:

如上图示,利用开发套件中的HY-264022V1 开发目标板:
1:接好JTAG调试电缆,请注意方向;
2:把LED D1的跳线帽接上,该LED是通过DIO_0来控制;
3:外部供电电源的负极接上;
4:外部供电电源的1.8V-3.6V电源正极接上;
注:HY-264022V1的原理图在安装好的SDK的说明文档中,如下图所示:

连接上TTC XDS110也就是HY-129400:

打开IAR ARM 7.7 ,再打开程SDK的从机工程:

打开工程后,还是先编译蓝牙协议栈,并下载OK!再选择应用的工程1,打开我们将要改写的TTCBlePeripheralTask.c 2

改写之前,我们先验证手机与蓝牙模块之前能进行正常的数据传输:先编译蓝牙应用程序、将程式下载至目标板、全速运行,或是取掉调试器,断开外接电源,重新上电,我们回顾一下上次的蓝牙联线过程,并验证数发送接收,SDK刚安装好后,原始默认是接收到任何数据,均返回;
首先打开APP:

扫描,并选择要连线的设备;    提示联接设备;

连线成功后,我们在APP中选择:数传,发送1234567890,此时可经看到RX也会显示1234567890,证实发任何数据,模块会将数据回传回来!
刚才打开的文件中的函数如下:

如果把这条屏蔽掉,就不会回传数据,可以测试看看:

通过修正以下这二个参数,我们可以来控制蓝牙的联线间隔,参数与计算方式大家可以参考注释:

DEFAULT_DESIRED_MIN_CONN_INTERVAL   
最小连接间隔(单位为 1.25ms, 例如 80 = 100ms),该参数在蓝牙参数更新使能的情况下生效
DEFAULT_DESIRED_MAX_CONN_INTERVAL   
最大连接间隔(单位为 1.25ms, 例如 800 = 1000ms),该参数在蓝牙参数更新使能的情况下生效
连接间隔最大值与最小值之间的差值,依苹果手机的规定,必须大于21,苹果一般情况下均是选择最大值;因此现在的联线间隔是:80x1.25 = 100ms;SDK默认关闭软件加密,因此每次最大通讯长度是20字节;
为什么将这二个参数更新就会有效呢?大家可以看一下这里:

工程在蓝牙初始化时就是.updateParEnable    = TRUE, “参数更新使能”
经过上面的验证,我们开始来打开GPIO,通过接收数据来控制IO的状态,我们先找到项目的可选项:

再打开可选项:

1、先选择c++ compiler编译选项;
2、再先择preprocessor预处理设置;
3、找到SDK写好的GPIO宏定议开关项

4:我们打开GPIO的宏定议;
5:确认OK
我们再编译一下:

确定SDK打开GPIO后,编译正确。
找到设备的初始设定点:

进去找到GPIO的初始化部分:

进入这个函数所在的文档TTCDriverGPIODemo.c 1步,将下面的全部屏蔽掉2步:

PIN_Config ioTestConfig[] = {
  IOID_0 | PIN_GPIO_OUTPUT_EN | PIN_INPUT_DIS | PIN_GPIO_HIGH,
  PIN_TERMINATE
};
在IO配置中将,IOID_0配置为输出态,并输出为高电平,即关闭LED;原理如下:

利用SDK GPIO演示代码,我们修改一下:
 
/******************************************************************************
【函    数】  TTCDriverDemoIOInit(keysPressedCB_t appKeyCB)
【概    述】  TTCDriver驱动初始化
【入口参数】  appKeyCB
【返回参数】  无
【说    明】  本函数配置IOID_0为输出口
******************************************************************************/
void TTCDriverDemoIOInit(keysPressedCB_t appKeyCB){
    TTCBleSDKManagerInfo_t err;  
    err = TTCDriverIOOpen(&ioTestHandle,&ioTestState,(const PIN_Config *)ioTestConfig);
if(err != MANAGER_INFO_REQUEST_IO_SUCCESS){
      asm("nop");  
      return;
    }
}
/******************************************************************************
【函    数】  KeyPressHandler(uint8_t keys)
【概    述】  用户的按键处理函数
【入口参数】  按键码
【返回参数】  无
【说    明】  无
******************************************************************************/
void KeyPressHandler(u8 keys){  
    if(keys & 0x01){   //取反IOID_0脚的状态
     TTCDriverIOSetOutputVaule(&ioTestHandle,IOID_0,!TTCDriverIOGetOutputValue(IOID_0)); 
    }
}
在从机线程文件中,我们把GPIO的初设定改一下:

再打开一个事件:

要把这个变量放出来,测试一下:

在线程处理函数中,增加用户事件:


然后在数据接收外理函数中,增加使能用户事件:

这样我们每发送一次数据,就可以将GPIO_0取反一次;

在APP中,将设定好数据发送间隔,并使能定时发送,这时LED就按可以闪烁啦!
如果在接收数据那里将接收到的数据进解析,那么就可以防止别人操作啦!