查看: 3049|回复: 0

CC430学习笔记——(二)(网友juring作品)

[复制链接]
  • TA的每日心情
    奋斗
    2020-9-28 10:10
  • 签到天数: 1018 天

    连续签到: 1 天

    [LV.10]以坛为家III

    发表于 2012-8-24 13:26:08 | 显示全部楼层 |阅读模式
    分享到:
    网友juring作品

    CC430中集成的无线模块叫RF1ARF1A的简化框图如下所示:

    CC1101模块有一个中频(IF)接收器。接收到的RF信号通过低噪声放大器(LNA)放大,再经过频率变换到中频。通过ADC将中频信号数字化,接着再经过自动增益控制(AGC),细微频率滤波和同步解调位/包之后,提供给MCU
    CC1101的发送部分基于RF频率的直接合成。频率合成器包含一个完全片上LC压控振荡器(VCO)和一个90 °的相移器,在接收模式,为下变频混频产生IQ本振(LO)信号。一个26 MHz的晶体振荡器为频率合成器提供参考频率,同时为ADC和数字部分提供时钟。
    单片的CC1101是通过4 线制SPI兼容接口(SI,SO,SCLKCSn)与MCU通信。MCU通过这个接口对CC1101进行配置和读写数据。
    CC430本身就集成了MCU核,所以在CC430里对CC1101核的操作跟单片有些不同。CC430MCURF核的通信是通过radio interface(无线模块接口,下同)来实现的。
    用户可以通过radio interface 来配置RF1A模块,radio interface图示:

    没有了SPI接口,radio interfaceradio core(无线模块内核,下同)之间的通信需要通过下图所示的逻辑通道来实现。
    每条发送到radio core的指令都会在radio interface上返回一个状态更新,每给radio core发送一个数据字或字节,也都会在radio interface上返回一个字或字节。根据不同的指令,在两个方向上的一些数据可能是“dummy”或“don't care”数据。为了避免“哑”写入,模块具有自动读取功能。

    我们看到radio interface8个寄存器:INSTRW/INSTRBSTATW/STATBDINW/DINBDOUTW/DOUTB
    一共4组,分别为指令寄存器、状态寄存器和IN/OUT数据寄存器,每一组又分16位字寄存器和8位字节寄存器。
    下面逐一介绍:
    通过写指令寄存器RF1AINSTRxWRF1AINSTRxB可以来控制radio core
    额外的参数数据可以写到数据寄存器RF1ADINBRF1ADINW里面。
    返回值可以通过读取数据寄存器RF1ADOUTxBRF1ADOUTxW得到。
    每次写指令寄存器(SRES指令除外),radio core状态都会更新,可以通过状态寄存器RF1ASTATxBRF1ASTATxW读取。

    指令和状态寄存器
    所有的指令通过指令寄存器写入。
    使用寄存器RF1AINSTRW(双字节),可以写入指令加上第一个数据字节,其余剩下的参数就需要通过寄存器RF1ADIN写入。
    RF1AINSTRB可用于单字节指令(如命令选通),剩余的参数则通过RF1ADIN寄存器写入。
    每次radio interfaceradio core之间的数据传输都会引起radio core状态的改变,可以通过状态寄存器RF1ASTATB读取。
    举个例子简单解释一下上面的内容:
    比如说我要配置发射功率,即PATABLE
    那么首先我们需要知道写PATABLE寄存器的写指令,查看cc430x513x.h可以找到:
    #define    PATABLE    0x3E   /* PATABLE - PA control settings table */
    #define    RF_SNGLREGWR        0x00
    #define    RF_SNGLPATABWR     (RF_SNGLREGWR+PATABLE)

    然后再写相应的函数:
    void WriteSinglePATable(unsigned char value)
    {
      while( !(RF1AIFCTL1 & RFINSTRIFG));
      RF1AINSTRW = (RF_SNGLPATABWR<<8) + value;  // PA Table single write
      while( !(RF1AIFCTL1 & RFINSTRIFG));
      RF1AINSTRB = RF_SNOP;                     // reset PA_Table pointer
    }

    这个函数的作用就是把配置的功率值写到PATABLE里面去,有几点说明:
    1.PATABLE单个寄存器的指令是RF_SNGLPATABWR,上面说到“我们通过写寄存器RF1AINSTRxWRF1AINSTRxB可以来控制radio core,额外的数据可以写到寄存器RF1ADINBRF1ADINW里面。”
    RF_SNGLPATABWR是单字节指令,带一个字节的操作数value(即你要配置的功率),所以我们可以先写RF_SNGLPATABWR到 RF1AINSERB,然后再写value到RF1ADINB里面即可。
    RF1AINSTRB = RF_SNGLPATABWR;
    RF1ADINB = value;

    2.上面又写到“使用寄存器RF1AINSTRW(双字节),可以写入指令加上第一个数据字节,其余剩下的参数就需要通过寄存器RF1ADIN写入。”
    那么,上面两句也可以写成:
    RF1AINSTRW = (RF_SNGLPATABWR<<8) + value;

    因为没有其余的参数,所以一句话就OK了。
    假设别的指令还有第二个参数value2,那么下面加一句RF1ADINB = value2;即可。
    RF1ASTATW寄存器可以配合字指令寄存器RF1AINSTRW来使用。这就可以使radio core的状态更新随着最后一条指令和第一个数据字节从RF1A返回。如果指令是写到字节寄存器RF1AINSTRB,读RF1ASTATW寄存器会导致一个输出数据错误,OUTERR标志被置位。
    命令选通信号SNOP,可用于获取更新的状态,无需其他操作。
    一条指令的结束有两种方式,一是通过提供完整的指令,包括所有必需的数据字节(指令要求有限数量的字节),二是给指令寄存器写入一个新的指令。如果是一条指令需要一个给定的有限的字节数来结束,那么写一个新的指令来终止这条指令会造成指令操作数的错误标志OPERR被置位。中止的指令可能已经被部分执行,会造成radio core的不可预知的状态。

    数据寄存器
    radio core准备好接收additional data(除命令外的参数)的时候,可以通过字数据寄存器RF1ADINW或字节数据寄存器RF1ADINB把参数传到radio core。这用RFDINIFG= 1表示。
    如果radio core还没准备好接收additional data,但是数据已经写入其中一个RF1ADIN寄存器,那么CPU会停滞给定的几个周期或者等到之前的数据被处理完。
    如果在给定的几个周期之后,radio core还没准备好接收,那么OPOVERR标志被置位,写入的数据将被忽略。
    如果一个操作,提供了太多的操作数,而这些操作数又不是指令所需要的,那么OPERR标志将被置位,多余的操作数将被忽略。
    radio core期望的是大端数据格式,但是使用字数据寄存器RF1ADINW,字参数可以以小端数据格式传入radio core。(MSP430默认是小端数据格式)
    RFENDIAN= 0时,写入的字数据由小端格式转换为radio core所需的大端表示,而当RFENDIAN= 1时,数据不转换,以原有的格式(从最低地址开始)传到radio core
    基于CC1101radio core处理的是大端数据。RFENDIAN = 1可用于易于从双芯片RF解决方案的代码移植,当使用RF1ADINW寄存器来发送或接收数据,或者写入功率放大器表(PATABLE)数据的时候,也应该使用RFENDIAN = 1
    一个16位的字是通过写入寄存器RF1ADINW来传入radio core
    一个字节是通过写入寄存器RF1ADINB来传入radio core
    一个字节访问RF1ADINW寄存器的低字节的行为和访问RF1ADINB相同。
    数据可以通过字数据寄存器RF1ADOUTW或字节数据寄存器RF1ADOUTBradio core读取出来。使用这些寄存器的时候,你需要从RF1ADOUT读取多少数据,那么就必须在RF1ADIN写入相同数量的数据(即使这些写入的数据对radio core来说是没用的),否则OUTERR标志会置位。同样,如果radio core正在处理指令,还没有提供任何数据,那么OUTERR被置位。
    对于字的读取,数据格式可以通过RFENDIAN来选择,跟前面讲的差不多。
    一个16位的字可以通过RF1ADOUTWradio core读取。
    一个字节可以通过RF1ADOUTBradio core读取。
    一个字节访问RF1ADOUTW寄存器的低字节的行为和访问RF1ADOUTB相同。

    自动读取功能
    如果提供给radio core的参数是don't care的(比如寄存器是只读的),自动读取功能可以使用,以避免通过RF1ADIN寄存器提供dummy数据。
    如果是自动读取下一个字节,寄存器RF1AINSTR1BRF1ASTAT1WRF1ASTAT1BRF1ADOUT1BRF1ADOUT1W可以用来代替寄存器RF1AINSTRBRF1ASTATWRF1ASTATBRF1ADOUTBRF1ADOUTW。使用这些寄存器读取下一个字节,可以不必在RF1ADINB做一个dummy write(哑写入)。
    如果是自动读取接下来的两个字节(即一个字),寄存器RF1AINSTR2BRF1AINSTR2WRF1ASTAT2BRF1ASTAT2WRF1ADOUT2BRF1ADOUT2W可以用来代替寄存器RF1AINSTRBRF1AINSTRWRF1ASTATBRF1ASTATWRF1ADOUTBRF1ADOUTW。使用这些寄存器读下一个字(即接下来的两个字节),可以不必在RF1ADINW做一个dummy write(哑写入)。
    这个手册上有例子,就不赘述了。





    延时读写
    如果从CPU访问radio interface寄存器读或写导致错误条件时,CPU会停顿4CPU时钟周期或等到解决错误条件。如果4CPU时钟周期之后错误条件没有解决,读或写访问继续执行,以避免可能发生的死锁情况。但是会把相应的错误标志置位。
    CC430学习笔记----(二).pdf (718.21 KB, 下载次数: 41)
    回复

    使用道具 举报

    您需要登录后才可以回帖 注册/登录

    本版积分规则

    关闭

    站长推荐上一条 /2 下一条



    手机版|小黑屋|与非网

    GMT+8, 2024-3-29 18:46 , Processed in 0.126044 second(s), 17 queries , MemCache On.

    ICP经营许可证 苏B2-20140176  苏ICP备14012660号-2   苏州灵动帧格网络科技有限公司 版权所有.

    苏公网安备 32059002001037号

    Powered by Discuz! X3.4

    Copyright © 2001-2020, Tencent Cloud.