打印

关于nRF905求助,多点通信出错问题?

[复制链接]
3009|10
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
zhuyi2576|  楼主 | 2010-10-15 00:50 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
关于nRF905求助,多点通信出错问题?

我一个主机,三个从机做实验(以后要带几百个从机),都用的是用同一的固定的频率,通过改变地址,将数据发到从机上
现在问题是,本来我要发到1号机上,有时却发到了2号,或3号机上,反正就是不受控制。乱了
资料上不是有地址检测,频率检测吗,可是感觉一点都没有用呀,特别是CD检测功能!

这是我接收程序,麻烦大家看一下,,或是大家提点建议,怎么处理好呀
void RxPacket(void)
{
       SetRxMode();   // Set nRF905 in Rx mode
       Delay(10);
if(DR&&AM)//数据校验正确,而且地址也匹配
{
  ReadPacket(RxBuffer,32);//读数据
  LED=1;//接收到主机发给自己的数据,指示灯开
  for(i=0;i<32;i++)
  {
   send_UART(RxBuffer[i]);//发回串口显示
  }
        }
}

void ReadPacket(uchar *p,uchar Len) //读数据
{
uchar i;
        TRX_CE=0;    //进入空闲模式,读数据
CSN=0;     // Spi enable for write a spi command
SPI_ByteWrite(RRP);  //读RxPayload
for (i = 0 ;i < Len ;i++)
{
   *p = SPI_ByteRead();
  p++;
         }
CSN=1 ;
  while (AM||DR);    //等待读取数据完毕,如果数据被读出,905自动将DR=0,AM=0
TRX_CE=1;    //回到继续接收模式      
}

配置
void Config905(uchar *Pointer)
{
uchar i;
CSN=0;
Delay(1);     // Spi enable for write a spi command
SPI_ByteWrite(WC);   // Write config command写放配置命令
SPI_ByteWrite(CH_NO_FREQ_430_0MHz &0xff);  //字节0  中心频率低8位      0x4c
SPI_ByteWrite(PA_PWR_10dBm | HFREQ_PLL_433MHz); //发射+10dBm,发射频率433MHz,中心频率第9位=0 0x0c
SPI_ByteWrite(TX_AFW_4BYTE | RX_AFW_4BYTE);     //接收地址宽度4字节,发送地址宽度4字节  0x44
SPI_ByteWrite(RX_PW_32BYTE);                    //接收数据宽度32字节      0x20
SPI_ByteWrite(TX_PW_32BYTE);                    //发送数据宽度32字节      0x20
for (i=0;i<4;i++)         //接收有效地址第1字节
{
   SPI_ByteWrite(*Pointer);
  Pointer++;
}
SPI_ByteWrite(CRC16_EN | XOF_16MHz);            //CRC16模式使能,晶体振荡器频率16MHz  //0xd8
// SPI_ByteWrite(CRC8_EN | XOF_16MHz);    //CRC8模式使能,晶体振荡器频率16MHz   //0x58
CSN=1;     // Disable Spi
}

相关帖子

沙发
chunyang| | 2010-10-15 09:41 | 只看该作者
楼主不妨看一下Modbus协议,用此协议组网是非常可靠的,协议文本在我的Blog中有。

使用特权

评论回复
板凳
zhuyi2576|  楼主 | 2010-10-15 10:10 | 只看该作者
Modbus协议也要先发查询包呀,现在是发不到正确的地址里面去呀

使用特权

评论回复
地板
chunyang| | 2010-10-15 13:02 | 只看该作者
不要使用硬件地址匹配,全部用软件处理,不存什么“正确的地址”,各节点根据数据帧中的地址匹配进行响应就是。

使用特权

评论回复
5
zhuyi2576|  楼主 | 2010-10-16 22:00 | 只看该作者
我现在差不多就这样做的,自己用了个简单的协议吧,包头+从机地址+数据+校验,,,
现在的现象是:我发送数据时,其中一部分从机都能收到,但因为包中地址不是自己的,不会响应而于,如果一对一好像没问题,
但现在问题是又有了:我要切换,向不同的从机发数据,发现不能切换,我换到二号的时候,二号收不到,,,,改用发送的时候发TX(); Delay(10); TX();这样发送二次,,,从机就能正确响应。不知道为什么会这样,用串口检测的时候,从机收到的数据却是二个一样的包,,,,如果第一次它没收到,那它应该收到一个包呀,收到二个包,是不是就是说它二个包都正确收到了呢,那它为什么我在发第一个包的时候,它不响应呢,我发第二个的时候,它却响应了二次呢,,为什么,为什么,,,,我接收部分有问题吗?

使用特权

评论回复
6
chunyang| | 2010-10-17 09:49 | 只看该作者
说明你的程序有误,仔细检查吧。

使用特权

评论回复
7
zhuyi2576|  楼主 | 2010-10-18 14:15 | 只看该作者
主机每次发数据如果发送一包,每次都要发二次,从机能才收到一包,,,,如果发10包,每包发送间隔要很长100ms,从机才能接收到10包数据。时间短了,就只有三五包。如果还存在其它从机的话,则只能收到9包,

问题真的很多呀,调的快要疯了,,调不出来,估计也不好意思在这呆了



chunyang   老师,QQ多少呀,能否向你请教呀!

使用特权

评论回复
8
迅通科技| | 2010-10-26 12:08 | 只看该作者
经验是调试积累出来的,工资是跳高的

使用特权

评论回复
9
我是土匪| | 2010-10-26 13:38 | 只看该作者
我要跳的更高 :lol

使用特权

评论回复
10
fornever| | 2010-10-27 20:28 | 只看该作者
发送间隔时间长的问题应该是从机处理速度的问题吧,我觉得可以看看从机的接收缓存的数据时怎么进行读取和处理的,由此判断是不是这个过程太长,导致主机发的部分包没有被收到

使用特权

评论回复
11
Daojia211| | 2013-5-26 16:43 | 只看该作者
谢谢了, 多机通信是我想突破的啊。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

29

主题

258

帖子

2

粉丝