查看: 1996|回复: 0
打印 上一主题 下一主题

TinyOS在MSP430F2618上移植(二)之USCI

[复制链接]
跳转到指定楼层
沙发
发表于 2015-4-25 11:16:41 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

  第一篇文章《TinyOS在MSP430F2618上移植(一)》早在5月份就已写好,间隔了2个月才有时间写这篇文章,期间一直忙于SPI、UART接口的测试以及FLASH、LCD的移植。本文主要叙述MSP430F2618单片机USCI的移植。

         对比MSP430F1611与MAP430F2618,可以看出两者最大的不同点在于后者提供了更丰富的外围接口,分为A,B两组,其中A组的功能有UART、IrDA ,B组提供SPI、I2C功能,另外A组也可以配合B组中提供的SCK作为SPI接口。在A,B组中又分为两个独立组,A0/1,B0/1。

          2618中特殊功能寄存器也做了改动,去除了模块使能寄存器1、2(module enable register 1 and 2)ME1以及ME2,特殊功能器IE2,IFG2中仅包含A0和B0相应的接收/发送中断使能以及中断状态位,而A1和B1相应的中断使能以及中断状态则有寄存器UC1IE和UC1IFG相应位实现。所以,首先得修改McuSleepC.nc中出现的ME1,ME2,在getPowerState()中使用UCB0/1CTL1 和UCA0/1CTL1替代,即当USCI使用时钟源为UCSSEL_1(ACLK)时,返回当前的电源状态为LPM1。

             修改HplMsp430GeneralIOC.nc中引脚配置,去除所有宏定义(否则编译时出现引脚未定义错误),重新配置接口(主要是USCI接口)。

            修改msp430usart.h。根据2618中相应寄存器修改数据结构,定义数据类型msp430_ucactl0_t,msp430_ucactl1_t(Async_mode)和msp430_ucbctl0_t, msp430_ucbctl1_t (Sync_mode),并增加相应的DEFINE_UNION_CAST宏,实现定义的结构体类型与整型之间相互转换。定义用于SPI接口配置的数据类型msp430_spi_config_t,其中包括16bit的波特率UBR,8bit的UCTL0以及8bit的UCTL1寄存器相应位的定义。定义用于UART接口配置的数据类型msp430_uart_config_t,其中包括16bit的波特率UBR,8bit的UMCTL ,8bit的UCTL0以及8bit的UCTL1寄存器相应位的定义。

             回到usart目录下,由于低版本MSP430系列仅采用两个分组1,2,而2618中使用了A,B分组,而每一个组中又包括两个分组1,2。分别增加HplMsp430UsartA0C.nc,HplMsp430UsartA0P.nc,HplMsp430UsartA1C.nc,HplMsp430UsartA1P.nc,HplMsp430UsartB0C.nc,HplMsp430UsartB0P.nc,HplMsp430UsartB1C.nc,HplMsp430UsartB1P.nc。上述文件使用的接口HplMsp430GeneralIO分别连接到不同的接口上实现不同的功能。在文件msp430regtypes.h中增加相应数据类型的定义,即定义寄存器的数据类型,然后在上述P文件中使用MSP430REG_NORACE。

             由于A和B两组共用同一类中断,如A0/B0使用USCIAB0RX_VECTOR接收中断向量,那么在TOSH_SIGNAL(USCIAB0RX_VECTOR)中应判断触发此中断的是哪一组,在中断中通过判断此时中断标志位和中断使能位指向哪一组,当这两个条件都成立时,读相应的数据寄存器,并触发Interrupts接口的rxDone。删除与ME1/2相关的语句,修改相应的寄存器选项。

           实现SPI功能。增加Msp430SpiA0C.nc,Msp430SpiA1C.nc,Msp430SpiB0C.nc,Msp430SpiB1C.nc这4个文件供外部接口使用SPI功能时连接使用。在使用SPI功能时可以使用DMA模式,增加Msp430SpiDmaA0/1P.nc,Msp430SpiDmaB0/1P.nc,Msp430SpiNoDmaA0/1P.nc,Msp430SpiNoDmaB0/1P.nc共8个文件,实现上述4个C文件向上层连接,最终由Msp430SpiDmaP.nc,Msp430SpiNoDmaP.nc两个文件实现接口提供的功能。而向下层连接是通过增加Msp430UsartB0C.nc,Msp430UsartB1C.nc,这两个文件连接Hpl层,并且连接到资源仲裁层,通过增加Msp430UsartShareB0P.nc,Msp430UsartShareB1P.nc实现。

          与实现SPI功能相似,UART功能由下述方法实现。增加Msp430Uart0/1C.nc, Msp430Uart0/1P.nc,其中Msp430Uart0/1C.nc用于外部接口使用UART功能时连接。向上层连接通过Msp430Uart0/1P.nc连接到Msp430UartP.nc,该文件实现UART接口的功能。而向下层连接是通过增加Msp430UsartA0C.nc,Msp430UsartA1C.nc,这两个文件连接Hpl层,并且连接到资源仲裁层,通过增加Msp430UsartShareA0P.nc,Msp430UsartShareA1P.nc实现。

           通过上述配置即可完成USCI的移植,通过编译过程中出现的错误再做相应的修改。

           使用SPI时通过连接模块Msp430SpiA0C.nc,Msp430SpiA1C.nc,Msp430SpiB0C.nc,Msp430SpiB1C.nc,选择其中的一组,最后提供一个组件使得上述4个文件中的Msp430SpiConfigure接口连接到此组件,实现配置SPI功能。

           使用UART时通过连接模块Msp430Uart0C.nc, Msp430Uart1C.nc,选择其中的一组,最后提供一个组件使得上述2个文件中的Msp430UartConfigure接口连接到此组件,实现配置UART功能。

           最后,TinyOS2.1.1默认的时钟源选择的是DCO默认设置,其频率在1.1MHZ左右。在MoteClockC文件中取消对MoteClockP。Msp430ClockInit -> Msp430ClockC语句的注释,意义在于使用本平台下的时钟初始化函数。修改MoteClockP文件中setupDcoCalibrate函数,开启XT2时钟源,并将MCLK和SMCLK都设置为以XT2为时钟源。并根据需要修改initClock函数,可以直接注释掉前两句。


回复

使用道具 举报

您需要登录后才可以回帖 登录 | 加入因仑

本版积分规则

快速回复 返回顶部 返回列表