我是新手!请教CC2500跳频的问题?

[复制链接]
 楼主| zhuzi0624 发表于 2007-4-29 16:12 | 显示全部楼层 |阅读模式
各位高手,我现在做CC2500的跳频设计,不过我这个跳频不需要在工作时跳频,只需要在开始的时候搜索到一个合适频段,接下来都在这个频段通信。<br />我现在面临的情况是:CC2500的主从端时间上同步的不是很好,主端发送的数据从端有时能收到,有时不能;而且从端在回发数据给主端的时候,主端根本收不到!我用的MCU是C8051F330!下面是我的收发主程序:<br />void&nbsp;main()//发送端程序<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;char&nbsp;len;<br />&nbsp;&nbsp;&nbsp;&nbsp;int&nbsp;i=0;<br />&nbsp;&nbsp;&nbsp;&nbsp;int&nbsp;k=20;<br />&nbsp;&nbsp;&nbsp;&nbsp;PCA0MD&nbsp;&=&nbsp;~0x40;<br />&nbsp;&nbsp;&nbsp;&nbsp;Init_Device();<br />&nbsp;&nbsp;&nbsp;&nbsp;SPI0CN&nbsp;|=&nbsp;0x01;&nbsp;&nbsp;&nbsp;&nbsp;//enable&nbsp;SPI<br />&nbsp;&nbsp;&nbsp;&nbsp;System_Delay(5000);<br />&nbsp;&nbsp;&nbsp;&nbsp;SetupCC2500();<br />&nbsp;&nbsp;&nbsp;&nbsp;System_Delay(512);<br />&nbsp;&nbsp;&nbsp;&nbsp;len=sizeof(txBuffer_CC2500);<br />&nbsp;&nbsp;&nbsp;&nbsp;while(1)<br />&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;halSpiWriteReg(CC2500_FREQ2,&nbsp;f[0]);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;halSpiWriteReg(CC2500_FREQ1,&nbsp;f[1]);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;halSpiWriteReg(CC2500_FREQ0,&nbsp;f[2]);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;halSpiStrobe(CC2500_SIDLE);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;txBuffer_CC2500[1]=i;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;halRfSendPacket(txBuffer_CC2500,&nbsp;sizeof(txBuffer_CC2500));//试发送消息给接收端<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if(halRfReceivePacket(rxBuffer_CC2500,len))break;//等到对方的回应,得到回应消息跳出<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if((k--)==0)//k从20减到0换一个频段<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;k=20;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;i++;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if(i&gt8)i=0;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;while(1)<br />&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;P13=1;P14=0;//LED显示状态<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />}<br /><br />void&nbsp;main()//接收端主程序<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;char&nbsp;len;<br />&nbsp;&nbsp;&nbsp;&nbsp;int&nbsp;i=0,n=0;<br />&nbsp;&nbsp;&nbsp;&nbsp;int&nbsp;k=180;<br />&nbsp;&nbsp;&nbsp;&nbsp;PCA0MD&nbsp;&=&nbsp;~0x40;<br />&nbsp;&nbsp;&nbsp;&nbsp;Init_Device();<br />&nbsp;&nbsp;&nbsp;&nbsp;SPI0CN&nbsp;|=&nbsp;0x01;&nbsp;&nbsp;&nbsp;&nbsp;//enable&nbsp;SPI<br />&nbsp;&nbsp;&nbsp;&nbsp;System_Delay(5000);<br />&nbsp;&nbsp;&nbsp;&nbsp;SetupCC2500();<br />&nbsp;&nbsp;&nbsp;&nbsp;System_Delay(512);<br />&nbsp;&nbsp;&nbsp;&nbsp;len=sizeof(rxBuffer_CC2500);<br />&nbsp;&nbsp;&nbsp;&nbsp;while(1)<br />&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if(halRfReceivePacket(rxBuffer_CC2500,len))//试接收来自对方的信号<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;halSpiWriteReg(CC2500_FREQ2,&nbsp;f[0]);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;halSpiWriteReg(CC2500_FREQ1,&nbsp;f[1]);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;halSpiWriteReg(CC2500_FREQ0,&nbsp;f[2]);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;halSpiStrobe(CC2500_SIDLE);&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;txBuffer_CC2500[1]=rxBuffer_CC2500[1];//记住频段号<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;halRfSendPacket(txBuffer_CC2500,&nbsp;sizeof(txBuffer_CC2500));//发送回应消息,告诉对方就在该频段通信<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;break;//此时已搜索到频段,跳出,以后都工作在此频段<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if((k--)&gt0)//k从180减到0换一个频段搜索<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;k=180;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;i++;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if(i&gt8)i=0;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;for(n=0;n&ltlen;n++)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;trdata[n]=rxBuffer_CC2500[n];&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;Send_String(trdata,len);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//串口输出数据<br />&nbsp;&nbsp;&nbsp;&nbsp;System_Delay(512);<br />&nbsp;&nbsp;&nbsp;&nbsp;while(1)<br />&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;P13=1;P14=0;//LED显示状态<br />&nbsp;&nbsp;&nbsp;&nbsp;}//数据稍后再做处理<br />}<br /><br />
chunyang 发表于 2007-4-29 17:02 | 显示全部楼层

