嵌入式相关协议
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
浙公网安备 33010602011771号