您的位置:笔笔发 技术资料 常用无线电 正文
内容搜索
笔笔发:技术产业信息平台----成就有识之士创业梦想的殿堂
热门内容
推荐内容
手机RF开发心得总结-驱动开发篇SW驱动


6. RF Driver development

       前面讲的是手机RF的硬件开发,一旦设计定型,基本就不会在改变,而且一般芯片厂家也会提供demo电路共参考,硬件调试也相对比较简单,都是些经验总结。按照经验积累来做,会觉得越来越简单。但是手机RF的驱动程序开发,估计国内没有几个公司做过,因为它涉及的部分包括基带芯片物理层的实现,协议栈,校准机制和系统整体集成。能做到这些的只能是做基带芯片且有能力开发维护协议栈的公司,这样的公司在国内还没有几家。闲话少说了。

手机RF包括三个componentsTransceiver射频收发器,PA功率放大器和Switch射频开关。对应着,手机RF驱动也分成3个部分:Transceiver驱动,PA驱动和Switch驱动。由易到难的开发程度排列是:Switch驱动,PA驱动,Transceiver驱动。

RF驱动的接口是由基带芯片PALPhysical Abstraction Layerthe interface between L1 and driverwhich is used to manage driver)定义的,因为在逻辑上,RF驱动是由PAL直接调用的,PAL实现的就是GSM物理层功能,如FCCHSCHBCHTCH等物理信道的实现等等。所以PAL根据自己的需要,调用RF驱动来实现物理信道功能。这些信道大类划分就是RX信道和TX信道,对应RF驱动,就是分成TX功能和RX功能,所以RF驱动就是用PAL传入的频段,信道,功率,增益等参数,正确配置内部寄存器和控制管脚,实现对应的频段,频率,功率的发射和接收。

       RF驱动开发过程可以分成4个步骤,如下图。每个步骤都需要测试通过,作为进行下一个步骤的充分条件。


image035 

    这里准备从最简单的Switch驱动开始讲解,逐渐深入,解析RF驱动的实现过程。其中设计到的PAL的知识,校准机制等都是可以独立成章的知识,会在单独的章节中做细致的解析,让你深刻了解GSM底层实现机制。

6.1 RF Switch驱动

1. 控制逻辑介绍

RF Switch驱动其实就是一个简单的逻辑控制,需要在哪个频段,是进行TX还是RX就相应的把基带连接到Switch的控制管脚置到SW文档里要求的逻辑位置,用下图举例来说明。

SANYOSWASWMF46KAAACT,芯片管脚如下图所示。

image037.gif 

图中,芯片的控制管脚是VC1VC2这两个管脚是基带射频控制管脚连接的,一般控制RF的都称为TCO,它是由TCU单元来进行控制。TCO,就是Time Control OutputTCU就是Time Control Unit。它和普通GPOGeneral Purpose Output)的区别是,它是实时控制的,可以用精确的时间来控制什么时候输出。单位是QB,就是quarter bit/symbol。详细介绍请参考:手机RF开发心得总结-RF控制管脚介绍之TCU篇。

VC1VC2的控制逻辑关系,可从SW的手册上得到,如下所示。

image039.gif 

 

00.1V,代表逻辑‘02.43V代表逻辑‘1。所以SW驱动中的控制逻辑如下:

CLR_TCO代表管脚输出为‘0SET_TCO代表管脚输出为‘1

    // GSM850 RX

    g_TxRxSwTcuVal[0][0].sw1 = CLR_TCO(SW->VC1);

    g_TxRxSwTcuVal[0][0].sw2 = CLR_TCO(SW->VC2);

    // GSM850 TX

    g_TxRxSwTcuVal[0][1].sw1 = SET_TCO(SW->VC1);

    g_TxRxSwTcuVal[0][1].sw2 = CLR_TCO(SW->VC2);

    // GSM900 RX

    g_TxRxSwTcuVal[1][0].sw1 = CLR_TCO(SW->VC1);

    g_TxRxSwTcuVal[1][0].sw2 = CLR_TCO(SW->VC2);

    // GSM900 TX

    g_TxRxSwTcuVal[1][1].sw1 = SET_TCO(SW->VC1);

    g_TxRxSwTcuVal[1][1].sw2 = CLR_TCO(SW->VC2);

    // DCS RX

    g_TxRxSwTcuVal[2][0].sw1 = CLR_TCO(SW->VC1);

    g_TxRxSwTcuVal[2][0].sw2 = CLR_TCO(SW->VC2);

    // DCS TX

    g_TxRxSwTcuVal[2][1].sw1 = CLR_TCO(SW->VC1);

    g_TxRxSwTcuVal[2][1].sw2 = SET_TCO(SW->VC2);

    // PCS RX

    g_TxRxSwTcuVal[3][0].sw1 = CLR_TCO(SW->VC1);

    g_TxRxSwTcuVal[3][0].sw2 = CLR_TCO(SW->VC2);

    // PCS TX

    g_TxRxSwTcuVal[3][1].sw1 = CLR_TCO(SW->VC1);

    g_TxRxSwTcuVal[3][1].sw2 = SET_TCO(SW->VC2);

