嵌入式相关协议

Zigbee通信:

      基本概述:协调器先创建处网络(PANID 可以进行指定,如果是0xFFFF则链接信号最强的设备)

                        子节点通过给定的PANID加入网络,加入网络后通过短地址进行通信

     1. 协议栈:

                Zigbee协议定义了PHY(物理层)和MAC(介质访问层) 

                Zigbee联盟定义了网络层NWK(网络层)、 APS(应用程序支持层)、APL(应用层)

                Zigbee协议栈就是将各个层定义的协议都集合在一起,以函数的形式实现,

                并给用户提供API(应用层),用户可以直接调用

    2.对协议栈的理解

                协议栈是协议的实现,是一些供应用调用的接口,每个厂家的协议栈是有区别的

                比如TI的BLE协议栈和nordic的BLE协议栈有很大的不同(安卓上的BLE结构更像TI的BLE)

   3.Zigbee协议栈的使用

               一般步骤:

                   (1)组网 :调用协议栈组网函数、加入网络函数,实现网络的建立和节点的加入

                   (2)  发送:发送节点调用协议栈的发送函数,实现数据无线发送 

                   (3)  接收:接收节点调用协议栈的无线接收函数,实现数据无线接收

  4.TI厂商Zigbee

              (1)打开实例,选择CoordinalorEB重新编译所有烧写到板子中,再切换到EndDeviceEB编译所有烧写到板子中

              (2)用户任务代码在Zstack中的调用过程:

                          1)main() 执行(在ZMain.c中)

                                   main-->osal_init_system()

                          2)  osal_init_sysem()调用osalInitTasks() (在OSAL.c中)

                                   osal_Init_system()-->osalInitTasks()

                         3)  osalInitTasks()调用SampleApp_Init(), (在OSAL_SampleApp.c中)

                                   osalInitTasks()-->SampleApp_Init() (在最后用户需要自己添加的任务)

            (3)任务处理

                      1)一个任务会对应多个事件发生,一个任务对应一个事件处理函数,

                           这个函数中根据不同的事件,处理不同的分支工作。

                      2)如:SampleApp_ProcessEvent()这个处理函数对应的是用户实现的任务, 

                                   函数内部实现了用户任务的不同事件。

                     3)每个任务处理函数需要在const pTaskEventHandlerFn taskArr[]={ ... } 中进行添加

                          实例中将SampleApp_ProcessEvent()函数添加进了这个数组中

                    4)tasksEvents和taskArr[]里的顺序要一一对应

           (4)事件处理

                   1)osal_start_system():决定了当某个事件发生后调用对应的事件处理函数

             (5)添加一个新的任务

                    1)修改osalInitTasks() :

          void osalInitTasks()

                                    {

                                                        ...

                                           OuhsApp_Init(taskID++);

                                           PhotoApp_Init(taskID);

                                   }

                    2)   修改taskArr[]

                                  const pTaskEventHandlerFn tasksArr[]={

                                           OuhsApp_ProcessEvent

                                           PhotoApp_ProcessEvent

                                  };

                   3) 添加_Init()和_ProcessEvent()

                           void PhotoApp_Init(uint8 task_id)

                           {

                                  photoApp_TaskID=task_id;

                                  photoInit();

                                  RegisterForPhoto(PhotoApp_TaskID);

                           }

                    4) uint16 photoApp_ProcessEvent(uint8 task_id uint16 events)

                         {

                                afIncomingMAGPacket_t  *MSGpkt;

                                if(event &SYS_EVENT_MSG)

                                {

                                     MSGpkt = (afncomingMSGPacket_t *)osal_msg_receive(photoApp_TaskID);

                                     while(MSGpkt)

                                     {

                                          switch(MSGpkt->hdr.event)

                                          {

                                                case PHOTO_CHANGE:

                                                    HalLedblink(HAL_LED_1 3 30 300);

                                                    break;

                                          }

                                          osal_msg_deallocate((uint8 *)MSGpkt);

                                     }

                                    ...

                                }                               

                         }

          (6)发送函数AF_DataRequest:

                    1)例子中的 SampleApp_SendFlashMessage函数通调用 AF_Dataquest函数实现数据发送

                    2)参数1

                          typedef struct{

                            union{

                             uint16 shortAdd;

                           }addr;

                          afAddrMode_t addrMode; //枚举类型的模式参数

                          byte endPoint;//指定的端点号1-240之间                         

                         }afAddrType_t;

                        typedef enum{

                         afAddrNotPresent = AddrNotPresent,//按照绑定表进行传输

                        afAddr16Bit = Addr16Bit, //按照目标网络地址进行单播传输

                        afAddrGrop = AddrGrop, //组播传输

                        afAddrBoadcast = AddrBroadcast //广播传输

                       }afAddrMode_t;

                     enum{

                        AddrNotPresent=0,

                        AddrGrop=1,

                        Addr16Bit=2,

                       Addr64Bit = 3,

                      AddrBroadcast=15

                     };

                 3)参数2

                        typedef struct{

                             byte endPoint;//端点号

                             byte *task_id; //任务id

                             SimpleDescriptionFormat_t *simpleDesc; //设备的简单描述

                             afNetworkLatencyReq_t latencyReq;//枚举结构

                        }          

