tag 标签: stm32w

相关博文
  • 热度 9
    2013-6-29 15:57
    930 次阅读|
    0 个评论
    自从组网碰壁之后就是瓶颈了,今天6.29终于突破瓶颈了!!         ST_RadioReceiveIsrCallback函数是必须的,一开始没有把这个函数复制到主函数中,导致了没有把接收到的数据复制出来,所以一直组不了网。          首先是形成网络,当一个模块来到一个陌生的环境中时,形成自己的一个网络,步骤:     —初始化网络状态(清掉planet列表里的东西,PAN ID和node ID先设为ff,清掉发送数据队列)     —打开radio     —轮询11--26信道,得到每个信道里面的能量值,选取那个最大能量的信道,在ST的函数中,先设定某个信道,然后延时256ms稳定,之后读取能量值32次,取最大值     —确定信道,打印信道编号和该信道的能量值     —通过随机取值的到PAN ID,设置node ID为00,这里的随机取值有一个随机函数halCommonGetRandom(),是从电压值的到的,得到的数很随机就是了     —网络状态设为活动状态    这几个步骤之后,一个sun就建立起来了,接着就是让一个planet加入到这个sun网络中去,步骤:    —初始化网络状态(如sun)    —打开radio    —轮询11--26信道,在每个信道里面发送搜索sun命令,如果这个信道里面有sun,就会得到回复,事例如下         planet在进入网络命令中发送12 01 C8 EF FF FF FF FF FF FF E9 9F 15 00 02 E1 80 00 01(12表示数据量,有18个数据,01表示发送为数据,C8表示长源地址,短目标地址,搜索sun当然用ff短目标地址啦,EF为序列号,忽略,FF FF为PAN ID,一开始不知道,默认sunPAN ID为ff,FF FF FF FF为目标地址,发给sun,接下来的E9 9F 15 00 02 E1 80 00为源地址,就是该planet的地址,01表示搜索sun,其实还有两位校验码的,没有显示出来)         sun接收到搜索sun命令后,如果有空位留给planet回应:18 01 CC B0 FF FF E9 9F 15 00 02 E1 80 00 3C A7 AD CA 15 00 02 E1 80 00 02(有24个数据量,长源地址长目标地址,3C AF为sun回应plant sun的PAN ID 最后的02表示我这里有空位啦,可以给你进来)         planet得到sun许可之后,发送真实加入:16 61 CC F0 3C A7 AD CA 15 00 02 E1 80 00 E9 9F 15 00 02 E1 80 00 03(22个数据量,61表示长源地址长目标地址,在同个PAN中,3C A7就是PAN ID啦,之后就是两个地址,03表示加入网络)         sun接到planet的加入命令后,在table中安排一个短地址,并发送给planet:18 61 CC B1 3C A7 E9 9F 15 00 02 E1 80 00 AD CA 15 00 02 E1 80 00 04 01 00(这次,有24个数据量,长源地址长目标地址,3C AF为同个PAN ID,之后两个地址,04为承认planet进入 0100是sun安排给planet的短地址)    —如果完成了以上步骤,则planet加入sun成功!!
  • 热度 11
    2013-6-12 14:21
    1399 次阅读|
    0 个评论
      2013.6.12学习radio其他配置 函数ST_RadioSetCoordinator(TRUE)可以用来使能协调器特征,作为一个PAN里面的老大,协调器可以接受到那些节点发来的数据里面没有目标地址的数据,该节点发来的数据包的bits 为00,无地址模式,当然,这种无地址模式的数据也只有协调器能够收到。     /*AES加密*/   /* 一个指向128位密匙的指针 */ #define USER_KEY "chixinmu";   uint8_t key = USER_KEY;   uint8_t block ;           //加密的块        /* 设置AES密匙 */   ST_AesSetKey(key);    /* 对这128位的数据块加密,加密后还是放在原来的位置  */   ST_AesEncrypt(block); 加密好像很厉害的样子,可是解密呢?貌似都没有说。。。。。       /*MAC时钟*/   MAC时钟是一个20位寄存器的时钟,每个滴答有1us,复位一次的时间为1us*2^20约等于1s,在初始化radio的时候MAC时钟就开始跑了,可以通过一下函数取回MAC时钟值   uint32_t mac_timer;      ST_RadioInit(ST_RADIO_POWER_MODE_RX_ON);//初始化radio时MAC时钟就开始运转了   /* 读回MAC时钟值*/   mac_timer =ST_RadioGetMacTimer();      ST_RadioEnableMacTimerCompare(ENABLE);//使能比较MAC时钟值   ST_RadioSetMacTimerCompare(1000000);//设置比较的值        这里开启了MAC时钟比较的函数,可以设置一个值给MAC时钟比较,还有一个回调函数ST_RadioMacTimerCompareIsrCallback(),指的是不是当MAC时钟等于设定的值得时候就会调用回调函数,类似中断那样子的处理?回调函数是个什么东西呢?         /*检测radio能量级*/   int8_t energy_level;   /* 获取radio的能量级 */   energy_level  = ST_RadioEnergyDetection();//返回值在-97dbm到-25dbm之间      /*获取radio状态,繁忙或者空闲*/   boolean channel_status;   /* 获取当前信道的状态 */   channel_status = ST_RadioChannelIsClear();  
  • 热度 12
    2013-6-9 17:14
    1472 次阅读|
    1 个评论
      2013.6.9学习radio接收配置 接收所有在信道上的数据(可以用来做监视器?) ST_RadioEnableAddressFiltering(FALSE);//关闭地址过滤 ST_RadioEnableAutoAck(FALSE);         //关闭自动确认机制              根据自己的需要可以设置这两项 如果设置了地址过滤,则需要设置PAN ID和节点ID   uint16_t panid = USER_PAN_ID;   /* 设置PAN ID */   ST_RadioSetPanId(panid);      uint16_t nodeid = USER_NODE_ID;   /*设置节点短地址*/   ST_RadioSetNodeId(nodeid);    transmit.c文件中的boolean ST_RadioDataPendingShortIdIsrCallback(uint16_t shortId)和boolean ST_RadioDataPendingLongIdIsrCallback(uint8_t* longId)用于检测该长短地址是否还有未完的数据需要等待发送的,不过在transmit.c对长地址检测的函数描述This application does not use long IDs with indirect transmissions.好像是说这个函数不能直接使用长地址返回数据,其返回值也是FALSE。 现在看回来transmit.c是ST为例程所写的,相当于main函数的另一部分,不是标准库里面的函数,可以按照自己的需求,对其改写 transmit.c只是发送函数的配置,没有配置任何接收函数,所以在main.c中加入了接收函数的配置 void ST_RadioReceiveIsrCallback(uint8_t *packet,boolean ackFramePendingSet,uint32_t time,uint16_t errors,int8_t rssi) {   /* 在终端中运行*/   uint8_t i;  /* 复制buffer */   if(packetReceived == FALSE)    {     for(i=0; i=packet ; i++)      {       rxPacket = packet ;     }    packetReceived = TRUE;   } } 不过现在还不清楚中断中需要如何配置,好像都书本和pdf都没有说到中断的处理,再留意一下 在main函数中循环检测是否有接收到数据,接收到就打印出来     if(packetReceived == TRUE)     {       for(i=0; i=rxPacket ; i++) {printf(rxPacket );}     /* 处理完毕,释放标志*/     packetReceived = FALSE;     }
  • 热度 10
    2013-6-9 15:39
    2234 次阅读|
    0 个评论
    2013.6.8学习radio发送数据 uint8_t Packet[] = {    0x0f, // packet length including two bytes for the CRC    0x21, // FCF - data frame type, no security, no frame pending, ack request, no intra   PAN   0x08, // FCF - 16 bits short destination address, no source pan id and address   0x00, // sequence number    0x12, // destination pan id (lowest byte)   0x23, // destination pan id  (highest byte)   0x02, // destination short address/node id (lowest byte)   0x22, // destination short address/node id (highest byte)   0x12, // packet data   0x34, // packet data   0x56, // packet data   0x78, // packet data   0x9A, // packet data   0xBC  // packet data       };     发送数据的第一个字节表示接下来的数据长度,如果有硬件CRC,还要额外加多2字节 发送的数据要求有发送数据格式,按照MAC的帧格式来讲: |     2byte    |  1byte  |  0/2byte   | 0/2/8byte  | 0/2byte | 0/2/8byte|     变长     |2byte| | 帧控制域(FCF) | 序列号  | 目的PAN ID |  目的地址  | 源PAN ID |  源地址  |帧负载(data)|  FCS| |______________|__________________ 地址域 _______________________________|_____________|______| |__________________________ MHR _________________________________________|___ MAC负载__|__MFR_|   FCF的格式参照simple MAC library.pdf P12 教材中FCF设置成了0x0821,无加密,无挂起,有ACK请求,发送到另一个PAN,16位短目标地址,无源PAN ID和地址 注意FCF的高低位   CCA评估好像是用来检测该信道是否有噪声,足够传输数据,使用函数ST_RadioSetEdCcaThreshold (ed_cca_value);来设置检查的阈值,默认值-75dbm 数据发送出去之后,调用函数ST_RadioTransmitCompleteIsrCallback(StStatus status, uint32_t sfdSentTime, boolean framePending)来检查发送情况,该函数在transmit.c文件中,已经配置好了,status是返回的状态,sfdSentTime不知道是干嘛的,还要在检查下,boolean framePending是CFC中framePending位,表示是否还有额外的数据要发送 SFD是PHY格式中的一个字节:The SFD field (start-of-frame delimiter) is an 8-bit field indicating the end of the synchronization preamble and the start of the packet data. The SFD must be equal to 10100111b. 但还是不明白是干嘛用的,必须通过函数ST_RadioEnableSfdSentNotification(TRUE);开启SFD事件功能,ST_RadioSfdSentIsrCallback(uint32_t sfdSentTime)函数包含在transmit.c文件中,好像和中断有关。  
  • 热度 7
    2013-6-6 22:43
    1334 次阅读|
    0 个评论
          历程中用到很多assert函数,该函数包含于assert.h头文件中(IAR自带),用来检测条件是否成立,如果错误,终止程序运行 当温度等环境因素改变时,需要校准radio,可以周期性的检查是否需要校准radio,如果需要,则校准     if (ST_RadioCheckRadio() == TRUE)       {         ST_RadioCalibrateCurrentChannel();//校准radio       }               在802.15.4中,zigbee可用信道有16条,在ST的库中,可选范围为11--26,对应了16条信道,默认值为11,可以使用ST_RadioSetChannel(channel);配置 可以配置radio的发射功率,默认值为3dbm,设置范围在-43---8dbm之间,使用函数ST_RadioSetPower(int8_t power),int8是支持带符号的 配置发射模式,使用函数ST_RadioSetPowerMode(txPowerMode);其实在phy-library.h模式的值,可以选择ST_TX_POWER_MODE_DEFAULT,ST_TX_POWER_MODE_BOOST,ST_TX_POWER_MODE_ALTERNATE                                                           在发送和接收数据之前,必须配置下RadioTransmitConfig,按照默认值来就可以了,这个队列中,pdf相比教材多了minimumBackoff这个选项,应该是后来添加的,库文件中也有这一项