这里不存在“同步”问题,你的这个系统还称不上是跳频系

&nbsp;&nbsp;&nbsp;&nbsp;IC设置正确的话,能否收到数据只与频点是否相同有关,只是要注意信道稳定时间,芯片建立正常工作态包括设定频点需要一定的时间,只要保证数据发出之前,接收端已经稳定即可。反向通讯时也同样,主端在发送完数据后立刻切换到接收态,而从端收到数据后切换到发送态一定要延时一段时间才能发送数据,以让主端建立正常工作态。
 楼主| zhuzi0624 发表于 2007-4-29 17:42 | 显示全部楼层

发送端不知道怎么判断可以转为接收状态?

接收端可以在看到收到数据的时候用返回值判断然后跳出,但是发送端不知道该怎么处理好?不仅要换频道使劲的发数据而且要接着判断有没有收到回应的数据?<br />现在我是接收端收到数据串口里面已经显示了,接着循环的向发送回发数据,但是回发的数据发送端没有收到,不知道在这回发的时候收发端怎么处理一下好?
chunyang 发表于 2007-4-29 17:46 | 显示全部楼层

发送完直接转换就是,无需什么“判断”。

  
 楼主| zhuzi0624 发表于 2007-4-29 17:55 | 显示全部楼层

就是不知道什么时候是发送成功的,版主你有什么办法么?

因为是频段更换不断的发送,所以不确定是在什么时候能发送成功。能确定频段退出搜索是要在收到接收端的回应信号后,即所谓的握手。可能我真的处理不好吧,版主,你有什么好办法么?
chunyang 发表于 2007-4-29 18:59 | 显示全部楼层

你还是没有理解

数据发完就转接收,不管对方是否收到,而对方是否收到及是否正确要靠接收回复信息来判断。
 楼主| zhuzi0624 发表于 2007-4-30 13:10 | 显示全部楼层

版主,我有发送后就立马转接收,你看

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;halSpiWriteReg(CC2500_FREQ2,&nbsp;f[0]);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;halSpiWriteReg(CC2500_FREQ1,&nbsp;f[1]);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;halSpiWriteReg(CC2500_FREQ0,&nbsp;f[2]);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;halSpiStrobe(CC2500_SIDLE);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;txBuffer_CC2500[1]=i;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;halRfSendPacket(txBuffer_CC2500,&nbsp;sizeof(txBuffer_CC2500));//试发送消息给接收端<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if(halRfReceivePacket(rxBuffer_CC2500,len))break;//等到对方的回应,得到回应消息跳出
chunyang 发表于 2007-4-30 13:21 | 显示全部楼层

注意接收转发送一定要等转换完成后再延时才能发送数据

  
chunyang 发表于 2007-4-30 13:29 | 显示全部楼层

给你个时序

设A为主机、B为从机,初试状态:A发B收。<br />A送数据,送完后立刻转接收同时启动一定时事件,定时周期稍大于T,B收到数据进行判断是否正确及是否该返回数据,如是,转发送态,延时t1,开始发送数据,数据发送时间t2,T=t1+t2,数据发送完毕再转成接收态。A在T内如果收到正确回应则进行下一步处理,如没有,重复刚才的过程并记录出错次数,出错次数超出预设值要采取相应措施如上报或删除B等等。
 楼主| zhuzi0624 发表于 2007-4-30 14:24 | 显示全部楼层

谢谢版主!

  
您需要登录后才可以回帖 登录 | 注册

本版积分规则

1

主题

6

帖子

1

粉丝
快速回复 在线客服 返回列表 返回顶部