一周过去了,我自己制作的基于CC2431和CC2591的无线传感器网络硬件节点的射频部分都已经调试完毕,射频电路工作正常!通过外接CC2591后CC2431的无线通信距离能够扩展到约600米的距离,远远大于没有射频前端的距离(朋友测试说单纯CC2431的无线通信距离只有约50米)。
今天上午准备用半天时间调试板子上的高精度数字温度传感器TMP275,它是SMBUS接口形式,和I2C总线协议很类似,由于以前有过丰富的开发I2C的经验,所以我觉得应该很容易调试吧!谁知道竟然调试了一天的时间,而最终发现问题竟是由于IAR编译环境本身的BUG所致,真是叫我默默无语两眼泪了……
整个过程是这样的,我将以前写的I2C程序略作修改后成功移植到CC2431上,下载调试时在主机发送TMP275的地址后就收不到应答!反复阅读程序确定没有问题之后,我用示波器查看了一下SCK和SDA引脚上的信号,结果发现两个信号都不是很规则,一个不像正常的时钟,一个也不是我要发送的数据。怎么回事呢?莫非是我对CC2431的IO口操作不正确?再次阅读了一边CC2430的手册,发现也没什么呀,就那么几个寄存器嘛,使用是很简单的!那么问题到底处在了哪里呢?
最后,我决定写个最简单的控制一个IO口输出50%占空比方波的程序!程序代码如下:
void delay(void)
{
uint8 i;
for(i = 200; i > 0; i--);
}
int main( void )
{
system_init();
for(;;)
{
P1_3 = 1;
delay();
P1_3 = 0;
delay();
}
return 0;
}
其中 system_init();函数已经将P1_3端口设置为输出方向的通用IO。但是就是上面一个很简单的函数,用示波器查看引脚波形后,居然不是50%占空比的方波。在P1_3引脚输出的波形的高电平持续时间很短,而且有毛刺出现。而P1_2引脚上居然也可以看到和P1_3一样的波形,只是少了毛刺。这个奇怪的现象我一直不能理解,后来在一个朋友的帮助下终于找到问题的根本那就是IAR本身编译的结果有问题。如果将delay函数改成如下形式:
#define delay() { uint8 i; for(i = 200; i > 0; i--);}
那么再次编译下载后,P1_3引脚就能输出正常波形了,而P1_2引脚将没有波形。这就说明IAR7.30B在编译调用软件延时函数时发生了错误。后来,我又在Z-Stack1.43的源码中查找了一下,发现里面所有涉及到软件延时的部分都是用#define宏定义来实现的,没有像delay()一样的延时函数。所以,我估计开发Z-Stack的工程师应该也是遇到过这样的问题,只不过他们用#define将这个IAR的Bug给掩饰过去了,并且还没有告诉我们!
看来IAR的产品也不是很稳定的,难怪他们要那么频繁的升级,原来有一部分原因就是在修正bug啊!以后在开发中,如果遇到百思不得其解的不可思议的问题时,大家可以怀疑一下我们的编译器了,毕竟开发环境也是产品,也是可能存在缺陷的!
用户1196937 2008-11-20 11:03
用户1196937 2008-11-11 20:34
用户1433108 2008-11-10 10:46