该平台基于MSP430F2618+CC2520。这里简要叙述CC2520部分移植的关键步骤,细节部分太繁琐,没有记录下来。MSP430部分移植请参考。
TinyOS在CC2520上的移植主要是用CC2520的6个GPIO模拟出CC2420的4个GPIO。分别为FIFOP,FIFO,CCA,SFD,这些都可以通过CC2520的GPIO寄存器配置来实现上述功能。其中FIFOP,CCA采用中断接口,SFD使用时钟捕获模式。
CC2520和CC2420的寄存器,地址映射有较大差异,而TinyOS对其寄存器的配置采用了带参数接口模型,即根据操作对象的不同,提供不同的接口,包括Fifo[uint8_t id]用于对TX/RXFIFO读写,id即为TXBUF或RXBUF的地址,同实例化该接口实现TX/RX FIFO操作;Ram[uint16_t id]用于内部RAM地址读写。在两款芯片中的部分寄存器(寄存器地址小于0x40的FREG)都会映射到相应的RAM地址,即可以通过读写RAM来实现读写寄存器的功能。但是有些寄存器(寄存器地址大于0x40的SREG)只能通过读写RAM指令完成;Reg[uint8_t id]实现对内部寄存器的访问,只能用于读写寄存器地址小于0x40的FREG;Strobe[uint8_t id]用于指令写入。
在CC2520SpiC文件中提供了上述寄存器的实例,由于CC2520寄存器数量较多,并且有些寄存器都采用了默认值无需改动,所以,在该文件中根据需要添加相应接口实例。
文件CC2520SpiP中给出了上述接口的实现函数,需要注意的是Fifo接口使用了SpiPacket接口,需要提供相应的响应事件。CC2520通过SPI接口与单片机通信,访问CC2520寄存器或内部地址都需通过SPI接口读写。为了更方便SPI操作,在上述接口中提供单字节和双字节读写函数,避免使用字符串读写函数的麻烦。CC2520 SPI有着严格的读写实现,另外为了在上层中使用方便,在接口函数中读写之前使能SPI,操作完之后关闭。注意一点:Fifo接口中没有使能SPI,因为该接口采用分裂相模型,SPI调用完之后即刻返回,但是并不代表已经读写完成,所以只有等到SPI读写完成事件后才表明完成操作,在上层调用中要注意,在调用Fifo接口前使能SPI,而在完成事件中关闭。
TinyOS下802.15.4帧格式
1.在TinyOS中,帧头比802.15.4帧多出两个字节,其中,network用于6LowPan,默认为0x3F。另一个是type用于标记当前帧发送者的am_ID。
2.TOSH_DATA_LENGTH定义为64,在与其他TinyOS基于CC2420收发器的系统通信时,需要注意最大帧长度,CC2420下TOSH_DATA_LENGTH定义为28。
CC2520启动流程:
应用程序中使用接口SplitControl,该接口最终连接到CC2520CsmaP上,在CC2520CsmaP的SplitControl.start中调用CC2520Power接口函数startVReg,该接口连接在CC2520ControlP上,其功能是实现CC2520上复位,以及上电启动。首先,复位CC2520,并且关闭电压调整器,根据Datasheet,延时1100us,延时通过接口BusyWait<T32khz,uint16_t>,连接到模块BusyWait32khzC上,此延时器采用32.768khz时钟源,所以定时值应设置为36。延时完成后,开启电压调整器,并延时200us后使能CC2520,完成后触发startVRegDone事件。CC2520CsmaP收到事件startVRegDone后,申请SPI资源,该资源Resource接口连接在CC2520ControlP上,资源申请允许后,开始初始化CC2520,通过CC2520Power接口函数startOscillator。之后开始写CC2520寄存器。完成后触发startOscillatorDone事件,CC2520CsmaP收到事件startVRegDone后,调用接口StdControl函数start,当应用程序执行发送命令时该接口连接到CC2520TransmitC上,而在接收模式时连接到CC2520ReceiveC上。在发送模式时,StdControl完成SFD引脚配置,配置为上升沿捕获模式(注意:在CC2520寄存器配置失败时,SFD中断立即发生)。接收模式时StdControl完成FIFOP中断配置,下降沿触发。StdControl接口函数完成后,CC2520CsmaP执行CC2520Power接口函数rxOn,实现CC2520进入接收模式。最后CC2520CsmaP触发SplitControl接口函数startDone,应用层捕获此事件,至此CC2520初始化启动完成。
增加设置CHANNEL
原TinyOS CC2420.h中定义了信道为26,但是并没有语句来重新改写信道,所以即使改变这个预定义信道,也不能真正改变通信信道,CC2520仍然使用默认的信道11通信。
在CC2520初始化过程中设置应用程序中定义的信道,在函数writeId中增加信道设置语句。信道数只能取11-26之间的数,且11信道对应的频率为2405MHz,26信道频率为2480MHz,对寄存器CC2520_FREQCTRL写的的值为11+(channel-11)*((2480-2405)/(26-11))。考虑到信道与源PANID和源地址具有相同的特性,即在应用程序如需调整时,都需要重新配置寄存器。借鉴TinyOS采用事件的方式来响应PANID和SHORTADDR的改动,采用同样的方式实现事件响应CHANNEL的更改。即在ActiveMessageAddressC中增加amChannel函数用于返回channel值,setAddress加入myChannel参数,即实现在改动CHANNEL后触发事件changed。