用一个简单的2维数组就可以将SW不同频段TX/RX的控制逻辑描述清楚了。下面来介绍一下SW相关的函数,你可以根据你开发系统物理层的需要来做适当修改。函数接口是不唯一的,但是内部实现确是根据SW手册上要求逻辑实现的,可以说是唯一的。

有些SW的控制管脚可能是3个,没有关系,一样可以用一个结构体数组将控制逻辑的真值表表达出来。

2. RF SW API介绍

一般射频驱动根据作用域,分成异步功能函数和同步功能函数两种。可以这样理解:异步功能函数就是初始化,sleep/wakeup等逻辑控制,只是根据当前手机自身状态来使用。如手机上电初始化时,需要初始化射频器件;待机操作时,需要暂时关闭射频器件等,不需要根据GSM网络当前状态控制射频的函数。同步功能函数就是需要根据GSM网络当前状态控制射频处于接收或者发送状态的函数。如:当初始化完毕时,需要搜索GSM网络,这时候就需要打开射频RX功能,搜索FCCHSCHBCH,和基站进行同步,这些都是以frame形式控制的,需要根据接收并判决的网络信息,找到和网络同步的时间点,并以这个时间点为参考,进行随后的同步控制。

在下面的函数中,以Asynchronous代表异步功能函数,Synchronous代表同步功能函数。

先介绍一下涉及的结构定义:

//----------------------------------------------------------------------

typedef struct

{

    UINT8  SW1;

    UINT8  SW2;

    UINT8  SW3;

}SW_CONFIG_T;

SW连接到基带的控制管脚,最多就3个。

typedef enum {

    RFD_DIR_RX, ///< Rx Window

    RFD_DIR_TX, ///< Tx Window

    RFD_DIR_RX_DOWN, ///< End of Rx Window

    RFD_DIR_TX_DOWN, ///< End of Tx Window

    RFD_DIR_QTY

} RFD_RFDIR_T;

typedef enum {

  GSM_BAND_GSM850 = 0,

  GSM_BAND_GSM900 = 1,

  GSM_BAND_DCS1800 = 2,

  GSM_BAND_PCS1900 = 3,

  GSM_BAND_QTY

} GSM_RFBAND_T;

//----------------------------------------------------------------------

void rfd_SwOpen(CONST SW_CONFIG_T* swConfig);

// Function   : rfd_SwOpen

//----------------------------------------------------------------------

// Description:

///   Asynchronous.\n

///   手机PAL初始化时调用,根据原理图中对SW的控制管脚情况,初始化上面所说的控制逻辑真值表。对应函数为rfd_SwClose

///   It must perform any initialization/setup needed for the Switch to be functional.

//==================================================================

void rfd_SwClose(void);

// Function   : rfd_SwClose

//----------------------------------------------------------------------

// Description:

///   Asynchronous.\n

///   This function is called before switching off the Switch.

///   To re-enable the Switch a call to #rfd_SwOpen will be issued.

//==================================================================

void rfd_SwWakeUp(void);

// Function   : rfd_SwWakeUp

//----------------------------------------------------------------------

// Description:

///   Asynchronous.\n

///   This function is called when going out of Low-Power mode

///   (see #rfd_SwSleep). \n

///   It must bring back the Switch in its Idle state.

//==================================================================

void rfd_SwSleep(RFD_LP_MODE_T lp_mode);

// Function   : rfd_SwSleep

//----------------------------------------------------------------------

// Description:

///   Asynchronous.\n

///   This function is called before going to LowPower mode.

///   The Switch must go in a the Low-power state correponding to the

///   asked mode (if applicable). \n

///

///@param lp_mode : targeted Low Power mode

//==================================================================

void rfd_SwSetPosition (RFD_RFDIR_T direction, GSM_RFBAND_T band, INT16 date);

// Function   : rfd_SwSetPosition

