小钢炮CANNON
直播中

业未央

12年用户 89经验值
擅长:EDA/IC设计
私信 关注
[经验]

【CANNON试用体验】 点灯代码简单分析

        没有手册的指导,整个代码工程看起来真的是:费翔他弟弟—费劲、费翔他爹—费老劲,也可能是我的水平不够。想知道点灯的过程是具体怎么执行的,抠了很长时间,简略分析一下,分析过程可能有错误,请大家多指教,我以后有新的认识也会返回来修改。       只分析点灯代码的执行过程,不分析具体的任务调度是怎么执行的。
       21.png

         先从main.c的main函数开始:硬件的初始化、时钟配置,dispatch_init();任务调度的初始化,on_ready(); 设置NRG的蓝牙名字、地址、发射功率、广播间隔然后启动广播等待主设备的连接。
       while循环中:HCI_Process(); 主控制接口处理函数
22.png

       while(list_empty == FALSE) 如果NRG没有主设备连接进行的一些处理。

HCI_Event_CB(hciReadPacket->dataBuff);  控制接口事件的回调函数,对发生的主控制接口事件进行处理。list_insert_tail(&hciReadPktPool, (tListNode *)hciReadPacket); 对数据包链表的处理。

list_empty = list_is_empty(&hciReadPktRxQueue);  读链接队列,看是否有主设备连接。

if (readPacketListFull)  执行到这句的时候,NRG已经被主设备连接到了,并且NRG已经收到了主设备发过来的数据。

         readPacketListFull的置位是在void HCI_Isr(void)函数中,SPI的中断函数会调用该函数。

         void HCI_Isr(void)函数中先判断是否收到了数据,如果收到数据NRG是否有设备已经连接,如果已经连接到主设备了 readPacketListFull置位 告诉 HCI收到数据了在void HCI_Process(void);函数中处理即上边的if (readPacketListFull) 。读到数据的长度,调用HCI的事件回调函数HCI_Event_CB(buffer);处理发生的事件。

        HCI_Event_CB(buffer);的事件包括:断开事件、连接事件、主设备的请求回复等等一系列的事件,具体事件的功能我也不太清楚,有个手册什么的像ST那样的固件库手册就好了。

      点灯的具体过程综述如下:

      小钢炮各种硬件的初始化,NRG参数设置开始间隔pack scan等待主设备的呼叫,HCI_Process();处理各种事件,dispatch();进行任务调度。

      手机连接到小钢炮。

      手机发送数据到小钢炮。

      NRG的SPI进行中断,readPacketListFull置位。

      HCI_Process();进行事件处理,调用void ble_device_on_message(uint8_t type, uint16_t length, uint8_t* value);函数对接收的数据进行处理,即灯的亮灭。

     分析的过程肯定还有我认识上的错误,请大家多多指正一起进步,看代码的感觉就是有点找不着北。。。。

      


  




回帖(7)

零tot

2016-2-24 19:51:12
支持一下            
举报

lcmbeyond04

2016-3-1 11:35:12
很有用 谢谢~~~..........
举报

qian.yao

2016-3-1 13:07:48
感觉是不是有几张图片没有显示
举报

adamwu

2016-3-2 19:39:32
不错不错~~
感觉就是这个样子·~
哈哈
举报

更多回帖

发帖
×
20
完善资料,
赚取积分