网友juring作品
CC430中集成的无线模块叫RF1A,RF1A的简化框图如下所示:
CC1101模块有一个中频(IF)接收器。接收到的RF信号通过低噪声放大器(LNA)放大,再经过频率变换到中频。通过ADC将中频信号数字化,接着再经过自动增益控制(AGC),细微频率滤波和同步解调位/包之后,提供给MCU。 CC1101的发送部分基于RF频率的直接合成。频率合成器包含一个完全片上LC压控振荡器(VCO)和一个90 °的相移器,在接收模式,为下变频混频产生IQ本振(LO)信号。一个26 MHz的晶体振荡器为频率合成器提供参考频率,同时为ADC和数字部分提供时钟。 单片的CC1101是通过4 线制SPI兼容接口(SI,SO,SCLK 和CSn)与MCU通信。MCU通过这个接口对CC1101进行配置和读写数据。 而CC430本身就集成了MCU核,所以在CC430里对CC1101核的操作跟单片有些不同。CC430里MCU和RF核的通信是通过radio interface(无线模块接口,下同)来实现的。 用户可以通过radio interface 来配置RF1A模块,radio interface图示:
没有了SPI接口,radio interface和radio core(无线模块内核,下同)之间的通信需要通过下图所示的逻辑通道来实现。 每条发送到radio core的指令都会在radio interface上返回一个状态更新,每给radio core发送一个数据字或字节,也都会在radio interface上返回一个字或字节。根据不同的指令,在两个方向上的一些数据可能是“dummy”或“don't care”数据。为了避免“哑”写入,模块具有自动读取功能。
我们看到radio interface有8个寄存器:INSTRW/INSTRB、STATW/STATB、DINW/DINB、DOUTW/DOUTB。 一共4组,分别为指令寄存器、状态寄存器和IN/OUT数据寄存器,每一组又分16位字寄存器和8位字节寄存器。 下面逐一介绍: 通过写指令寄存器RF1AINSTRxW 或 RF1AINSTRxB可以来控制radio core。 额外的参数数据可以写到数据寄存器RF1ADINB 或 RF1ADINW里面。 返回值可以通过读取数据寄存器RF1ADOUTxB 或 RF1ADOUTxW得到。 每次写指令寄存器(SRES指令除外),radio core状态都会更新,可以通过状态寄存器RF1ASTATxB或RF1ASTATxW读取。
指令和状态寄存器 所有的指令通过指令寄存器写入。 使用寄存器RF1AINSTRW(双字节),可以写入指令加上第一个数据字节,其余剩下的参数就需要通过寄存器RF1ADIN写入。 RF1AINSTRB可用于单字节指令(如命令选通),剩余的参数则通过RF1ADIN寄存器写入。 每次radio interface和radio 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,上面说到“我们通过写寄存器RF1AINSTRxW 或 RF1AINSTRxB可以来控制radio core,额外的数据可以写到寄存器RF1ADINB 或 RF1ADINW里面。” 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。 基于CC1101的radio core处理的是大端数据。RFENDIAN = 1可用于易于从双芯片RF解决方案的代码移植,当使用RF1ADINW寄存器来发送或接收数据,或者写入功率放大器表(PATABLE)数据的时候,也应该使用RFENDIAN = 1。 一个16位的字是通过写入寄存器RF1ADINW来传入radio core。 一个字节是通过写入寄存器RF1ADINB来传入radio core。 一个字节访问RF1ADINW寄存器的低字节的行为和访问RF1ADINB相同。 数据可以通过字数据寄存器RF1ADOUTW或字节数据寄存器RF1ADOUTB从radio core读取出来。使用这些寄存器的时候,你需要从RF1ADOUT读取多少数据,那么就必须在RF1ADIN写入相同数量的数据(即使这些写入的数据对radio core来说是没用的),否则OUTERR标志会置位。同样,如果radio core正在处理指令,还没有提供任何数据,那么OUTERR被置位。 对于字的读取,数据格式可以通过RFENDIAN来选择,跟前面讲的差不多。 一个16位的字可以通过RF1ADOUTW从radio core读取。 一个字节可以通过RF1ADOUTB从radio core读取。 一个字节访问RF1ADOUTW寄存器的低字节的行为和访问RF1ADOUTB相同。
自动读取功能 如果提供给radio core的参数是don't care的(比如寄存器是只读的),自动读取功能可以使用,以避免通过RF1ADIN寄存器提供dummy数据。 如果是自动读取下一个字节,寄存器RF1AINSTR1B,RF1ASTAT1W,RF1ASTAT1B,RF1ADOUT1B,RF1ADOUT1W可以用来代替寄存器RF1AINSTRB,RF1ASTATW,RF1ASTATB,RF1ADOUTB,RF1ADOUTW。使用这些寄存器读取下一个字节,可以不必在RF1ADINB做一个dummy write(哑写入)。 如果是自动读取接下来的两个字节(即一个字),寄存器RF1AINSTR2B,RF1AINSTR2W,RF1ASTAT2B,RF1ASTAT2W,RF1ADOUT2B和RF1ADOUT2W可以用来代替寄存器RF1AINSTRB,RF1AINSTRW,RF1ASTATB,RF1ASTATW,RF1ADOUTB,RF1ADOUTW。使用这些寄存器读下一个字(即接下来的两个字节),可以不必在RF1ADINW做一个dummy write(哑写入)。 这个手册上有例子,就不赘述了。
延时读写
如果从 CPU访问 radio interface寄存器读或写导致错误条件时, CPU会停顿 4个 CPU时钟周期或等到解决错误条件。如果 4个 CPU时钟周期之后错误条件没有解决,读或写访问继续执行,以避免可能发生的死锁情况。但是会把相应的错误标志置位。
CC430学习笔记----(二).pdf
(718.21 KB, 下载次数: 42)
|