通过上次的演示说明,相信大家对蓝牙的开发环境及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就按可以闪烁啦!
如果在接收数据那里将接收到的数据进解析,那么就可以防止别人操作啦!
|