调试nRF905无线模块近一个星期之久,下面细说一下基于MSP430F149+nRF905的调试步骤。
l 看到很多网友提出
First:测试nRF905模块是否正常工作
对于发射机 进入发射状态31脚1.5V 23脚1.2V 19脚1.8V
对于接收机 进入接收状态31脚1.2V 23脚1.2V 19脚0V
next :当nRF905“TRX_CE = 1”、“TX_EN = 1” 时进入发送模式,数据就会通过SPI总线自动发送出去,当数据发送完成准备好引脚DR=1.之后“TRX_CE = 0”。
当MCU把nRF905“TRX_CE = 1”、“TX_EN = 0” 时进入接收模式,MCU检测接收机DR是否为1,若为高则说明接收到有效数据,当数据接收完毕nRF905905把AM 和DR置低。
l 接下来我们关注一下SPI时序
根据SPI的通信原理知,在时钟的上升沿采样数据,时钟的下降沿输出数据(相对从机而言)
接下来看网友提出的问题??
其实我看这图时,有些疑问。DR 的时序变化图在那,如果要画的话,应该画哪?
TRX_CE=1;
Delay(5);
while (DR!=1)
TRX_CE=0;
如果真像代码所写,DR的置高应该是在T0于T1之间。但数据的发送却又是在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)函数出不来,很怀疑。因为DR是nRF905接收到有效数据后给MCU的,MCU检测DR = 1后开始通过SPI口把数据移到寄存器内。所以,问题锁定到P2IN&0x40脚。索性不管它,将5v电源和仿真器一起给处理器供电,(之前是为了调试只用仿真器供电的)奇迹出现了,竟然单步执行可以顺利通过。OK!
总结:
调试时要有清晰的调试思路,按程序流程执行调试步骤。
在主程序单步执行时有始有终的,如果程序出不来就说明在某个子程序里有问题
调试有一定的技巧,有待提高啊!!
关于nRN905寄存器的配置以及相关设置,参考文件金龙电子nRN905开发文档(附件1)
想了解详细 QQ: 2432748170