BLE通信:

    1.BLE外围设备进行间隔发送广播,所有主设备进行扫描,某一个主设备发起链接。

    2.链接进行建立后通过UUID进行数据的收发。

 

USART:

     1.数据包:数据包的内容由:起始位、主体数据、校验位、停止位组成

     2.波特率:异步通信没有时钟信号,需要约定好波特率

 

SPI通信:

    1.数据传输:

              SPI在上升沿/下降沿的时候通过SDO发送一位数据

              SPI在下降沿/上升沿的时候通过SDI接收一位数据

    2.软件模拟SPI:

             读操作:

                    sdo发送1位起始位  2位操作码(读/写) 6位被读取的数据地址

                    sdi读取1位空位 之后读取16位数据

             写操作:

                     sdo发送1位起始位,2位操作码,6位被写的数据地址,sdo写16位数据        

 

I2C通信:

      1.数据传输:SCL为高电平时,SDA由高变低,开始数据传输。由低变高则停止传输

      2.读写操作: 

               起始位开启传输,发送7bit从设备地址,1个读写bit,等待ACK

               发送8bit寄存器地址,等待ACK,如果为写则给寄存器写8位数据,如果为读,则读取8位寄存器数据

PWM模式:

       1.定时器可产生独立的信号

       2.频率和占空比可以进行如下设置

                 i. 一个自动重载寄存器用于设定PWM的周期

                ii. 每个PWM通道有一个捕获比较寄存器用于设定占空比

       3.PWM模式的设置

                 i.边沿对齐模式 

                ii.中心对齐模式

计数器模式

        1. 定时器的三种计数模式

                   向上计数

                   向下计数

                   向上向下双向计数

        2. 计数器事件的发生

                   i. 向上计数模式事件:

                              计数器从0计数到自动装载值,然后重新从0开始计数,且产生一个溢出事件

                 ii. 向下计数模式事件:

                              计数器从自动装入的值开始向下计数到0,然后从自动装载值重新开始计数,且产生一个自动装载溢出事件

                iii. 向上向下双向模式事件:

                             计数器从0开始计数,到达自动装载的值-1,产生一个溢出事件,然后向下计数,产生一个向下溢出事件

ADC:

      1.ADC引脚:4个电源引脚 0~15个中断模拟输入信号引脚

      2.模拟多路选择开关:模拟多路开关可以在ADC多路通道中,切换到不同的输入通道进行转换

      3.转换分组:转换模式分为规则转换组和注入转换组

      4.转换方式:

                  i.单通道的单次转换:ADC只执行一次转换,一旦选择通道转换完成,则产生中断

                ii. 单通道的连续转换:当前面的ADC转换结束,马上启动下一次转换,每次转换产生一个中断

               iii. 扫描(多通道)的单次转换:在每组的每个通道上执行单次转换,在每个转换结束时,同一组的下一个通道自动转换,

                                                             一组通道转换结束不再进行转换

               iv: 扫描(多通道)的连续转换:在一组通道转换结束后,从头开始从第一个通道开始自动转换

     5.数据对齐:因为ADC属于12位逐次逼近的数字转换器,数据保存在16位寄存器中,所以要选择对齐方式

                          对齐方式分为左对齐和右对齐。

     6.采样时间:采样时间最小位1us

 

 

 

 

 

          

 

posted @ 2020-02-29 19:19  wgf123  阅读(371)  评论(0)    收藏  举报