进阶讨论Zigbee之外RF(射频模块)
来源:互联网 发布:sql创建数据库语句 编辑:程序博客网 时间:2024/06/16 03:30
RF
这是没有协议的RF,主要接触的是首发,帧控制等待功能。
RF内核包括:无线电控制状态模块(FSM)、调制器,解调器、帧过滤和源匹配、频率合成器(FS)、命令选通处理器,定时器2(MAC定时器):
这里有一个寄存器,读的时候是将接收的数据读取出来(RXFIFO),写的时候是写入要发出的数据(TXFIFO) 两个 FIFO都是128字节的。
RFD首个字节是接收到数据的总长度。
内置功能:
数据帧的结构:
同步头:
需要传输的数据
LEN(帧长度域):帧长度域用于确定要发送多少个字节。
MAC帧:MAC帧包括MHR(MAC帧头)和MAC负载两部分,是来自与MAC层的数据。
当发送了SFD,调制器开始从TXFIFO读数据,首先读帧长度域,然后是MHR(MAC帧头)和MAC负载。
帧尾
寄存器FRMCTRL0.AUTOCRC控制位控制帧尾域的帧校验序列自动产生,其中帧尾不写入TXFIFO中,存储在一个单独的16位寄存器中。
除了可能用于调试的目的,建议使能AUTOCRC。
如果FRMCTRL0.AUTOCRC=0,那么调制器期望在TXFIFO中找到FCS,所以软件必须产生FCS,连同MAC负载一起写到TXFIFO
信道:
IEEE802.15.4-2006 指定16 个通道,它们位于2.4GHz 频段之内。步长为5 MHz,编号为11~26。通道k的RF 频率为:
fc = [ 2405 + 5(k -11) ] MHz, k ∈ [11, 26]
开中断接收:
1.端口中断 IEN2 |=0x01;
2.总中断 EA=1;
3.控制位允许接收中断 RFIRQM0 |= (1<<6);
操作寄存器实现数据的发送接收。发送节点发送完数据LED1灯闪烁,接收节点接收完数据后LED1闪烁
#include <ioCC2530.h>#include "uart.h"#define LED1 P1_0 //定义P1_0口为LED1控制端#define LED2 P1_1 //定义P1_1口为LED2控制端#define RXstatic unsigned char rxbuf[128];static unsigned char len=0;void Delayms(int xms){ int i,j; for(i=xms;i>0;i--) for(j=587;j>0;j--);}void ledinit(){ P1SEL &=~(3<<0); P1DIR |= 3; }void rf_init(){ //发送初始化 TXFILTCFG |=0x09; //设置TX抗混叠以获得合适的带宽 AGCCTRL1 |=0x15; // 获得最佳的AGC目标值 FSCAL1 |=0x00; // 与默认比较,降低VCO泄露大约3DB,推荐默认获得最佳EVM //配置初始化 FRMCTRL0 |=(0x20|0x40); //自动确认 自动添加CRC校验码 FRMFILT0 &= ~(1<<0); //禁止帧过滤 //信道的选择 FREQCTRL |=0x0b; //选择11号通道? SHORT_ADDR0 = 0x05; //目标地址过滤期间使用的短地址 SHORT_ADDR1 = 0x00; PAN_ID0 = 0x22; //目标地址过滤期间使用的PANID PAN_ID1 = 0x00; //中断的打开 RFIRQM0 |=(1<<6); //接受到完整的一个帧使能接受中断 IEN2 |=(1<<0); //打开一个对应RF中断 EA=1; //打开总中断 //清除缓冲区里面的数据 RFST = 0xed; //清除RXFIFO缓冲区并复位解调器 RFST = 0xe3; //为RX使能并校准频率合成器}void TXRF(){ unsigned char i; char tx[]={"HEllo"}; RFIRQF1 =~(1<<1); //清除发送完一个帧的中断标志位 while (FSMSTAT1 & ((1<<1) | (1<<5))); //开启发送状态 RFIRQM0 &=~(1<<6); //禁止接受中断 IEN2 &= ~(1<<0); //禁止RF中断 RFST = 0xee; // 清除TXFIFO缓存 RFD = 6+2; // 发送的第一个字节是传输的帧长度 //2是CRC校验码 for(i=0;i<6;i++) //将mac的内容写到RFD中 { RFD = tx[i]; } RFST = 0xe9; //校准后使能TX while( RFIRQF1&(1<<1) == 0); //等待发送完成 RFIRQF1&=~(1<<1); //清除标志位 RFIRQM0 |= (1<<6); // 打开RX中断 IEN2 |= (1<<0); //打开RF中断 P1_0=~P1_0; Delayms(200);}#pragma vector=RF_VECTOR//接收中断处理__interrupt void rf_isr(void){ unsigned char i; EA=0; //关中断 if(RFIRQF0 &(1<<6)) //接受完成 { len = RFD; //第一个接受到的是字长 len = len &0x7f - 2; //0x7f 因为之后128字节,RCR校验码 for (i = 0; i < len; i++) { rxbuf[i] = RFD; } S1CON=0; //RFIF=0 清除RF中断标志 RFIRQF0 &=~(1<<6); //清除接受完成帧的中断 P1_0=~P1_0; Delayms(200); myprintf(rxbuf); } EA=1;}void main(void){ clockinit(); uartinit(); ledinit(); rf_init(); // EA=1; while(1) //发送或等待接收中断 { #ifndef RX //如果没有定义接收 TXRF(); Delayms(200); //延时 Delayms(200); # else //如果 myprintf(rxbuf); len=0; #endif }}
- 进阶讨论Zigbee之外RF(射频模块)
- 进阶讨论Zigbee之外设DMA
- 进阶讨论Zigbee之外设定时器
- STM32W108无线ZigBee射频模块
- 无线射频(RF)、基带(BB)
- STM32W108无线ZigBee射频模块复位模块原理
- 进阶讨论Zigbee之RF_ 802.15.4
- STM32W108无线射频模块802.15.4/ZigBee协议栈
- 射频信号RF
- RF-射频信号原理
- 射频(RF)PCB设计
- BlueTooth: RF射频通信
- RF射频通信
- RF choke射频扼流圈介绍
- STM32W108无线ZigBee射频芯片引脚说明(上篇)
- STM32W108无线ZigBee射频芯片引脚说明(下篇)
- 初步探讨Zigbee之外设IO(串口,备用位置)
- 最近在搞RF电路,觉得很有用——(转)射频电路板设计技巧
- Fragment的生命周期和返回栈
- 《React-Native系列》34、 ReactNative的那些坑
- c++thread学习(2) 线程之间通信的一种方式
- jQuery 表单验证插件,jQuery Validation Engine用法详解
- Comparable 和 Comparator 区别
- 进阶讨论Zigbee之外RF(射频模块)
- live555源代码分析
- $.ajax()方法详解
- spring-servlet.xml配置
- Flex 3 预览版目前已经上架 Cydia BigBoss 源
- linux清理内存空间
- 从使用到原理学习Java线程池
- 多媒体MPEG系列标准以及H.261,H.263标准详解
- kafka经典教程