基于MSP430F149+nRF905无线数传模块的调试心得

nicole088   2012-3-28 08:50 楼主

调试nRF905无线模块近一个星期之久,下面细说一下基于MSP430F149+nRF905的调试步骤。

 

l  看到很多网友提出

First:测试nRF905模块是否正常工作

       对于发射机  进入发射状态311.5V   231.2V   191.8V

       对于接收机  进入接收状态311.2V   231.2V   190V

next nRF905TRX_CE = 1”、“TX_EN = 1 时进入发送模式,数据就会通过SPI总线自动发送出去,当数据发送完成准备好引脚DR=1.之后“TRX_CE = 0”。

      MCUnRF905TRX_CE = 1”、“TX_EN = 0 时进入接收模式,MCU检测接收机DR是否为1,若为高则说明接收到有效数据,当数据接收完毕nRF905905AM DR置低。

 

l  接下来我们关注一下SPI时序

根据SPI的通信原理知,在时钟的上升沿采样数据,时钟的下降沿输出数据(相对从机而言)

接下来看网友提出的问题??

其实我看这图时,有些疑问。DR 的时序变化图在那,如果要画的话,应该画哪?

 TRX_CE=1;

Delay(5);

while (DR!=1)

TRX_CE=0;

如果真像代码所写,DR的置高应该是在T0T1之间。但数据的发送却又是在T2开始,这让我不知该把while 语句放哪,并且还怀疑说明书上的代码有没有错。我把上述的语句排列组合了许多次,但总是老样子。

      又因此烦恼了数个夜晚。后来想着为啥不是着把管脚于管脚间的线断开,用万用表测测分开的管脚的电平。经测试,发现单片机上的IO口管脚电平始终为低,而nRF905模块上的DR管脚却有着令人兴奋的 3.38V .这就找到路子,一定是IO口的问题,但具体问题在哪?

后来在论坛里看到一些信息

void nRF905Init(void)
{
       CSN=1;      // Spi  disable
      SCK=0;      // Spi clock line init low
      DR=0;      // Init DR for input
    
 AM=0;      // Init AM for input
    CD=0;      // Init CD for input
    PWR=1;     // nRF905 power on
    TRX_CE=0;     // Set nRF905 in standby mode
    TXEN=0;     // set radio in Rx mode
}

如上,DR设为了低电平,根据电路基础知识知道,高电平于低电平线与得低电平,高电平只有与高电平线与才能得高电平。因该将DR = 1

l  在看一下程序调试过程中C语言的一些问题

关于MSP430输入引脚的的设置 (是不能设置输入状态的,即0/1)

//============AM  地址匹配/DR 数据接收状态/CD 载波侦听状态============

#define MISO   BIT2

#define AM     BIT5

#define CD     BIT4

#define DR     BIT6

 

#define MISO_IN  P3IN&MISO

#define AM_IN    P2IN&AM

#define DR_IN    P2IN&DR

#define CD_IN    P2IN&CD

注意方向寄存器PxDIR 

 

关于接受数据时 DR的检测

  最初是这样写的  

  //========================数据接收=====================================

 

void RxPacket(unsigned char *RxBuf)    

{

                              while (P2IN&0x40);      // 检测DR

                              char i;

                              TRX_CE_0;

                              CSN_0;       

       按理说 P2IN&0x40为真是在这里等待的,只有当为假是才向下执行,可修改不论真假都向下执行,很难理解。参考网络代码是这样写的:

 

unsigned int CheckDR(void)      //检查是否有新数据传入 Data Ready

{

    if (P2IN&0x40)

    {

        return 1;

    }

    else

    {

        return 0;

    }

}

 

//============================数据接收=====================================

void RxPacket(unsigned char *RxBuf)                    

{

 

        while (CheckDR()==0);

        char i;

        TRX_CE_0;

        CSN_0; 

使用了一个子函数。这时return 0;虽然可以在while (CheckDR()==0);处等待了,但是一直检测不到return 1;不知道是数据没接收到,还是没发送出来。从头再来!调试发送数据。直接将断点打在发送完成,测量DR状态, DR为高电平说明数据发送完成,0K

再看接收数据,总是在CheckDR(void)函数出不来,很怀疑。因为DRnRF905接收到有效数据后给MCU的,MCU检测DR = 1后开始通过SPI口把数据移到寄存器内。所以,问题锁定到P2IN&0x40脚。索性不管它,将5v电源和仿真器一起给处理器供电,(之前是为了调试只用仿真器供电的)奇迹出现了,竟然单步执行可以顺利通过。OK!

总结:

调试时要有清晰的调试思路,按程序流程执行调试步骤。

在主程序单步执行时有始有终的,如果程序出不来就说明在某个子程序里有问题

调试有一定的技巧,有待提高啊!!

 

关于nRN905寄存器的配置以及相关设置,参考文件金龙电子nRN905开发文档(附件1

 

想了解详细   QQ: 2432748170

 

 

回复评论 (1)

学习了~
点赞  2012-6-1 09:52
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 京公网安备 11010802033920号
    写回复