EZRADIOPRO™编程指南CoolborXie翻译自AN4151、概述本文档通过几个简单的软件示例,介绍了如何配置EZRadioPRO射频发射器、接收器和收发器操作。本指南包括以下操作示例:z如何使用EZRadioPRO发射器或收发器在FIFO模式下进行数据包发射;z如何使用EZRadioPRO接收器或收发器在FIFO模式下进行数据包接收;z如何使用EZRadioPRO收发器进行双向基本通信;z如何使用FIFO发射和接收超过64字节的数据包。最后一个示例程序源代码可以SiliconLabs网站下载:,或在与评估板工具包一起送出的WDS光盘上找到。2、硬件选项提供两个EZRadioPRO收发器芯片的源代码:Si4431-A0版和Si4432-V2版。这两个器件之间有几点区别:zSi4432-V2要求对一些寄存器进行编程为不同于其默认的值。而Si4431-A0则无此需要。zSi4431-A0有一个单独的寄存器用于自动频率调整(Auto-FrequencyCalibration)限制;而Si4432-V2则使用频率偏差(FrequencyDeviation)寄存器。zSi4431和Si4432的调制解调器的参数不同。z无效引导码超时的定义不同。为Si4431和Si4432所提供的源代码例程分别使用不同的高亮。Si4431和Si4432器件以后的版本将共享Si4431-A0相同的寄存器设置。注意:由于本文档只介绍了Si4431-A0和Si4432-V2器件,但发射或接收软件支持EZRadioPRO单独的发射器和接收器:zSi4431-A0发射例程代码无需任何修改即可支持Si4031-A0。代码也可应用于Si4430-A0或Si4030-A0,但中心频率必须设置为相应的值。zSi4432-V2发射示例代码无需任何修改即可支持Si4032-V2。zSi4431接收示例代码无需任何修改即可支持Si4330-A0。平台上每个示例都提供了一个单独的SiliconLabsIDE工作区。SiliconLabsIDE文件名代表了所给代码是为以下哪个平台所写的:z含有“SDBC_DK3”的工作区文件名是为软件开发板(SoftwareDevelopmentboard)写的z含有“EZLINK”的工作区文件名是为EZLink平台写的。2.1天线选项在EZRadioPRO器件内部,功放和LNA并没有连接。在使用Si4431收发器的时候,TX和RX引脚可以直接连接在一起,而无需RF开关。在使用Si4432最高输出功率设置时,发射和接收引脚通过一个SPDT(单刀双掷)RF开关分别连接到天线。EZRadioPRO器件能进行RF开关控制。通过将RXState和TXState信号送到任意两个GPIO,即可自动控制RF开关。根据工作的模式,GPIO控制RF开关自动将天线连接到接收通道或发射通道。如果芯片未处于激活模式,GPIO将禁止RF开关。在单天线测试卡和EZLinkSIL模块上,使用了相同的RF开关配置:TXState信号送到GPIO1,RXState信号送到GPIO2。EZRadioPRO一个关键的优点在于内置天线分集支持:连接两个不同极化的天线。在数据包接收的开头,芯片对两个天线的接收信号强度进行评估,并使用较强的一个来接收数据包的剩余部分。通过选择信号最强的天线,可以在多路径衰减和天线极化的影响存在的情况下大大提高接收器的性能。在使用这个特性的时候,需要有一个RF开关将天线连接到接收或发射路径。EZRadioPRO器件通过任意两个GPIO来自动控制RF开关。将用于天线分集信号的天线1开关和用于天线分集信号的天线2开关送到GPIO,射频就会在接收模式下自动在两个天线之间切换。用于RX数据包接收的天线随后将用于TX数据包的发射。在天线分集测试卡(AntennaDiversityTestcard)上,GPIO1连接到用于天线分集信号的天线1开关,而GPIO2连接到用于天线分集信号的天线2开关,来控制RF开关的。图1.单天线Si4432测试卡原理图图2.天线分集Si4432测试卡原理图用于软件开发(SoftwareDevelopment)板的示例源代码可以编译后用于各种测试卡。以下编译选项,位于main_sdbc_dk3.c文件的开头,用于选择不同测试卡的正确配置。zTX/RXSplit#defineSEPARATE_RX_TXzSingleAntenna#defineONE_SMA_WITH_RF_SWITCHzAntennaDiversity#defineANTENNA_DIVERSITY在EZLink平台的源代码中没有编译选项,因为这是一个固定的硬件配置。从射频功能的角度来看,相当于一个单天线测试卡。注意:EZRadioPRO器件的发射输出必须在输出功率被允许之前终止,通过使用适当的天线或将功率放大器连接到提供50Ω终端的RF仪器,可以确保正确的操作并保护器件不被损坏。2.2.初始化MCU软件示例使用了最少的控制器上可用的硬件外围设备来简化源代码的复杂性。提供以下硬件支持:z使用按键来启动数据包发射。z通过一个LED来指示数据包发射与接收。zEZRadioPRO器件通过SPI连接到MCU,同时nIRQ引脚连接到MCU的外部中断。EZRadioPRO器件与MCU之间的SPI和nIRQ连接在两个硬件平台上是相同的,但在使用外围设备方面有一些区别:z在两个平台上,示例代码只使用按键和LED;但是,软件开发(SoftwareDevelopment)板有4个LED和4个按键,而EZLink分别只有一个。在两个平台上LED和按键的IO引脚是不同的。z在EZLink平台上,PWRDN引脚被连接到MCU,所以MCU可以用它来控制器件。而该连接在软件开发(SoftwareDevelopment)板上是不可用的,PWRDN引脚被连接到GND。2.2.1.软件开发板(SoftwareDevelopmentBoard)的初始化在源代码中包含了与MCU有关的头文件,以提供一些宏定义以便代码可以使用几个常用的C编译器(Keil、SDCC、IAR等)来编译。/*========================================================**INCLUDE**========================================================*/#includeC8051F930_defs.h#includecompiler_defs.h/*================================================================**C8051F930PindefinitionsforSoftwareDevelopmentBoard**(usingcompiler_def.hmacros)**================================================================*/以下宏为给定的IO端口指定了一个标签,这样在源代码中可以很容易地引用这些端口。例如:第一行为Port1.3指定“NSS”标签,该nSEL引脚被连接到该端口:SBIT(NSS,SFR_P1,3);SBIT(NIRQ,SFR_P0,6);SBIT(PB1,SFR_P0,0);SBIT(PB2,SFR_P0,1);SBIT(PB3,SFR_P2,0);SBIT(PB4,SFR_P2,1);SBIT(LED1,SFR_P1,4);SBIT(LED2,SFR_P1,5);SBIT(LED3,SFR_P1,6);SBIT(LED4,SFR_P1,7);以下定义用于配置插在软件开发(SoftwareDevelopment)板上的测试卡的类型://Oneoutofthesedefinitionshastobeuncommentedwhichtellstothecompilerwhatkind//ofTestcardispluggedintotheSoftwareDevelopmentboard#defineSEPARATE_RX_TX//#defineANTENNA_DIVERSITY//#defineONE_SMA_WITH_RF_SWITCH有几个函数原型用于MCU初始化和SPI函数。/*========================================================**FunctionPROTOTYPES**========================================================*///MCUinitializationvoidMCU_Init(void);//SPIfunctionsvoidSpiWriteRegister(U8,U8);U8SpiReadRegister(U8);voidMCU_Init(void)函数对软件开发(SoftwareDevelopment)板上的所有必要的外围设备进行初始化:voidMCU_Init(void){//DisabletheWatchDogtimeroftheMCUPCA0MD&=~0x40;//SettheclocksourceoftheMCU:10MHz,usingtheinternalRCosc.CLKSEL=0x14;//InitializetheIOportsandthecrossbarP0SKIP|=0xCF;//skipP0.0-3&0.6-7XBR1|=0x40;//EnableSPI1(3wiremode)P1MDOUT|=0x01;//EnableSCKpushpullP1MDOUT|=0x04;//EnableMOSIpushpullP1SKIP|=0x08;//skipNSSP1MDOUT|=0x08;//EnableNSSpushpullP1SKIP|=0xF0;//skipLEDsP1MDOUT|=0xF0;//EnableLEDSpushpullP2SKIP|=0x03;//skipPB3&4SFRPAGE=CONFIG_PAGE;P1DRV=0xFD;//MOSI,SCK,NSS,LEDshighcurrentmodeSFRPAGE=LEGACY_PAGE;XBR2|=0x40;//enableCrossbar//FortheSPIcommunicationthehardwareperipheraloftheMCUisused//in3wiresSingleMasterMode.Theselectpinoftheradioiscontrolled//fromsoftwareSPI1CFG=0x40;//MasterSPI,CKPHA=0,CKPOL=0SPI1CN=0x00;//3-wireSingleMaster,SPIenabledSPI1CKR=0x00;SPI1EN=1;//EnableSPIinterruptNSS=1;//TurnofftheLEDsLED1=0;LED2=0;LED3=0;LED4=0;}voidSpiWriteRegister(U8reg,U8value)函数将一个新的值写入器件的寄存器。如果只写一个寄存器,则必须写入一个16位的值:一个为寄存器的8位地址,后面跟一个8位的寄存器值。要写寄存器,地址的最高位必须为1,以指示为写操作。voidSpiWriteRegister(U8reg,U8value){//SendSPIdatausingdoublebufferedwrite//SelecttheradiobypullingthenSELpintolowNSS=0;//writetheaddressoftheregisterintotheSPIbufferoftheMCU//(imp