//----------------------------------------------------------------------

// Description:

///   Synchronous.\n

///   根据网络当前状态设置SW为正确的开关状态。

///   and Band parameters.

///

///@param direction : Rx / Tx selectionRXTX

///@param band      : band selectionGSM850GSM900DCSPCS

///@param date      : start time (in Qb) of the window, corresponds to

///          the beginning of the first sent (for Tx) or received (for

///          Rx) bit of the usefull part of the burst.

///          This time doesn't include any offset specific to the Rf

///          Switch.

//==================================================================

rfd_SwSetPosition解析

VOID rfd_SwSetPosition (RFD_RFDIR_T direction, GSM_RFBAND_T band, INT16 date)

{

因为是同步控制,所以date代表网络要求打开SW的时间(SW只是被动器件,具体什么时候打开,由基带物理层根据GSM物理层协议控制。)SW_TIME_TX_SWITCH_UP这类宏定义的时间是相对时间,参考时间点是网络要求打开SW的时间。这个宏定义时间一般都是负数,因为任何控制管脚的有效输出都需要一个建立时间,所以输出宏定义就是管脚到有效输出的建立时间。而且这个时间还需要实际调试时进行适当修改。

如先期在8960上调试TX时,如发现PVT的轮廓没有在框内的合适位置,则需要调整TX_UP或者TX_DOWN的时间来调整。

if (direction == RFD_DIR_TX)

    {

        date += SW_TIME_TX_SWITCH_UP;

    }

    else if (direction == RFD_DIR_TX_DOWN)

    {

        // Switch to RX to provide isolation (needed for ETSI specs)

        date += SW_TIME_TX_SWITCH_DN;

        direction = RFD_DIR_RX; // 如果影响GPRS,则不需要改变direction,保持TX

    }

    else if (direction == RFD_DIR_RX_DOWN)

    {

        // Nothing to do for Rx Down

        return;

    }

    else // RFD_DIR_RX

    {

        date += SW_TIME_RX_SWITCH_UP;

    }

这里开始真正的控制输出,首先判断上次SW的控制管脚状态,如果和当前控制相同,则不需要变换管脚输入状态。

    // Optimized way : program only switch changes

    if (g_SwTcuCfg.sw1 != g_TxRxSwTcuVal[band][direction].sw1)

    {

        g_SwTcuCfg.sw1 = g_TxRxSwTcuVal[band][direction].sw1;

        TcuSetEvent (g_SwTcuCfg.sw1, date);

    }

    if (g_SwTcuCfg.sw2 != g_TxRxSwTcuVal[band][direction].sw2)

    {

        g_SwTcuCfg.sw2 = g_TxRxSwTcuVal[band][direction].sw2;

        TcuSetEvent (g_SwTcuCfg.sw2, date);

    }

}

 

以上就是SW基本的控制逻辑,其实还是需要仔细阅读SW手册,里面包含很多信息。如TX /RX Insertion Loss(需要测试时做补偿)TX Isolation最重要。TX Isolation:前端隔离度,防止TX辐射到RX,影响RX性能,这就是问什么TX_DOWN后,需要把DIR置为RX方式,就是为了防止SWTX辐射到RX。)需要注意的是,做GPRS时,因为需要多个连续的TX SLOT,所以TX_DOWN后,如果把DIR置为RX,会影响GPRS的速率。这时,如果隔离度足够,不影响RX performance,则TX_DOWN后,不需要设成RX

 

image040.png 

做射频驱动,其实最重要的还是多做试验,使用示波器抓取控制时序,结合驱动及器件文档的细节规格,使用8960和频谱分析仪来优化性能,这才是开发驱动的本意。

 

 手机RF开发心得总结-走线分析篇
手机RF开发心得总结-硬件设计篇
手机RF开发心得总结-前言篇


 
点这里复制本页地址发送给您QQ/MSN上的好友
相关文章

手机RF开发心得总结-走线分析篇
手机RF开发心得总结-硬件设计篇
Structure of GSM Normal Burst for GMSK M
0欧姆电阻在射频电路中的应用
GSM概述
GSM物理层协议
射频电路板设计技巧
Understanding PAL and RF
CMU200操作指南
手机RF开发心得总结-前言篇
手机RF开发心得总结-TCU介绍篇
手机RF专题讲座
OTA简介
VC-TCXO到DCXO
松下展示WiGig千兆无线网络技术

相关评论


本文章所属分类:首页 技术资料 常用无线电


反馈意见和建议