OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 24288|回复: 39

ARM学习笔记 NRF24L01的应用 第二季

[复制链接]

71

主题

467

帖子

0

精华

高级会员

Rank: 4

积分
800
金钱
800
注册时间
2011-11-18
在线时间
5 小时
发表于 2012-7-2 02:34:52 | 显示全部楼层 |阅读模式
&nbsp;<div style="widows:2;text-transform:none;text-indent:0px;font:18px 微软雅黑;white-space:normal;orphans:2;letter-spacing:normal;color:#000000;word-spacing:0px;-webkit-text-size-adjust:auto;-webkit-text-stroke-width:0px;"><br class="Apple-interchange-newline" />
首先,是设置发送模式.</div>
<div style="widows:2;text-transform:none;text-indent:0px;font:18px 微软雅黑;white-space:normal;orphans:2;letter-spacing:normal;color:#000000;word-spacing:0px;-webkit-text-size-adjust:auto;-webkit-text-stroke-width:0px;"><br />
</div>
<div style="widows:2;text-transform:none;text-indent:0px;font:18px 微软雅黑;white-space:normal;orphans:2;letter-spacing:normal;color:#000000;word-spacing:0px;-webkit-text-size-adjust:auto;-webkit-text-stroke-width:0px;">
<div>//该函数初始化NRF24L01到TX模式</div>
<div>//设置TX地址,写TX数据宽度,设置RX自动应答的地址,填充TX发送数据,选择RF频道,波特率和LNA HCURR</div>
<div>//PWR_UP,CRC使能</div>
<div>//当CE变高后,即进入RX模式,并可以接收数据了<span style="white-space:pre;" class="Apple-tab-span"> </span><span class="Apple-converted-space">&nbsp;</span>&nbsp;&nbsp;</div>
<div>//CE为高大于10us,则启动发送.<span style="white-space:pre;" class="Apple-tab-span"> </span>&nbsp;</div>
<div>void TX_Mode(void)</div>
<div>{<span style="white-space:pre;" class="Apple-tab-span"> </span>&nbsp;</div>
<div>NRF24L01_CE=0;</div>
<div><br />
</div>
<div>NRF24L01_Write_Reg(FLUSH_TX,0xff);//清除TX FIFO寄存器</div>
<div><span class="Apple-converted-space">&nbsp;</span>&nbsp; &nbsp;</div>
<div>&nbsp;<span class="Apple-converted-space">&nbsp;</span><span style="white-space:pre;" class="Apple-tab-span"> </span>NRF24L01_Write_Buf(WRITE_REG+TX_ADDR,(u8*)TX_ADDRESS,TX_ADR_WIDTH);//写TX节点地址&nbsp;</div>
<div>&nbsp;<span class="Apple-converted-space">&nbsp;</span><span style="white-space:pre;" class="Apple-tab-span"> </span>NRF24L01_Write_Buf(WRITE_REG+RX_ADDR_P0,(u8*)RX_ADDRESS,RX_ADR_WIDTH); //设置TX节点地址,主要为了使能ACK<span style="white-space:pre;" class="Apple-tab-span"> </span><span class="Apple-converted-space">&nbsp;</span>&nbsp;</div>
<div><br />
</div>
<div>&nbsp;<span class="Apple-converted-space">&nbsp;</span><span style="white-space:pre;" class="Apple-tab-span"> </span>NRF24L01_Write_Reg(WRITE_REG+EN_AA,0x01); &nbsp; &nbsp; //使能通道0的自动应答 &nbsp; &nbsp;</div>
<div>&nbsp;<span class="Apple-converted-space">&nbsp;</span><span style="white-space:pre;" class="Apple-tab-span"> </span>NRF24L01_Write_Reg(WRITE_REG+EN_RXADDR,0x01); //使能通道0的接收地址 &nbsp;</div>
<div>&nbsp;<span class="Apple-converted-space">&nbsp;</span><span style="white-space:pre;" class="Apple-tab-span"> </span>NRF24L01_Write_Reg(WRITE_REG+SETUP_RETR,0x1a);//设置自动重发间隔时间:500us + 86us;最大自动重发次数:10次</div>
<div>&nbsp;<span class="Apple-converted-space">&nbsp;</span><span style="white-space:pre;" class="Apple-tab-span"> </span>NRF24L01_Write_Reg(WRITE_REG+RF_CH,40); &nbsp; &nbsp; &nbsp; //设置RF通道为40</div>
<div>&nbsp;<span class="Apple-converted-space">&nbsp;</span><span style="white-space:pre;" class="Apple-tab-span"> </span>NRF24L01_Write_Reg(WRITE_REG+RF_SETUP,0x0f); &nbsp;//设置TX发射参数,0db增益,2Mbps,低噪声增益开启 &nbsp;&nbsp;</div>
<div>&nbsp;<span class="Apple-converted-space">&nbsp;</span><span style="white-space:pre;" class="Apple-tab-span"> </span>NRF24L01_Write_Reg(WRITE_REG+CONFIG,0x0e); &nbsp; &nbsp;//配置基本工作模式的参数WR_UP,EN_CRC,16BIT_CRC,接收模式,开启所有中断</div>
<div><br />
</div>
<div>NRF24L01_CE=1;//CE为高,10us后启动发送</div>
<div>}<span style="white-space:pre;" class="Apple-tab-span"> </span><span class="Apple-converted-space">&nbsp;</span>&nbsp;</div>
</div>
<div style="widows:2;text-transform:none;text-indent:0px;font:18px 微软雅黑;white-space:normal;orphans:2;letter-spacing:normal;color:#000000;word-spacing:0px;-webkit-text-size-adjust:auto;-webkit-text-stroke-width:0px;"><br />
</div>
<div style="widows:2;text-transform:none;text-indent:0px;font:18px 微软雅黑;white-space:normal;orphans:2;letter-spacing:normal;color:#000000;word-spacing:0px;-webkit-text-size-adjust:auto;-webkit-text-stroke-width:0px;">
<ol>
<li>第一要设置要发的地址,比方说你要发信给一个人,这个人的地址是那呢,你得填一个地址在信封上是不是(当然,对现在的很多90后来说,信是啥东东可能都不知道了)</li>
<li>第二个要做的是人家收到信后得告诉你是不是,那他丢信息到那让你知道呢???<span class="Apple-converted-space">&nbsp;</span><span style="color:#ff0000;">发明NRF24的GOD 专们给它一个地方接收回信的,那就是 0频道!!!! 所以,发达模式很简单,就两个频道有用,一个是TX_ADDR,一个是RX_ADDR_P0. 其它的RX_ADDR_Px &nbsp;你可以无视.在发送模式,他们都是废柴,没用的!!! 记住了.</span></li>
<li><span style="color:#ff0000;"><span style="color:#000000;">第三个就是 使能通道0的自动应答,感觉很无聊.脱裤子放屁呀,这是发达模式必须做的呀,一进入发送模式自动进入</span></span><span class="Apple-converted-space">&nbsp;</span>使能通道0的自动应答 不就行了吗?真搞不懂!可能中国人来做这个可能就没这个事了.</li>
<li>第四个就是&nbsp; 使能通道0的接收地址&nbsp; &nbsp;和第3一样,无聊至极!</li>
<li>第五个就是&nbsp;&nbsp;设置自动重发间隔时间:500us + 86us;最大自动重发次数:10次 &nbsp;这个NRF24的说明书说得很清楚,大家看说明书的<span style="color:#ffa500;">04寄存器</span>,说得很清楚,有多种选择的.</li>
<li>第六个就是 &nbsp;和第五一样,看说明书的<span style="color:#ffa500;">05寄存器</span>,也说得清楚,大家可以设不同的频率玩一下.但你的接收器一定要在一定的频率!</li>
<li>第七个就是 &nbsp;同上,大家看说明书的<span class="Apple-converted-space">&nbsp;</span><span style="color:#ffa500;">06寄存器.</span><span class="Apple-converted-space">&nbsp;</span>也说得清楚.</li>
<li>第八个 这个是必做的, 大家看很重要的一个寄存器<span class="Apple-converted-space">&nbsp;</span><span style="color:#ff0000;">00寄存器! 看低四位的说明.<span class="Apple-converted-space">&nbsp;</span></span>设好后,相当于将电闸打开,说: &nbsp; &nbsp;偶射了~~~~~~~~~~~~</li>
</ol>
<div><br />
</div>
</div>
<div style="widows:2;text-transform:none;text-indent:0px;font:18px 微软雅黑;white-space:normal;orphans:2;letter-spacing:normal;color:#000000;word-spacing:0px;-webkit-text-size-adjust:auto;-webkit-text-stroke-width:0px;"><br />
</div>
<div style="widows:2;text-transform:none;text-indent:0px;font:18px 微软雅黑;white-space:normal;orphans:2;letter-spacing:normal;color:#000000;word-spacing:0px;-webkit-text-size-adjust:auto;-webkit-text-stroke-width:0px;">发送模式很简单,很明白. 下面我来说接收摸式.有必要说的一样是:<span style="color:#ff0000;">接收摸式下可以不设置发送的有效数据宽度,但接收模式一定要!!</span></div>
<div style="widows:2;text-transform:none;text-indent:0px;font:18px 微软雅黑;white-space:normal;orphans:2;letter-spacing:normal;color:#000000;word-spacing:0px;-webkit-text-size-adjust:auto;-webkit-text-stroke-width:0px;"><span style="color:#ff0000;"><br />
</span></div>
<div style="widows:2;text-transform:none;text-indent:0px;font:18px 微软雅黑;white-space:normal;orphans:2;letter-spacing:normal;color:#000000;word-spacing:0px;-webkit-text-size-adjust:auto;-webkit-text-stroke-width:0px;">上一季我说过我们比方设定的接收地址是:</div>
<div style="widows:2;text-transform:none;text-indent:0px;font:18px 微软雅黑;white-space:normal;orphans:2;letter-spacing:normal;color:#000000;word-spacing:0px;-webkit-text-size-adjust:auto;-webkit-text-stroke-width:0px;"><br />
</div>
<div style="widows:2;text-transform:none;text-indent:0px;font:18px 微软雅黑;white-space:normal;orphans:2;letter-spacing:normal;color:#000000;word-spacing:0px;-webkit-text-size-adjust:auto;-webkit-text-stroke-width:0px;">
<div>
<div>
<div>const u8 TX_ADDRESS[TX_ADR_WIDTH]={0xe7,0xe7,0xe7,0xe7,0xe7}; //发送地址</div>
<div><br />
</div>
<div>const u8 RX_ADDRESS &nbsp;[RX_ADR_WIDTH]={0x01,0x01,0xc2,0xc2,0xc2}; //接收0通道地址</div>
<div>const u8 RX_ADDRESS1[RX_ADR_WIDTH]={0x02,<span style="color:#ff0000;">0x01,0xc2,0xc2,0xc2</span>}; //接收1通道地址</div>
<div><br />
</div>
<div>const u8 RX_ADDRESS2[RX_ADR_WIDTH]={<span style="color:#ffa500;">0xc2,0xc2,0xc2,0xc1,</span>0x03}; //接收2通道地址</div>
<div>const u8 RX_ADDRESS3[RX_ADR_WIDTH]={<span style="color:#ffa500;">0xc2,0xc2,0xc2,0xc1,</span>0x04}; //接收3通道地址</div>
<div>const u8 RX_ADDRESS4[RX_ADR_WIDTH]={<span style="color:#ffa500;">0x02,0xc2,0xc2,0xc1,</span>0x05}; //接收4通道地址</div>
<div>const u8 RX_ADDRESS5[RX_ADR_WIDTH]={<span style="color:#ffa500;">0xc2,0xc2,0xc2,0xc1,</span>0x06}; //接收5通道地址</div>
</div>
</div>
<div><br />
</div>
<div><br />
</div>
<div>看到没,有人说怪了,你怎么能这么设,说明书不是低字节在前.高字节在后写进地址寄存器的吗?对了!!!!!<span class="Apple-converted-space">&nbsp;</span><span style="color:#ff0000;">现在的说明书很坑爹</span>!!!</div>
<div><span style="color:#ff0000;">其实,在写入第2,3,4,5通道地址的时候,无论你写多少个进去,它只认最后一个!!!!!为什么没人发现??因为大家只用0和1频道玩完就OK了!!没人去玩其它通道!!因为0和1频道按说明书做是没事的!!</span></div>
<div>因为只认一个,所以我们更改一下接收地址.</div>
<br class="Apple-interchange-newline" />
</div>
<div style="widows:2;text-transform:none;text-indent:0px;font:18px 微软雅黑;white-space:normal;orphans:2;letter-spacing:normal;color:#000000;word-spacing:0px;-webkit-text-size-adjust:auto;-webkit-text-stroke-width:0px;">
<div>const u8 TX_ADDRESS[TX_ADR_WIDTH]={0xe7,0xe7,0xe7,0xe7,0xe7}; //发送地址</div>
<div><br />
</div>
<div>const u8 RX_ADDRESS &nbsp;[RX_ADR_WIDTH]={0x01,0x01,0xc2,0xc2,0xc2}; //接收0通道地址</div>
<div>const u8 RX_ADDRESS1[RX_ADR_WIDTH]={0x02,<span style="color:#ff0000;">0x01,0xc2,0xc2,0xc2</span>}; //接收1通道地址</div>
<div><br />
</div>
<div>const u8 RX_ADDRESS2[RX_ADR_WIDTH]={<span style="color:#ff0000;">0x03</span>}; //接收2通道地址</div>
<div>const u8 RX_ADDRESS3[RX_ADR_WIDTH]={<span style="color:#ff0000;">0x04</span>}; //接收3通道地址</div>
<div>const u8 RX_ADDRESS4[RX_ADR_WIDTH]={<span style="color:#ff0000;">0x05</span>}; //接收4通道地址</div>
<div>const u8 RX_ADDRESS5[RX_ADR_WIDTH]={<span style="color:#ff0000;">0x06</span>}; //接收5通道地址</div>
</div>
<div style="widows:2;text-transform:none;text-indent:0px;font:18px 微软雅黑;white-space:normal;orphans:2;letter-spacing:normal;color:#000000;word-spacing:0px;-webkit-text-size-adjust:auto;-webkit-text-stroke-width:0px;"><br />
</div>
<div style="widows:2;text-transform:none;text-indent:0px;font:18px 微软雅黑;white-space:normal;orphans:2;letter-spacing:normal;color:#000000;word-spacing:0px;-webkit-text-size-adjust:auto;-webkit-text-stroke-width:0px;">然后接收模式代码如下:</div>
<div style="widows:2;text-transform:none;text-indent:0px;font:18px 微软雅黑;white-space:normal;orphans:2;letter-spacing:normal;color:#000000;word-spacing:0px;-webkit-text-size-adjust:auto;-webkit-text-stroke-width:0px;"><br />
</div>
<div style="widows:2;text-transform:none;text-indent:0px;font:18px 微软雅黑;white-space:normal;orphans:2;letter-spacing:normal;color:#000000;word-spacing:0px;-webkit-text-size-adjust:auto;-webkit-text-stroke-width:0px;">
<div>//该函数初始化NRF24L01到RX模式</div>
<div>//设置RX地址,写RX数据宽度,选择RF频道,波特率和LNA HCURR</div>
<div>//当CE变高后,即进入RX模式,并可以接收数据了<span style="white-space:pre;" class="Apple-tab-span"> </span><span class="Apple-converted-space">&nbsp;</span>&nbsp;&nbsp;</div>
<div>void RX_Mode(void)</div>
<div>{</div>
<div>NRF24L01_CE=0;</div>
<div></div>
<div>NRF24L01_Write_Reg(FLUSH_RX,0xff);//清除TX FIFO寄存器</div>
<div><span class="Apple-converted-space">&nbsp;</span>&nbsp;</div>
<div>NRF24L01_Write_Buf(WRITE_REG+RX_ADDR_P0,(u8*)RX_ADDRESS,RX_ADR_WIDTH);//写RX节点地址</div>
<div>NRF24L01_Write_Buf(WRITE_REG+RX_ADDR_P1,(u8*)RX_ADDRESS1,RX_ADR_WIDTH);//写RX节点地址</div>
<div><br />
</div>
<div>&nbsp; &nbsp; &nbsp; &nbsp; NRF24L01_Write_Buf(WRITE_REG+RX_ADDR_P2,(u8*)RX_ADDRESS2,<span style="color:#ff0000;">1</span>);//写RX节点地址</div>
<div>NRF24L01_Write_Buf(WRITE_REG+RX_ADDR_P3,(u8*)RX_ADDRESS3,<span style="color:#ff0000;">1</span>);//写RX节点地址</div>
<div>NRF24L01_Write_Buf(WRITE_REG+RX_ADDR_P4,(u8*)RX_ADDRESS4,<span style="color:#ff0000;">1</span>);//写RX节点地址</div>
<div>NRF24L01_Write_Buf(WRITE_REG+RX_ADDR_P5,(u8*)RX_ADDRESS5,<span style="color:#ff0000;">1</span>);//写RX节点地址</div>
<div><span class="Apple-converted-space">&nbsp;</span>&nbsp;</div>
<div>&nbsp;<span class="Apple-converted-space">&nbsp;</span><span style="white-space:pre;" class="Apple-tab-span"> </span>NRF24L01_Write_Reg(WRITE_REG+EN_AA,0x3f); &nbsp; &nbsp;//使能通道0的自动应答 &nbsp; &nbsp;</div>
<div>&nbsp;<span class="Apple-converted-space">&nbsp;</span><span style="white-space:pre;" class="Apple-tab-span"> </span>NRF24L01_Write_Reg(WRITE_REG+EN_RXADDR,0x3f);//使能通道0-5的接收地址&nbsp;</div>
<div><span class="Apple-converted-space">&nbsp;</span><span style="white-space:pre;" class="Apple-tab-span"> </span>&nbsp;</div>
<div>&nbsp;<span class="Apple-converted-space">&nbsp;</span><span style="white-space:pre;" class="Apple-tab-span"> </span>NRF24L01_Write_Reg(WRITE_REG+RF_CH,40);<span style="white-space:pre;" class="Apple-tab-span"> </span><span class="Apple-converted-space">&nbsp;</span>&nbsp; &nbsp; //设置RF通信频率</div>
<div><span class="Apple-converted-space">&nbsp;</span>&nbsp;</div>
<div>&nbsp;<span class="Apple-converted-space">&nbsp;</span><span style="white-space:pre;" class="Apple-tab-span"> </span>NRF24L01_Write_Reg(WRITE_REG+RX_PW_P0,RX_PLOAD_WIDTH);//选择通道0的有效数据宽度&nbsp;</div>
<div>&nbsp;<span class="Apple-converted-space">&nbsp;</span><span style="white-space:pre;" class="Apple-tab-span"> </span>NRF24L01_Write_Reg(WRITE_REG+RX_PW_P1,RX_PLOAD_WIDTH);//选择通道0的有效数据宽度&nbsp;</div>
<div>&nbsp;<span class="Apple-converted-space">&nbsp;</span><span style="white-space:pre;" class="Apple-tab-span"> </span>NRF24L01_Write_Reg(WRITE_REG+RX_PW_P2,RX_PLOAD_WIDTH);//选择通道0的有效数据宽度&nbsp;</div>
<div>&nbsp;<span class="Apple-converted-space">&nbsp;</span><span style="white-space:pre;" class="Apple-tab-span"> </span>NRF24L01_Write_Reg(WRITE_REG+RX_PW_P3,RX_PLOAD_WIDTH);//选择通道0的有效数据宽度&nbsp;</div>
<div>&nbsp;<span class="Apple-converted-space">&nbsp;</span><span style="white-space:pre;" class="Apple-tab-span"> </span>NRF24L01_Write_Reg(WRITE_REG+RX_PW_P4,RX_PLOAD_WIDTH);//选择通道0的有效数据宽度&nbsp;</div>
<div>&nbsp;<span class="Apple-converted-space">&nbsp;</span><span style="white-space:pre;" class="Apple-tab-span"> </span>NRF24L01_Write_Reg(WRITE_REG+RX_PW_P5,RX_PLOAD_WIDTH);//选择通道0的有效数据宽度&nbsp;</div>
<div><br />
</div>
<div>&nbsp;<span class="Apple-converted-space">&nbsp;</span><span style="white-space:pre;" class="Apple-tab-span"> </span>NRF24L01_Write_Reg(WRITE_REG+RF_SETUP,0x0f);//设置TX发射参数,0db增益,2Mbps,低噪声增益开启&nbsp;</div>
<div><span class="Apple-converted-space">&nbsp;</span>&nbsp;</div>
<div>&nbsp;<span class="Apple-converted-space">&nbsp;</span><span style="white-space:pre;" class="Apple-tab-span"> </span>NRF24L01_Write_Reg(WRITE_REG+CONFIG, 0x0f);//配置基本工作模式的参数WR_UP,EN_CRC,16BIT_CRC,接收模式&nbsp;</div>
<div><br />
</div>
<div>&nbsp;<span class="Apple-converted-space">&nbsp;</span><span style="white-space:pre;" class="Apple-tab-span"> </span>NRF24L01_CE = 1; //CE为高,进入接收模式&nbsp;</div>
<div>}<span style="white-space:pre;" class="Apple-tab-span"> </span>&nbsp;&nbsp;</div>
</div>
<div style="widows:2;text-transform:none;text-indent:0px;font:18px 微软雅黑;white-space:normal;orphans:2;letter-spacing:normal;color:#000000;word-spacing:0px;-webkit-text-size-adjust:auto;-webkit-text-stroke-width:0px;"><br />
</div>
<div style="widows:2;text-transform:none;text-indent:0px;font:18px 微软雅黑;white-space:normal;orphans:2;letter-spacing:normal;color:#000000;word-spacing:0px;-webkit-text-size-adjust:auto;-webkit-text-stroke-width:0px;"><br />
</div>
<div style="widows:2;text-transform:none;text-indent:0px;font:18px 微软雅黑;white-space:normal;orphans:2;letter-spacing:normal;color:#000000;word-spacing:0px;-webkit-text-size-adjust:auto;-webkit-text-stroke-width:0px;"><span style="color:#ff0000;">看到红色1没有,只写一个进去就够了!!到时要读这个寄存器,也是读一个出来就行了,无论你读多少个,都和第一个一样的.</span></div>
<div style="widows:2;text-transform:none;text-indent:0px;font:18px 微软雅黑;white-space:normal;orphans:2;letter-spacing:normal;color:#000000;word-spacing:0px;-webkit-text-size-adjust:auto;-webkit-text-stroke-width:0px;"><span style="color:#ff0000;"><br />
</span></div>
<div style="widows:2;text-transform:none;text-indent:0px;font:18px 微软雅黑;white-space:normal;orphans:2;letter-spacing:normal;color:#000000;word-spacing:0px;-webkit-text-size-adjust:auto;-webkit-text-stroke-width:0px;">说明一下:</div>
<div style="widows:2;text-transform:none;text-indent:0px;font:18px 微软雅黑;white-space:normal;orphans:2;letter-spacing:normal;color:#000000;word-spacing:0px;-webkit-text-size-adjust:auto;-webkit-text-stroke-width:0px;"><br />
</div>
<div style="widows:2;text-transform:none;text-indent:0px;font:18px 微软雅黑;white-space:normal;orphans:2;letter-spacing:normal;color:#000000;word-spacing:0px;-webkit-text-size-adjust:auto;-webkit-text-stroke-width:0px;">
<ol>
<li>第0行 &nbsp; NRF24L01_CE=0; &nbsp;设置时一定要先拉低!</li>
<li>第一行,清掉RX_FIFO寄存器.</li>
<li>第二行,在频道0的门上写上接收地址!</li>
<li>第三行,在频道1的门上写上接收地址!</li>
<li><span style="color:#ff0000;">从频道2开始,只写一位就行了,因为他的门上的从高8位一直到高39位已经写上去了,现在只能写最低8位.</span></li>
<li>第四行,在频道2的门上写上最底8位接收地址!</li>
<li>第五行,在频道3的门上写上最底8位接收地址!</li>
<li>第六行,在频道4的门上写上最底8位接收地址!</li>
<li>第七行,在频道5的门上写上最底8位接收地址!</li>
</ol>
<div><br />
</div>
</div>
<div style="widows:2;text-transform:none;text-indent:0px;font:18px 微软雅黑;white-space:normal;orphans:2;letter-spacing:normal;color:#000000;word-spacing:0px;-webkit-text-size-adjust:auto;-webkit-text-stroke-width:0px;">然后:</div>
<div style="widows:2;text-transform:none;text-indent:0px;font:18px 微软雅黑;white-space:normal;orphans:2;letter-spacing:normal;color:#000000;word-spacing:0px;-webkit-text-size-adjust:auto;-webkit-text-stroke-width:0px;">
<div>&nbsp;&nbsp;<span style="white-space:pre;" class="Apple-tab-span"> </span>NRF24L01_Write_Reg(WRITE_REG+EN_AA,0x3f); &nbsp; &nbsp;//使能通道0的自动应答&nbsp;</div>
<div><br />
</div>
<div>这一行是启动 0至5频道的自动应答! 0x3f=00111111<span class="Apple-converted-space">&nbsp;</span><span style="color:#ff0000;">&nbsp;也可以不要,因为复位值就是0x3f!!!!</span></div>
<div>这一行的意思是,收到信后将自己的地址号码自动发回给发信方.让发信方知道接收方收到信了.如果这里不设置会玩死发信方,发信会拼命发同一包数据给你.或向他的老板(主程式)说信发丢了!!哈哈!!</div>
<div><br />
</div>
<div>然后</div>
<div><br />
</div>
<div>&nbsp;&nbsp;<span style="white-space:pre;" class="Apple-tab-span"> </span>NRF24L01_Write_Reg(WRITE_REG+EN_RXADDR,0x3f);//使能通道0的接收地址&nbsp;</div>
<div>&nbsp;<span style="white-space:pre;" class="Apple-tab-span"> </span>&nbsp;</div>
<div>&nbsp;&nbsp;<span style="white-space:pre;" class="Apple-tab-span"> </span>NRF24L01_Write_Reg(WRITE_REG+RF_CH,40);<span style="white-space:pre;" class="Apple-tab-span"> </span>&nbsp;&nbsp; &nbsp; //设置RF通信频率</div>
</div>
<div style="widows:2;text-transform:none;text-indent:0px;font:18px 微软雅黑;white-space:normal;orphans:2;letter-spacing:normal;color:#000000;word-spacing:0px;-webkit-text-size-adjust:auto;-webkit-text-stroke-width:0px;"><br />
</div>
<div style="widows:2;text-transform:none;text-indent:0px;font:18px 微软雅黑;white-space:normal;orphans:2;letter-spacing:normal;color:#000000;word-spacing:0px;-webkit-text-size-adjust:auto;-webkit-text-stroke-width:0px;"><br />
</div>
<div style="widows:2;text-transform:none;text-indent:0px;font:18px 微软雅黑;white-space:normal;orphans:2;letter-spacing:normal;color:#000000;word-spacing:0px;-webkit-text-size-adjust:auto;-webkit-text-stroke-width:0px;"><span style="color:#ff0000;">这些和发送模式一样样,一定要一样,要不收不到的.</span></div>
<div style="widows:2;text-transform:none;text-indent:0px;font:18px 微软雅黑;white-space:normal;orphans:2;letter-spacing:normal;color:#000000;word-spacing:0px;-webkit-text-size-adjust:auto;-webkit-text-stroke-width:0px;"><br />
</div>
<div style="widows:2;text-transform:none;text-indent:0px;font:18px 微软雅黑;white-space:normal;orphans:2;letter-spacing:normal;color:#000000;word-spacing:0px;-webkit-text-size-adjust:auto;-webkit-text-stroke-width:0px;">然后就是:</div>
<div style="widows:2;text-transform:none;text-indent:0px;font:18px 微软雅黑;white-space:normal;orphans:2;letter-spacing:normal;color:#000000;word-spacing:0px;-webkit-text-size-adjust:auto;-webkit-text-stroke-width:0px;"><br />
</div>
<div style="widows:2;text-transform:none;text-indent:0px;font:18px 微软雅黑;white-space:normal;orphans:2;letter-spacing:normal;color:#000000;word-spacing:0px;-webkit-text-size-adjust:auto;-webkit-text-stroke-width:0px;">
<div>&nbsp;&nbsp;<span style="white-space:pre;" class="Apple-tab-span"> </span>NRF24L01_Write_Reg(WRITE_REG+RX_PW_P0,RX_PLOAD_WIDTH);//选择通道0的有效数据宽度&nbsp;</div>
<div>&nbsp;&nbsp;<span style="white-space:pre;" class="Apple-tab-span"> </span>NRF24L01_Write_Reg(WRITE_REG+RX_PW_P1,RX_PLOAD_WIDTH);//选择通道0的有效数据宽度&nbsp;</div>
<div>&nbsp;&nbsp;<span style="white-space:pre;" class="Apple-tab-span"> </span>NRF24L01_Write_Reg(WRITE_REG+RX_PW_P2,RX_PLOAD_WIDTH);//选择通道0的有效数据宽度&nbsp;</div>
<div>&nbsp;&nbsp;<span style="white-space:pre;" class="Apple-tab-span"> </span>NRF24L01_Write_Reg(WRITE_REG+RX_PW_P3,RX_PLOAD_WIDTH);//选择通道0的有效数据宽度&nbsp;</div>
<div>&nbsp;&nbsp;<span style="white-space:pre;" class="Apple-tab-span"> </span>NRF24L01_Write_Reg(WRITE_REG+RX_PW_P4,RX_PLOAD_WIDTH);//选择通道0的有效数据宽度&nbsp;</div>
<div>&nbsp;&nbsp;<span style="white-space:pre;" class="Apple-tab-span"> </span>NRF24L01_Write_Reg(WRITE_REG+RX_PW_P5,RX_PLOAD_WIDTH);//选择通道0的有效数据宽度&nbsp;</div>
</div>
<div style="widows:2;text-transform:none;text-indent:0px;font:18px 微软雅黑;white-space:normal;orphans:2;letter-spacing:normal;color:#000000;word-spacing:0px;-webkit-text-size-adjust:auto;-webkit-text-stroke-width:0px;"><br />
</div>
<div style="widows:2;text-transform:none;text-indent:0px;font:18px 微软雅黑;white-space:normal;orphans:2;letter-spacing:normal;color:#000000;word-spacing:0px;-webkit-text-size-adjust:auto;-webkit-text-stroke-width:0px;">这个一定要设呀,要不RX_FIFO不鸟你,说木有收到信!!</div>
<div style="widows:2;text-transform:none;text-indent:0px;font:18px 微软雅黑;white-space:normal;orphans:2;letter-spacing:normal;color:#000000;word-spacing:0px;-webkit-text-size-adjust:auto;-webkit-text-stroke-width:0px;"><br />
</div>
<div style="widows:2;text-transform:none;text-indent:0px;font:18px 微软雅黑;white-space:normal;orphans:2;letter-spacing:normal;color:#000000;word-spacing:0px;-webkit-text-size-adjust:auto;-webkit-text-stroke-width:0px;">然后这一行:</div>
<div style="widows:2;text-transform:none;text-indent:0px;font:18px 微软雅黑;white-space:normal;orphans:2;letter-spacing:normal;color:#000000;word-spacing:0px;-webkit-text-size-adjust:auto;-webkit-text-stroke-width:0px;">NRF24L01_Write_Reg(WRITE_REG+RF_SETUP,0x0f);//设置TX发射参数,0db增益,2Mbps,低噪声增益开启&nbsp;</div>
<div style="widows:2;text-transform:none;text-indent:0px;font:18px 微软雅黑;white-space:normal;orphans:2;letter-spacing:normal;color:#000000;word-spacing:0px;-webkit-text-size-adjust:auto;-webkit-text-stroke-width:0px;"><br />
</div>
<div style="widows:2;text-transform:none;text-indent:0px;font:18px 微软雅黑;white-space:normal;orphans:2;letter-spacing:normal;color:#000000;word-spacing:0px;-webkit-text-size-adjust:auto;-webkit-text-stroke-width:0px;">看说明书 06寄存器.说得很明白,这就不说了.</div>
<div style="widows:2;text-transform:none;text-indent:0px;font:18px 微软雅黑;white-space:normal;orphans:2;letter-spacing:normal;color:#000000;word-spacing:0px;-webkit-text-size-adjust:auto;-webkit-text-stroke-width:0px;"><br />
</div>
<div style="widows:2;text-transform:none;text-indent:0px;font:18px 微软雅黑;white-space:normal;orphans:2;letter-spacing:normal;color:#000000;word-spacing:0px;-webkit-text-size-adjust:auto;-webkit-text-stroke-width:0px;">最后是 &nbsp;NRF24L01_Write_Reg(WRITE_REG+CONFIG, 0x0f);//配置基本工作模式的参数WR_UP,EN_CRC,16BIT_CRC,接收模式&nbsp;</div>
<div style="widows:2;text-transform:none;text-indent:0px;font:18px 微软雅黑;white-space:normal;orphans:2;letter-spacing:normal;color:#000000;word-spacing:0px;-webkit-text-size-adjust:auto;-webkit-text-stroke-width:0px;">就是说 你准备好了,收信~~~~~~~~~~~~~~~(我不能用发射模式的方式来打比方,太......儿童不宜了)</div>
<div style="widows:2;text-transform:none;text-indent:0px;font:18px 微软雅黑;white-space:normal;orphans:2;letter-spacing:normal;color:#000000;word-spacing:0px;-webkit-text-size-adjust:auto;-webkit-text-stroke-width:0px;"><br />
</div>
<div style="widows:2;text-transform:none;text-indent:0px;font:18px 微软雅黑;white-space:normal;orphans:2;letter-spacing:normal;color:#000000;word-spacing:0px;-webkit-text-size-adjust:auto;-webkit-text-stroke-width:0px;">好了,到此为止,都说完了,大家用以上的代码就可以开玩了.明天我会帖全部的代码给大家下载.代码显示部分都是TFT那几季的.我就不详细说了,反正很代码很直白不拐弯的,很好读.</div>
<div style="widows:2;text-transform:none;text-indent:0px;font:18px 微软雅黑;white-space:normal;orphans:2;letter-spacing:normal;color:#000000;word-spacing:0px;-webkit-text-size-adjust:auto;-webkit-text-stroke-width:0px;">但要全试了,可要两块板子噢.那原子老大发大了.......................</div>
<div style="widows:2;text-transform:none;text-indent:0px;font:18px 微软雅黑;white-space:normal;orphans:2;letter-spacing:normal;color:#000000;word-spacing:0px;-webkit-text-size-adjust:auto;-webkit-text-stroke-width:0px;"><br />
</div>
<div style="widows:2;text-transform:none;text-indent:0px;font:18px 微软雅黑;white-space:normal;orphans:2;letter-spacing:normal;color:#000000;word-spacing:0px;-webkit-text-size-adjust:auto;-webkit-text-stroke-width:0px;">明天还会帖一些发现的问题,说明书上没说的.</div>
我的工作就是天天在玩
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165309
金钱
165309
注册时间
2010-12-1
在线时间
2108 小时
发表于 2012-7-2 09:02:46 | 显示全部楼层
通道的问题,2~5的地址你确定只有一位有效?
<br>很多人说多机通信调不通,怀疑可能是你说的这个地方出问题了.
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

71

主题

467

帖子

0

精华

高级会员

Rank: 4

积分
800
金钱
800
注册时间
2011-11-18
在线时间
5 小时
 楼主| 发表于 2012-7-2 12:19:41 | 显示全部楼层
很多人多机搞不通就是卡这里了,说明书说得很坑爹,不知是不是故意的。
我的工作就是天天在玩
回复 支持 反对

使用道具 举报

71

主题

467

帖子

0

精华

高级会员

Rank: 4

积分
800
金钱
800
注册时间
2011-11-18
在线时间
5 小时
 楼主| 发表于 2012-7-2 14:32:48 | 显示全部楼层
都通的,我现在就在用,设五个频道,读出的数据全对。
我的工作就是天天在玩
回复 支持 反对

使用道具 举报

头像被屏蔽

95

主题

159

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
442
金钱
442
注册时间
2011-3-22
在线时间
6 小时
发表于 2012-7-2 17:24:19 | 显示全部楼层
提示: 作者被禁止或删除 内容自动屏蔽
回复 支持 反对

使用道具 举报

71

主题

467

帖子

0

精华

高级会员

Rank: 4

积分
800
金钱
800
注册时间
2011-11-18
在线时间
5 小时
 楼主| 发表于 2012-7-2 21:19:08 | 显示全部楼层
你查一下主程式,誤碼率幾乎沒有的,是不是你又讀多了一次0x07寄存器?还有,即使有中斷,RX_ADDRESS都有可能是空的,要重读一次。
我的工作就是天天在玩
回复 支持 反对

使用道具 举报

12

主题

216

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
313
金钱
313
注册时间
2011-4-7
在线时间
3 小时
发表于 2012-8-25 13:16:48 | 显示全部楼层
学习
回复 支持 反对

使用道具 举报

6

主题

18

帖子

0

精华

初级会员

Rank: 2

积分
62
金钱
62
注册时间
2012-6-16
在线时间
0 小时
发表于 2012-10-6 20:05:14 | 显示全部楼层
回复【3楼】chinafox:
<br>很多人多机搞不通就是卡这里了,说明书说得很坑爹,不知是不是故意的。
<br>---------------------------------
<br>您好,按照你的说法,我用51做了,通道2、3、4、5还是发不了数据?是什么问题呢?
回复 支持 反对

使用道具 举报

71

主题

467

帖子

0

精华

高级会员

Rank: 4

积分
800
金钱
800
注册时间
2011-11-18
在线时间
5 小时
 楼主| 发表于 2012-10-12 12:33:57 | 显示全部楼层
你查一下代碼,我也用51做了,照搬過去的,沒有問題,現在我新搞的板子所有都帶無線接口
<br>
我的工作就是天天在玩
回复 支持 反对

使用道具 举报

46

主题

177

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
381
金钱
381
注册时间
2012-5-2
在线时间
0 小时
发表于 2012-10-12 13:44:27 | 显示全部楼层
mark
回复 支持 反对

使用道具 举报

1

主题

10

帖子

0

精华

新手上路

积分
34
金钱
34
注册时间
2013-1-12
在线时间
0 小时
发表于 2013-3-9 16:57:02 | 显示全部楼层
LZ&nbsp;&nbsp;感谢你的指点;
<br>有点地方我不是很明白,
<br>:接收摸式下可以不设置发送的有效数据宽度,但接收模式一定要!!
<br>到底是接收模式要还是发送模式要有效数据宽度,为什么
希望遇到更多有相同兴趣的盆友来一起交流
回复 支持 反对

使用道具 举报

71

主题

467

帖子

0

精华

高级会员

Rank: 4

积分
800
金钱
800
注册时间
2011-11-18
在线时间
5 小时
 楼主| 发表于 2013-3-11 00:41:40 | 显示全部楼层
接收模式,恩为FIFO的原因。
我的工作就是天天在玩
回复 支持 反对

使用道具 举报

15

主题

95

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
267
金钱
267
注册时间
2012-11-5
在线时间
11 小时
发表于 2013-3-28 16:26:40 | 显示全部楼层
mark一个!顶一个!
学习之路漫长而修远......
回复 支持 反对

使用道具 举报

2

主题

45

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
382
金钱
382
注册时间
2013-3-28
在线时间
36 小时
发表于 2013-3-28 17:08:09 | 显示全部楼层
很好的参考资料
回复 支持 反对

使用道具 举报

75

主题

458

帖子

4

精华

金牌会员

Rank: 6Rank: 6

积分
1633
金钱
1633
注册时间
2012-8-28
在线时间
71 小时
发表于 2013-5-13 12:32:10 | 显示全部楼层
回复【楼主位】chinafox:
<br>---------------------------------
<br>第三个就是&nbsp;使能通道0的自动应答,感觉很无聊.脱裤子放屁呀,这是发达模式必须做的呀,
<br>楼主啊,什么是发达模式?
QQ750273008有好的资料记得发给我哦。。。
回复 支持 反对

使用道具 举报

75

主题

458

帖子

4

精华

金牌会员

Rank: 6Rank: 6

积分
1633
金钱
1633
注册时间
2012-8-28
在线时间
71 小时
发表于 2013-5-13 16:07:33 | 显示全部楼层
回复【楼主位】chinafox:
<br>---------------------------------
<br>void&nbsp;TX_Mode(void)
<br>{                                                                                                                &nbsp;
<br>&nbsp;&nbsp;&nbsp;&nbsp;NRF24L01_CE=0;        &nbsp;&nbsp;&nbsp;&nbsp;
<br>&nbsp;&nbsp;        NRF24L01_Write_Buf(0x20+0x10,(u8*)TX_ADDRESS,5);//写TX地址(发送地址0xE7E7E7E7E7)11100111&nbsp;
<br>&nbsp;&nbsp;        NRF24L01_Write_Buf(0x20+0x0A,(u8*)RX_ADDRESS,5);&nbsp;//通道0的(接收地址0xE7E7E7E7E7)11100111&nbsp;
<br>
<br>&nbsp;&nbsp;        NRF24L01_Write_Reg(0x20+0x01,0x01);&nbsp;//无线0x01寄存器:使能通道0的自动应答&nbsp;&nbsp;&nbsp;&nbsp;
<br>&nbsp;&nbsp;        NRF24L01_Write_Reg(0x20+0x02,0x01);&nbsp;//无线0x02寄存器:使能通道0的接收允许&nbsp;&nbsp;
<br>&nbsp;&nbsp;        NRF24L01_Write_Reg(0x20+0x04,0x1F);&nbsp;//无线0x04寄存器:设置自动重发间隔时间:500us&nbsp;+&nbsp;86us;最大自动重发次数:15次
<br>&nbsp;&nbsp;        NRF24L01_Write_Reg(0x20+0x05,0X28);&nbsp;//设置RF工作频率为40[0x28]我想0x7f的频率高点信号要好点的吧。
<br>&nbsp;&nbsp;        NRF24L01_Write_Reg(0x20+0x06,0X0F);&nbsp;//设置TX发射参数,0db增益,2Mbps,低噪声增益开启&nbsp;&nbsp;&nbsp;
<br>&nbsp;&nbsp;        NRF24L01_Write_Reg(0x20+0x00,0X0E);&nbsp;//配置基本工作模式的参数;CRC校验开,校验16位。无线使能,发射模式
<br>        NRF24L01_CE=1;//CE为高,10us后启动发送       
<br>
<br>//        NRF24L01_CE=0;        &nbsp;&nbsp;&nbsp;&nbsp;
<br>//&nbsp;&nbsp;        NRF24L01_Write_Buf(WRITE_REG+TX_ADDR,(u8*)TX_ADDRESS,TX_ADR_WIDTH);//写TX节点地址&nbsp;
<br>//&nbsp;&nbsp;        NRF24L01_Write_Buf(WRITE_REG+RX_ADDR_P0,(u8*)RX_ADDRESS,RX_ADR_WIDTH);&nbsp;//设置TX节点地址,主要为了使能ACK        &nbsp;&nbsp;
<br>//
<br>//&nbsp;&nbsp;        NRF24L01_Write_Reg(WRITE_REG+EN_AA,0x01);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//使能通道0的自动应答&nbsp;&nbsp;&nbsp;&nbsp;
<br>//&nbsp;&nbsp;        NRF24L01_Write_Reg(WRITE_REG+EN_RXADDR,0x01);&nbsp;//使能通道0的接收地址&nbsp;&nbsp;
<br>//&nbsp;&nbsp;        NRF24L01_Write_Reg(WRITE_REG+SETUP_RETR,0x1a);//设置自动重发间隔时间:500us&nbsp;+&nbsp;86us;最大自动重发次数:10次
<br>//&nbsp;&nbsp;        NRF24L01_Write_Reg(WRITE_REG+RF_CH,40);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//设置RF通道为40
<br>//&nbsp;&nbsp;        NRF24L01_Write_Reg(WRITE_REG+RF_SETUP,0x0f);&nbsp;&nbsp;//设置TX发射参数,0db增益,2Mbps,低噪声增益开启&nbsp;&nbsp;&nbsp;
<br>//&nbsp;&nbsp;        NRF24L01_Write_Reg(WRITE_REG+CONFIG,0x0e);&nbsp;&nbsp;&nbsp;&nbsp;//配置基本工作模式的参数WR_UP,EN_CRC,16BIT_CRC,接收模式,开启所有中断
<br>//        NRF24L01_CE=1;//CE为高,10us后启动发送
<br>}
QQ750273008有好的资料记得发给我哦。。。
回复 支持 反对

使用道具 举报

71

主题

467

帖子

0

精华

高级会员

Rank: 4

积分
800
金钱
800
注册时间
2011-11-18
在线时间
5 小时
 楼主| 发表于 2013-5-15 01:13:58 | 显示全部楼层
字误:发达>>>>>>发送
我的工作就是天天在玩
回复 支持 反对

使用道具 举报

0

主题

1

帖子

0

精华

新手入门

积分
21
金钱
21
注册时间
2013-8-6
在线时间
0 小时
发表于 2013-8-7 10:34:06 | 显示全部楼层
感谢楼主学习了
回复 支持 反对

使用道具 举报

1

主题

4

帖子

0

精华

新手入门

积分
28
金钱
28
注册时间
2013-8-17
在线时间
0 小时
发表于 2013-8-17 19:06:38 | 显示全部楼层
MARK
回复 支持 反对

使用道具 举报

8

主题

40

帖子

0

精华

初级会员

Rank: 2

积分
92
金钱
92
注册时间
2012-10-16
在线时间
0 小时
发表于 2013-8-28 11:13:15 | 显示全部楼层
好贴,果断赞一个
回复 支持 反对

使用道具 举报

1

主题

13

帖子

0

精华

新手上路

积分
37
金钱
37
注册时间
2013-8-27
在线时间
0 小时
发表于 2013-8-28 11:18:22 | 显示全部楼层
回复【楼主位】chinafox:
<br>---------------------------------
<br>好贴,麻烦您帮我看一下我的NRF的问题,谢谢了
<br>http://www.openedv.com/posts/list/0/20608.htm?privmsg=1#117323
回复 支持 反对

使用道具 举报

76

主题

355

帖子

0

精华

高级会员

Rank: 4

积分
671
金钱
671
注册时间
2012-9-19
在线时间
5 小时
发表于 2013-8-30 11:31:43 | 显示全部楼层
码儿克&nbsp;mark
具有资深STM32点灯技术,
回复 支持 反对

使用道具 举报

75

主题

458

帖子

4

精华

金牌会员

Rank: 6Rank: 6

积分
1633
金钱
1633
注册时间
2012-8-28
在线时间
71 小时
发表于 2013-10-21 14:18:15 | 显示全部楼层
回复【楼主位】chinafox:
<br>---------------------------------
<br>楼主的地址表达意思有误
<br>const&nbsp;u8&nbsp;RX_ADDRESS&nbsp;&nbsp;[RX_ADR_WIDTH]={通道号,0xc1,0xc2,0xc2,0xc2};&nbsp;//接收0通道地址(低字节先写)
<br>const&nbsp;u8&nbsp;RX_ADDRESS1[RX_ADR_WIDTH]={0x01,0xc1,0xc2,0xc2,0xc2};&nbsp;//接收1通道地址(第2字节值是c1是)
<br>
<br>const&nbsp;u8&nbsp;RX_ADDRESS2[RX_ADR_WIDTH]={0x02,0xc1,0xc2,0xc2,0xc2};&nbsp;//接收2通道地址(写的时候是低字节先写,2345通道只写一次。
<br>const&nbsp;u8&nbsp;RX_ADDRESS3[RX_ADR_WIDTH]={0x03,0xc1,0xc2,0xc2,0xc2};&nbsp;//接收3通道地址
<br>const&nbsp;u8&nbsp;RX_ADDRESS4[RX_ADR_WIDTH]={0x04,0xc1,0xc2,0xc2,0xc2};&nbsp;//接收4通道地址
<br>const&nbsp;u8&nbsp;RX_ADDRESS5[RX_ADR_WIDTH]={0x05,0xc1,0xc2,0xc2,0xc2};&nbsp;//接收5通道地址
QQ750273008有好的资料记得发给我哦。。。
回复 支持 反对

使用道具 举报

头像被屏蔽

2

主题

164

帖子

1

精华

禁止访问

积分
1316
金钱
1316
注册时间
2012-5-13
在线时间
127 小时
发表于 2013-12-2 21:58:51 | 显示全部楼层
提示: 作者被禁止或删除 内容自动屏蔽
回复 支持 反对

使用道具 举报

17

主题

470

帖子

1

精华

高级会员

Rank: 4

积分
718
金钱
718
注册时间
2013-11-23
在线时间
0 小时
发表于 2013-12-15 17:26:13 | 显示全部楼层
回复【23楼】750273008:
<br>---------------------------------
<br>正解
回复 支持 反对

使用道具 举报

13

主题

225

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
289
金钱
289
注册时间
2013-11-12
在线时间
29 小时
发表于 2014-7-9 16:25:52 | 显示全部楼层
回复【16楼】750273008:
<br>---------------------------------
<br>楼主,我们的差不多,只是我用的是一个通道0,但是每次都只是上电才能正常的接收一次是怎么回事啊?
回复 支持 反对

使用道具 举报

71

主题

467

帖子

0

精华

高级会员

Rank: 4

积分
800
金钱
800
注册时间
2011-11-18
在线时间
5 小时
 楼主| 发表于 2014-7-12 11:44:19 | 显示全部楼层
回复【26楼】jiushibuzhidao:
<br>---------------------------------
<br>你代码有误
我的工作就是天天在玩
回复 支持 反对

使用道具 举报

13

主题

225

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
289
金钱
289
注册时间
2013-11-12
在线时间
29 小时
发表于 2014-7-12 16:31:03 | 显示全部楼层
回复【27楼】chinafox:
<br>---------------------------------
<br>51的发送我刚测试过了,没有什么问题!stm32的接收是用的原子的例程
回复 支持 反对

使用道具 举报

71

主题

467

帖子

0

精华

高级会员

Rank: 4

积分
800
金钱
800
注册时间
2011-11-18
在线时间
5 小时
 楼主| 发表于 2014-7-13 20:32:51 | 显示全部楼层
可能问题出在延时上
我的工作就是天天在玩
回复 支持 反对

使用道具 举报

18

主题

54

帖子

0

精华

初级会员

Rank: 2

积分
177
金钱
177
注册时间
2014-4-18
在线时间
13 小时
发表于 2014-10-11 20:06:17 | 显示全部楼层
回复【3楼】chinafox:
<br>---------------------------------
<br>发送通道和接收通道0的地址不是要一样的么?
回复 支持 反对

使用道具 举报

18

主题

54

帖子

0

精华

初级会员

Rank: 2

积分
177
金钱
177
注册时间
2014-4-18
在线时间
13 小时
发表于 2014-10-12 09:10:33 | 显示全部楼层
NRF24L01_Write_Reg(FLUSH_TX,0xff);//清除TX&nbsp;FIFO寄存器
<br>清除TX&nbsp;FIFO寄存器就是将寄存器全部置1么?
回复 支持 反对

使用道具 举报

71

主题

467

帖子

0

精华

高级会员

Rank: 4

积分
800
金钱
800
注册时间
2011-11-18
在线时间
5 小时
 楼主| 发表于 2014-10-23 20:48:31 | 显示全部楼层
有专门的指令的,代码里也有,你找找。
我的工作就是天天在玩
回复 支持 反对

使用道具 举报

0

主题

1

帖子

0

精华

新手入门

积分
21
金钱
21
注册时间
2014-11-18
在线时间
0 小时
发表于 2014-11-18 16:34:34 | 显示全部楼层
6个通道都调通了,给大家来个正解!!!通过一早上的琢磨,终于调试通过了,拿出来给大家分享一下<br />
unchar code RxAddr0[]={0x01,0xc2,0xc2,0xc2,0xc2};//编号0<br />
unchar code RxAddr1[]={0x02,0xc2,0xc2,0xc2,0xc2};//编号1<br />
unchar code RxAddr2[]={0x03,0xc2,0xc2,0xc2,0xc2};//编号2<br />
unchar code RxAddr3[]={0x04,0xc2,0xc2,0xc2,0xc2};//编号3<br />
unchar code RxAddr4[]={0x05,0xc2,0xc2,0xc2,0xc2};//编号4<br />
unchar code RxAddr5[]={0x06,0xc2,0xc2,0xc2,0xc2};//编号5<br />
地址这样分配的,不是楼主说的那样分配的,发射分别跟接收地址一样就可以了,害我弄了一早上,晕~<br />
回复 支持 反对

使用道具 举报

70

主题

6697

帖子

0

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
12687
金钱
12687
注册时间
2012-11-26
在线时间
3710 小时
发表于 2014-11-24 11:28:05 | 显示全部楼层
回复【33楼】边疆一线:
<br>---------------------------------
<br>还是得反过来&nbsp;&nbsp;&nbsp;
<br>
<br>发射端的发射地址跟接收0地址保持一致
<br>
<br>接收端的接收地址&nbsp;&nbsp;要反过来
学无止境
回复 支持 反对

使用道具 举报

71

主题

467

帖子

0

精华

高级会员

Rank: 4

积分
800
金钱
800
注册时间
2011-11-18
在线时间
5 小时
 楼主| 发表于 2014-12-8 23:12:04 | 显示全部楼层
以下是我的一些调试的代码,我的一向是这样的:&nbsp;
<br>你的能用是因为你是将数组倒过来给NRF24的,2,3,4,5号地址NRF只接收一位8位的数据,无论你丢多少进去,它只认最后一个字。还有你可能用的是国产的芯片吧,不是原因装的那种。
<br>
<br>
<br>void&nbsp;TX_Mode(u8&nbsp;CH,u8&nbsp;RP_EN)
<br>{                                                                                                                &nbsp;
<br>        u8&nbsp;rd,tx_dealy;
<br>       
<br>        rd=(TIM3-&gt;CNT/32);        &nbsp;        //将定时器的计算值拿出来除以32,因为定时器的上限是500&nbsp;,除以32刚好能分16份&nbsp;
<br>                                                &nbsp;        //N24RF刚好能分成16个延时值
<br>        tx_dealy=rd;                &nbsp;        //将延时代号给tx_dealy
<br>        tx_dealy&lt;&lt;=4;                        //然后将tx_dealy左移4位
<br>        tx_dealy=tx_dealy+10;        //后边加上重发次数&nbsp;组成完整的&nbsp;04号寄存器&nbsp;SETUP_RETR&nbsp;设置
<br>
<br>//        Clear_line(19,22,10);                &nbsp;&nbsp;//显示&nbsp;tx_dealy&nbsp;的值,实用中可和谐掉
<br>//        Bit_show(19,22,tx_dealy);
<br>        delay_ms(100);
<br>        //以下正题
<br>
<br>        NRF24L01_CE=0;
<br>
<br>        NRF24L01_Write_Reg(FLUSH_TX,0xff);//清除TX&nbsp;FIFO寄存器
<br>                &nbsp;&nbsp;&nbsp;&nbsp;
<br>&nbsp;&nbsp;        NRF24L01_Write_Buf(WRITE_REG+TX_ADDR,(u8*)TX_ADDRESS,TX_ADR_WIDTH);//写TX节点地址&nbsp;
<br>&nbsp;&nbsp;        NRF24L01_Write_Buf(WRITE_REG+RX_ADDR_P0,(u8*)RX_ADDRESS_0,RX_ADR_WIDTH);&nbsp;//设置TX节点地址,主要为了使能ACK        &nbsp;&nbsp;
<br>
<br>
<br>
<br>&nbsp;&nbsp;        NRF24L01_Write_Reg(WRITE_REG+EN_AA,RP_EN);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//关通道0的自动应答&nbsp;&nbsp;&nbsp;&nbsp;
<br>&nbsp;&nbsp;        NRF24L01_Write_Reg(WRITE_REG+EN_RXADDR,0x3f);&nbsp;        //使能通道0的接收地址&nbsp;&nbsp;&nbsp;&nbsp;//01
<br>&nbsp;&nbsp;        NRF24L01_Write_Reg(WRITE_REG+SETUP_RETR,0x1a);        //设置自动重发间隔时间:500us&nbsp;+&nbsp;86us;最大自动重发次数:10次                //1a
<br>&nbsp;&nbsp;        NRF24L01_Write_Reg(WRITE_REG+RF_CH,CH);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;        //设置RF通道为40
<br>&nbsp;&nbsp;        NRF24L01_Write_Reg(WRITE_REG+RF_SETUP,0x0f);&nbsp;&nbsp;        //设置TX发射参数,0db增益,2Mbps,低噪声增益开启&nbsp;&nbsp;&nbsp;
<br>&nbsp;&nbsp;        NRF24L01_Write_Reg(WRITE_REG+CONFIG,0x0e);&nbsp;&nbsp;&nbsp;&nbsp;        //配置基本工作模式的参数WR_UP,EN_CRC,16BIT_CRC,接收模式,开启所有中断
<br>
<br>        NRF24L01_CE=1;//CE为高,10us后启动发送
<br>}                &nbsp;&nbsp;
<br>
<br>
<br>void&nbsp;RX_Mode(u8&nbsp;CH,u8&nbsp;RP_EN)
<br>{
<br>        NRF24L01_CE=0;
<br>       
<br>        NRF24L01_Write_Reg(FLUSH_RX,0xff);//清除TX&nbsp;FIFO寄存器
<br>                &nbsp;&nbsp;
<br>        NRF24L01_Write_Buf(WRITE_REG+RX_ADDR_P0,(u8*)RX_ADDRESS_0,RX_ADR_WIDTH);//写RX节点地址
<br>        NRF24L01_Write_Buf(WRITE_REG+RX_ADDR_P1,(u8*)RX_ADDRESS_1,RX_ADR_WIDTH);//写RX节点地址
<br>&nbsp;&nbsp;&nbsp;&nbsp;NRF24L01_Write_Buf(WRITE_REG+RX_ADDR_P2,(u8*)RX_ADDRESS_2,1);//写RX节点地址
<br>        NRF24L01_Write_Buf(WRITE_REG+RX_ADDR_P3,(u8*)RX_ADDRESS_3,1);//写RX节点地址
<br>        NRF24L01_Write_Buf(WRITE_REG+RX_ADDR_P4,(u8*)RX_ADDRESS_4,1);//写RX节点地址
<br>        NRF24L01_Write_Buf(WRITE_REG+RX_ADDR_P5,(u8*)RX_ADDRESS_5,1);//写RX节点地址
<br>        &nbsp;&nbsp;
<br>&nbsp;&nbsp;        NRF24L01_Write_Reg(WRITE_REG+EN_AA,RP_EN);&nbsp;&nbsp;&nbsp;&nbsp;//使能通道1-5的自动应答&nbsp;&nbsp;&nbsp;&nbsp;
<br>&nbsp;&nbsp;        NRF24L01_Write_Reg(WRITE_REG+EN_RXADDR,0x3f);&nbsp;//使能通道0的接收地址&nbsp;
<br>        &nbsp;        &nbsp;
<br>&nbsp;&nbsp;        NRF24L01_Write_Reg(WRITE_REG+RF_CH,CH);        &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//设置RF通信频率
<br>                        &nbsp;&nbsp;
<br>&nbsp;&nbsp;        NRF24L01_Write_Reg(WRITE_REG+RX_PW_P0,RX_PLOAD_WIDTH);//选择通道0的有效数据宽度&nbsp;
<br>&nbsp;&nbsp;        NRF24L01_Write_Reg(WRITE_REG+RX_PW_P1,RX_PLOAD_WIDTH);//选择通道0的有效数据宽度&nbsp;
<br>&nbsp;&nbsp;        NRF24L01_Write_Reg(WRITE_REG+RX_PW_P2,RX_PLOAD_WIDTH);//选择通道0的有效数据宽度&nbsp;
<br>&nbsp;&nbsp;        NRF24L01_Write_Reg(WRITE_REG+RX_PW_P3,RX_PLOAD_WIDTH);//选择通道0的有效数据宽度&nbsp;
<br>&nbsp;&nbsp;        NRF24L01_Write_Reg(WRITE_REG+RX_PW_P4,RX_PLOAD_WIDTH);//选择通道0的有效数据宽度&nbsp;
<br>&nbsp;&nbsp;        NRF24L01_Write_Reg(WRITE_REG+RX_PW_P5,RX_PLOAD_WIDTH);//选择通道0的有效数据宽度&nbsp;
<br>
<br>&nbsp;&nbsp;        NRF24L01_Write_Reg(WRITE_REG+RF_SETUP,0x0f);//设置TX发射参数,0db增益,2Mbps,低噪声增益开启&nbsp;
<br>        &nbsp;&nbsp;
<br>&nbsp;&nbsp;        NRF24L01_Write_Reg(WRITE_REG+CONFIG,&nbsp;0x0f);//配置基本工作模式的参数WR_UP,EN_CRC,16BIT_CRC,接收模式&nbsp;
<br>
<br>&nbsp;&nbsp;        NRF24L01_CE&nbsp;=&nbsp;1;&nbsp;//CE为高,进入接收模式&nbsp;
<br>}                                                &nbsp;
<br>
<br>
<br>//启动NRF24L01发送一次数据
<br>//txbuf:待发送数据首地址
<br>//返回值:发送完成状况
<br>
<br>u8&nbsp;NRF24L01_sta;
<br>
<br>u8&nbsp;NRF24L01_TxPacket(u8&nbsp;*txbuf)                        &nbsp;&nbsp;&nbsp;
<br>{&nbsp;
<br>        u8&nbsp;sta;
<br>        u16&nbsp;i;
<br>
<br>        NRF24L01_CE=0;
<br>
<br>&nbsp;&nbsp;        NRF24L01_Write_Buf(WR_TX_PLOAD,txbuf,TX_PLOAD_WIDTH);//写数据到TX&nbsp;BUF&nbsp;&nbsp;32个字节        &nbsp;&nbsp;
<br>
<br>&nbsp;        NRF24L01_CE=1;        //启动发送
<br>
<br>        i=0;                                                               
<br>        while(NRF24L01_IRQ!=0)                        &nbsp;&nbsp;//等待发送完成
<br>        {
<br>        &nbsp;        delay_ms(1);
<br>                i=i+1;
<br>                if(i&gt;5000)        &nbsp;return&nbsp;0xff;        &nbsp;&nbsp;//其他原因发送失败
<br>        }
<br>
<br>        delay_ms(1);                                        &nbsp;&nbsp;//STM32太快了,最好这里要延迟1ms
<br>
<br>        sta=NRF24L01_Read_Reg(STATUS);&nbsp;&nbsp;&nbsp;&nbsp;//读取状态寄存器的值
<br>        NRF24L01_sta=sta;
<br>
<br>//        Clear_line(17,0,30);                        &nbsp;&nbsp;//调试用
<br>//        Bit_show(17,10,sta);                        &nbsp;&nbsp;//调试用
<br>                &nbsp;&nbsp;&nbsp;
<br>        NRF24L01_Write_Reg(WRITE_REG+STATUS,sta);&nbsp;&nbsp;&nbsp;//清除TX_DS或MAX_RT中断标志
<br>
<br>
<br>        if(sta&MAX_TX)//达到最大重发次数
<br>        {
<br>                NRF24L01_Write_Reg(FLUSH_TX,0xff);//清除TX&nbsp;FIFO寄存器&nbsp;
<br>                return&nbsp;MAX_TX;&nbsp;
<br>        }
<br>        if(sta&TX_OK)//发送完成
<br>        {
<br>                return&nbsp;TX_OK;
<br>        }
<br>        return&nbsp;0xff;//其他原因发送失败
<br>}
<br>
<br>
<br>
<br>u8&nbsp;NRF24L01_RxPacket(u8&nbsp;*rxbuf)
<br>{
<br>        u8&nbsp;sta;
<br>        u8&nbsp;i;
<br>
<br>        sta=NRF24L01_Read_Reg(STATUS);&nbsp;&nbsp;//读取状态寄存器的值//接收到数据
<br>        NRF24L01_sta=sta;
<br>
<br>        if(sta&RX_OK)//接收到数据
<br>        {
<br>                NRF24L01_Write_Reg(WRITE_REG+STATUS,sta);&nbsp;//清除TX_DS或MAX_RT中断标志
<br>
<br>                NRF24L01_Read_Buf(RD_RX_PLOAD,rxbuf,RX_PLOAD_WIDTH);//读取数据
<br>                NRF24L01_Write_Reg(FLUSH_RX,0xff);//清除RX&nbsp;FIFO寄存器&nbsp;
<br>
<br>                for(i=0;i&lt;32;i++)
<br>                {
<br>                        NewAssignmentRxbuf=rxbuf;
<br>                }
<br>                return&nbsp;0;&nbsp;
<br>        }
<br>                &nbsp;&nbsp;&nbsp;
<br>        return&nbsp;1;&nbsp;&nbsp;&nbsp;//没收到任何数据
<br>}                               
<br>void&nbsp;MyID_Init(void)
<br>{
<br>        u32&nbsp;temp0;
<br>        B_COLOR=color(0,0,0);        &nbsp;        &nbsp;//清屏
<br>        clear_lcd();
<br>        linechar(1608,0,0,&nbsp;&quot;&nbsp;\0&quot;);
<br>       
<br>        F_COLOR=color(30,60,30);                &nbsp;
<br>        B_COLOR=color(0,0,0);
<br>
<br>
<br>&nbsp;&nbsp;&nbsp;&nbsp;//取MCU的序列号后5位为地址码
<br>&nbsp;&nbsp;&nbsp;&nbsp;temp0=*(u32*)(0x1FFFF7F0);
<br>&nbsp;&nbsp;&nbsp;&nbsp;MyAdd[4]&nbsp;=&nbsp;(u8)(temp0&nbsp;&&nbsp;0x000000FF);
<br>&nbsp;&nbsp;&nbsp;&nbsp;MyAdd[3]&nbsp;=&nbsp;(u8)((temp0&nbsp;&&nbsp;0x0000FF00)&gt;&gt;8);
<br>&nbsp;&nbsp;&nbsp;&nbsp;MyAdd[2]&nbsp;=&nbsp;(u8)((temp0&nbsp;&&nbsp;0x00FF0000)&gt;&gt;16);
<br>&nbsp;&nbsp;&nbsp;&nbsp;MyAdd[1]&nbsp;=&nbsp;(u8)((temp0&nbsp;&&nbsp;0xFF000000)&gt;&gt;24);
<br>        MyAdd[0]&nbsp;=&nbsp;1;                                //因为通道1的高4BIT和通道0不一样,所以最底位0BIT是不能为0的!!
<br>
<br>        linechar_1608t(1608,9,0,&nbsp;&quot;My&nbsp;ID&nbsp;is:\0&quot;);
<br>        count_show(1608,10,0,&nbsp;MyAdd[0]);
<br>        count_show(1608,10,4,&nbsp;MyAdd[1]);
<br>        count_show(1608,10,8,&nbsp;MyAdd[2]);
<br>        count_show(1608,10,12,&nbsp;MyAdd[3]);
<br>        count_show(1608,10,16,&nbsp;MyAdd[4]);
<br>
<br>        printf(&quot;My&nbsp;ID0&nbsp;is:%x\n&quot;,MyAdd[0]);&nbsp;//打印&nbsp;ID&nbsp;
<br>        printf(&quot;My&nbsp;ID1&nbsp;is:%x\n&quot;,MyAdd[1]);&nbsp;//打印&nbsp;ID&nbsp;
<br>        printf(&quot;My&nbsp;ID2&nbsp;is:%x\n&quot;,MyAdd[2]);&nbsp;//打印&nbsp;ID&nbsp;
<br>        printf(&quot;My&nbsp;ID3&nbsp;is:%x\n&quot;,MyAdd[3]);&nbsp;//打印&nbsp;ID&nbsp;
<br>        printf(&quot;My&nbsp;ID4&nbsp;is:%x\n&quot;,MyAdd[4]);&nbsp;//打印&nbsp;ID&nbsp;
<br>       
<br>        delay_ms(1000);
<br>}
<br>
<br>//*********************************************************************************************************
<br>//&nbsp;程式功能:器件在FOX无线系统中的地址
<br>//*********************************************************************************************************
<br>
<br>void&nbsp;SetPublicCH(void)
<br>{       
<br>        TX_ADDRESS[0]=0x00;       
<br>        TX_ADDRESS[1]=0x00;
<br>        TX_ADDRESS[2]=0x38;
<br>        TX_ADDRESS[3]=0x47;
<br>        TX_ADDRESS[4]=0x56;
<br>
<br>        RX_ADDRESS_0[0]=&nbsp;0x00;
<br>        RX_ADDRESS_0[1]=&nbsp;0x00;
<br>        RX_ADDRESS_0[2]=&nbsp;0x38;
<br>        RX_ADDRESS_0[3]=&nbsp;0x47;
<br>        RX_ADDRESS_0[4]=&nbsp;0x56;
<br>
<br>        RX_ADDRESS_1[0]=MyAdd[0];
<br>        RX_ADDRESS_1[1]=MyAdd[1];
<br>        RX_ADDRESS_1[2]=MyAdd[2];
<br>        RX_ADDRESS_1[3]=MyAdd[3];
<br>        RX_ADDRESS_1[4]=MyAdd[4];
<br>
<br>        RX_ADDRESS_2[0]=2;
<br>        RX_ADDRESS_3[0]=3;
<br>        RX_ADDRESS_4[0]=4;
<br>        RX_ADDRESS_5[0]=5;
<br>}
<br>
<br>
<br>//*********************************************************************************************************
<br>//&nbsp;程式功能:建立初始化数据包                &nbsp;&nbsp;&nbsp;相当于自己的名片
<br>//*********************************************************************************************************
<br>
<br>void&nbsp;SetBuildBag(u8&nbsp;DestinationCH,u8&nbsp;SenderCH)                &nbsp;//DestinationCH&nbsp;目标频道&nbsp;&nbsp;SenderCH&nbsp;&nbsp;主发频道
<br>{
<br>        //指令
<br>        txbuf[0]=0;
<br>        txbuf[1]=1;
<br>        //目标地址
<br>        txbuf[2]=0x00;
<br>        txbuf[3]=0x00;
<br>        txbuf[4]=0x38;
<br>        txbuf[5]=0x47;
<br>        txbuf[6]=0x56;
<br>        //目标地址频道
<br>        txbuf[7]=DestinationCH;
<br>        //主发地址
<br>        txbuf[8]=MyAdd[0];
<br>        txbuf[9]=MyAdd[1];
<br>        txbuf[10]=MyAdd[2];
<br>        txbuf[11]=MyAdd[3];
<br>        txbuf[12]=MyAdd[4];
<br>        //主发频道
<br>        txbuf[13]=SenderCH;
<br>        //主发器件属性
<br>        txbuf[14]=ProfessionId_H;
<br>        txbuf[15]=ProfessionId_L;
<br>}
<br>
<br>//*********************************************************************************************************
<br>//&nbsp;程式功能:建立回送的的数据包        &nbsp;&nbsp;将收到的数据包装入自己任务专用的储存数给&nbsp;ReplyBuidBagTXbuf【】
<br>//*********************************************************************************************************
<br>u8&nbsp;ReplyBuidBagTXbuf[16];
<br>void&nbsp;SetReplyBuildBag(u8&nbsp;DestinationCH,u8&nbsp;SenderCH)                &nbsp;//DestinationCH&nbsp;目标频道&nbsp;&nbsp;SenderCH&nbsp;&nbsp;主发频道
<br>{
<br>        u8&nbsp;i;
<br>        //指令
<br>        ReplyBuidBagTXbuf[0]=0;
<br>        ReplyBuidBagTXbuf[1]=2;
<br>        //目标地址
<br>        ReplyBuidBagTXbuf[2]=NewAssignmentRxbuf[8];
<br>        ReplyBuidBagTXbuf[3]=NewAssignmentRxbuf[9];
<br>        ReplyBuidBagTXbuf[4]=NewAssignmentRxbuf[10];
<br>        ReplyBuidBagTXbuf[5]=NewAssignmentRxbuf[11];
<br>        ReplyBuidBagTXbuf[6]=NewAssignmentRxbuf[12];
<br>        //目标地址频道
<br>        ReplyBuidBagTXbuf[7]=DestinationCH;
<br>        //主发地址
<br>        ReplyBuidBagTXbuf[8]=MyAdd[0];
<br>        ReplyBuidBagTXbuf[9]=MyAdd[1];
<br>        ReplyBuidBagTXbuf[10]=MyAdd[2];
<br>        ReplyBuidBagTXbuf[11]=MyAdd[3];
<br>        ReplyBuidBagTXbuf[12]=MyAdd[4];
<br>        //主发频道
<br>        ReplyBuidBagTXbuf[13]=SenderCH;
<br>        //主发器件属性
<br>        ReplyBuidBagTXbuf[14]=ProfessionId_H;
<br>        ReplyBuidBagTXbuf[15]=ProfessionId_L;
<br>
<br>        for(i=0;i&lt;16;i++)
<br>        {
<br>                NewAssignmentRxbuf=0;
<br>        }
<br>}
<br>
<br>
<br>//*********************************************************************************************************
<br>//&nbsp;程式功能:朋友表查找空位                                                                                                                                                &nbsp;
<br>//*********************************************************************************************************
<br>u8&nbsp;LookupMyFriendsListEmptyLocation()
<br>{
<br>        u8&nbsp;i;
<br>        for(i=0;i&lt;10;i++)
<br>        {                //MyfriendsList[n][0]~MyfriendsList[n][4]&nbsp;为朋友地址&nbsp;MyfriendsList[n][5]&nbsp;为信道        &nbsp;&nbsp;&nbsp;&nbsp;MyfriendsList[n][6]~MyfriendsList[n][7]为职业
<br>                if((MyFriendsList[0]==0)&(MyFriendsList[1]==0)&(MyFriendsList[2]==0)&(MyFriendsList[3]==0)&(MyFriendsList[4]==0))        //只要判断地址为空就行了
<br>                {
<br>                        return&nbsp;i;
<br>                }
<br>        }
<br>        return&nbsp;0xff;
<br>}
<br>
<br>//*********************************************************************************************************
<br>//&nbsp;程式功能:从朋友表中查找有可能是子机的地址                                                                                                                                                &nbsp;
<br>//*********************************************************************************************************
<br>u8&nbsp;LookupMySonFormFriendsList(void)                &nbsp;&nbsp;&nbsp;//从朋友表中查找有可能是子机的地址
<br>{
<br>        u8&nbsp;i;
<br>        for(i=0;i&lt;10;i++)
<br>        {
<br>                Clear_line(1,0,30);
<br>                count_show(1608,1,0,MyFriendsList[0]);
<br>                count_show(1608,1,4,MyFriendsList[1]);
<br>                count_show(1608,1,8,MyFriendsList[2]);
<br>                count_show(1608,1,12,MyFriendsList[3]);
<br>                count_show(1608,1,16,MyFriendsList[4]);
<br>                count_show(1608,1,20,MyFriendsList[5]);
<br>
<br>                        //MyfriendsList[n][0]~MyfriendsList[n][4]&nbsp;为朋友地址&nbsp;MyfriendsList[n][5]&nbsp;为信道        &nbsp;&nbsp;&nbsp;&nbsp;MyfriendsList[n][6]~MyfriendsList[n][7]为职业
<br>                if((MyFriendsList[6]==ProfessionId_H)&(MyFriendsList[7]!=0)&(MyFriendsList[5]==2))        //只要职业高位和本主机高位一样,子机不能为0而且信道是2&nbsp;就一定是要绑定的子机
<br>                {
<br>                        return&nbsp;i;
<br>                }
<br>        }
<br>        linechar_1608t(1608,2,0,&nbsp;&quot;I'm&nbsp;not&nbsp;find&nbsp;SonADD......\0&quot;);
<br>        delay_ms(1000);
<br>        delay_ms(1000);
<br>        return&nbsp;0xff;
<br>
<br>}
<br>
<br>//*********************************************************************************************************
<br>//&nbsp;程式功能:查找收到的地址是否有在朋友表里有相同的项                                                                                                                                                &nbsp;
<br>//*********************************************************************************************************
<br>
<br>u8&nbsp;LookupMyFriendsListSameItem()                &nbsp;&nbsp;        //有相同项返回1,没有相同项返回0
<br>{
<br>        u8&nbsp;i;
<br>
<br>        if(&nbsp;&nbsp;(NewAssignmentRxbuf[8]==0)                        //避免收到的数全是0时导致和空表相同。
<br>                &(NewAssignmentRxbuf[9]==0)
<br>                &(NewAssignmentRxbuf[10]==0)
<br>                &(NewAssignmentRxbuf[11]==0)
<br>                &(NewAssignmentRxbuf[12]==0))
<br>        {return&nbsp;0;}
<br>
<br>        for(i=0;i&lt;10;i++)
<br>        {
<br>                if(&nbsp;&nbsp;(MyFriendsList[0]==NewAssignmentRxbuf[8])
<br>                        &(MyFriendsList[1]==NewAssignmentRxbuf[9])
<br>                        &(MyFriendsList[2]==NewAssignmentRxbuf[10])
<br>                        &(MyFriendsList[3]==NewAssignmentRxbuf[11])
<br>                        &(MyFriendsList[4]==NewAssignmentRxbuf[12])
<br>                        &(MyFriendsList[5]==NewAssignmentRxbuf[13])
<br>                        &(MyFriendsList[6]==NewAssignmentRxbuf[14])
<br>                        &(MyFriendsList[7]==NewAssignmentRxbuf[15]))
<br>                {
<br>                        return&nbsp;i;
<br>                }
<br>        }
<br>        return&nbsp;0xff;
<br>}
<br>
<br>//*********************************************************************************************************
<br>//&nbsp;程式功能:查找朋友表里有没有相同的频道                                                                                                                                        &nbsp;
<br>//*********************************************************************************************************
<br>u8&nbsp;LookupFriendListSameCH(u8&nbsp;CH)                                //如果找到相同的频道返回1,没有返回0.
<br>{
<br>        u8&nbsp;i;
<br>
<br>        for(i=0;i&lt;10;i++)
<br>        {
<br>                if(MyFriendsList[5]==CH)        return&nbsp;1;
<br>        }
<br>        return&nbsp;0;
<br>}
<br>
<br>
<br>
<br>//*********************************************************************************************************
<br>//&nbsp;程式功能:新器件建立操作
<br>//*********************************************************************************************************
<br>u8&nbsp;MyCH;
<br>
<br>void&nbsp;ImNewcomer(u8&nbsp;WaitTime)                        //WaitTime&nbsp;是收朋友回信而等待的时间,单位是秒。
<br>{&nbsp;
<br>        u8&nbsp;i,j;
<br>        u8&nbsp;NetAssignment_1,TX_sta;
<br>        u8&nbsp;TargetTime,AssignmentTimeFlag;
<br>        u8&nbsp;StalyTime,TimeFlag;
<br>
<br>        NetAssignment_1=1;
<br>        AssignmentTimeFlag=0;
<br>        StalyTime=WaitTime;                &nbsp;&nbsp;&nbsp;                        //需要延时的时间数
<br>
<br>        if(NetAssignment_1==1)
<br>        {
<br>                B_COLOR=color(0,0,0);        &nbsp;        &nbsp;        //清屏        &nbsp;&nbsp;&nbsp;        //text
<br>                clear_lcd();                                                &nbsp;&nbsp;&nbsp;                //text
<br>                F_COLOR=color(30,60,30);
<br>
<br>                SetPublicCH();                                &nbsp;        //建立新器件TX地址的设置
<br>                MyCH=PublicCH;                                &nbsp;        //将我的地地址设为公共频道
<br>                        &nbsp;
<br>                for(j=1;j&lt;21;j++)                        &nbsp;        //从第1信号通道到20信号通道逐个广播&nbsp;&nbsp;
<br>                {
<br>                        SetBuildBag(j,MyCH);        &nbsp;        //建立找朋友的数据包
<br>
<br>                        TX_Mode(j,0x3e);                &nbsp;        //0x3e=无自动应答,公共频道广播不要自动应答是为了突然信道拥挤。
<br>                        TXRXFlag=1;
<br>
<br>                        Clear_line(19,0,3);                &nbsp;        //text
<br>                        count_show(1608,19,0,j);&nbsp;        //text
<br>
<br>                        TX_sta=0;
<br>                        for(i=0;i&lt;10;i++)                &nbsp;        //每个信道广播10次
<br>                        {
<br>                                TX_sta=NRF24L01_TxPacket(txbuf);
<br>
<br>                                if(TX_sta==MAX_TX)        {F_COLOR=color(0,0,0);        linechar_1608t(1608,19,8,&nbsp;&quot;MAX_TX......\0&quot;);        F_COLOR=color(30,60,30);        linechar_1608t(1608,19,8,&nbsp;&quot;MAX_TX......\0&quot;);}        &nbsp;&nbsp;&nbsp;//text
<br>                                if(TX_sta==TX_OK)        {F_COLOR=color(0,0,0);        linechar_1608t(1608,19,8,&nbsp;&quot;TX_OK......\0&quot;);                F_COLOR=color(30,60,30);        linechar_1608t(1608,19,8,&nbsp;&quot;TX_OK......\0&quot;);}        &nbsp;&nbsp;&nbsp;//text
<br>                                if(TX_sta==0xff)        {F_COLOR=color(0,0,0);        linechar_1608t(1608,19,8,&nbsp;&quot;TX_ERROR......\0&quot;);        F_COLOR=color(30,60,30);        linechar_1608t(1608,19,8,&nbsp;&quot;TX_OK......\0&quot;);}        &nbsp;&nbsp;&nbsp;//text
<br>                        }
<br>                        Clear_line(19,0,30);                //text
<br>                }
<br>
<br>&nbsp;&nbsp;&nbsp;&nbsp;        NetAssignment_1=2;
<br>        }
<br>
<br>        if(NetAssignment_1==2)                               
<br>        {
<br>                MyCH=PublicCH;                                        //用广播发送完名片后,将自己切换到共公信道                &nbsp;&nbsp;
<br>                SetPublicCH();                                        //设置自己的地址
<br>               
<br>                RX_Mode(MyCH,0x3f);                                //0x3f=自动应答                切换回接收状态
<br>                TXRXFlag=0;
<br>
<br>                NetAssignment_1=3;
<br>        }
<br>
<br>        while(NetAssignment_1==3)                        //取得延时的开头时间&nbsp;并延时十秒
<br>        {
<br>                RTC_Get();
<br>                if(AssignmentTimeFlag==0)//时间延时操作第一步                                        //取得延时时间的开头数值,并取得定时后的数值&nbsp;&nbsp;&nbsp;AssignmentTemp00到点数
<br>                {
<br>                        if((timer.sec)+StalyTime&gt;=60)        {TimeFlag=0;        TargetTime=StalyTime-(60-timer.sec);}        &nbsp;&nbsp;&nbsp;        //当时间的秒读数加上延时时间大于或等于60后(读数是0~59)时标记为TimeFlag=0)
<br>                        else&nbsp;{TargetTime=timer.sec+StalyTime;                TimeFlag=1;}                                                                        //当时间的秒读数加上延时时间小于60后(读数是0~59)时标记为TimeFlag=1)
<br>
<br>                        AssignmentTimeFlag=1;
<br>                }
<br>
<br>                if(AssignmentTimeFlag==1)//时间延时操作第二步       
<br>                {
<br>                        count_show(1608,11,0,TargetTime);
<br>                        Clear_line(11,3,3);count_show(1608,11,3,timer.sec);
<br>
<br>                        if(TimeFlag==0)               
<br>                        {
<br>                                if&nbsp;(timer.sec==TargetTime)        {return;}        //返回
<br>                        }
<br>                        if(TimeFlag==1)
<br>                        {
<br>                                if(timer.sec==TargetTime)        {return;}        //返回
<br>                        }
<br>                }
<br>
<br>                if(!NRF24L01_RxPacket(rxbuf))                        //如果收到有数据包
<br>                {
<br>                        delay_ms(1000);
<br>                        B_COLOR=color(0,0,0);        &nbsp;        &nbsp;                //清屏        &nbsp;&nbsp;&nbsp;        //text
<br>                        clear_lcd();                                                &nbsp;&nbsp;&nbsp;                        //text
<br>                        Clear_line(19,0,30);        linechar_1608t(1608,19,8,&nbsp;&quot;RX_OK......\0&quot;);
<br>
<br>                        linechar_1608t(1608,4,0,&nbsp;&quot;I&nbsp;get&nbsp;this&nbsp;message:\0&quot;);
<br>                        //显示指令
<br>                        linechar_1608t(1608,5,0,&nbsp;&quot;Instruct:\0&quot;);
<br>                        count_show(1608,5,10,NewAssignmentRxbuf[0]);                &nbsp;//这里返回的指令应该是&nbsp;02
<br>                        count_show(1608,5,14,NewAssignmentRxbuf[1]);
<br>                        //显示目标地址
<br>                        linechar_1608t(1608,6,0,&nbsp;&quot;Destination:\0&quot;);
<br>                        count_show(1608,7,0,NewAssignmentRxbuf[2]);
<br>                        count_show(1608,7,4,NewAssignmentRxbuf[3]);
<br>                        count_show(1608,7,8,NewAssignmentRxbuf[4]);
<br>                        count_show(1608,7,12,NewAssignmentRxbuf[5]);
<br>                        count_show(1608,7,16,NewAssignmentRxbuf[6]);
<br>                        //显示目标频道
<br>                        linechar_1608t(1608,7,19,&nbsp;&quot;CH:\0&quot;);
<br>                        count_show(1608,7,24,NewAssignmentRxbuf[7]);
<br>                        //显示主发地址
<br>                        linechar_1608t(1608,8,0,&nbsp;&quot;Sender:\0&quot;);
<br>                        count_show(1608,9,0,NewAssignmentRxbuf[8]);
<br>                        count_show(1608,9,4,NewAssignmentRxbuf[9]);
<br>                        count_show(1608,9,8,NewAssignmentRxbuf[10]);
<br>                        count_show(1608,9,12,NewAssignmentRxbuf[11]);
<br>                        count_show(1608,9,16,NewAssignmentRxbuf[12]);
<br>                        //显示主发频道
<br>                        linechar_1608t(1608,9,19,&nbsp;&quot;CH:\0&quot;);
<br>                        count_show(1608,9,24,NewAssignmentRxbuf[13]);
<br>
<br>                        //显示主发器件属性
<br>                        linechar_1608t(1608,10,0,&nbsp;&quotorfession&nbsp;ID:\0&quot;);
<br>                        count_show(1608,10,16,NewAssignmentRxbuf[14]);
<br>                        count_show(1608,10,20,NewAssignmentRxbuf[15]);
<br>
<br>                        if((NewAssignmentRxbuf[0]==0)&(NewAssignmentRxbuf[1]==2))        //如果收到的是返回指令&nbsp;02
<br>                        {
<br>                                if(LookupMyFriendsListSameItem()==0xff)                //从地址表中找出是否有同相的朋友地址在里边,如果有就不做压放朋友地址表操作        &nbsp;&nbsp;LookupMyFriendsListSameItem()返回0表示没有相同项,返回1表示有相同项
<br>                                {
<br>                                        i=LookupMyFriendsListEmptyLocation();        //从地址表(10个空位)中找到空位
<br>                                        if(i&lt;10)
<br>                                        {
<br>                                                //压入朋友地址表中
<br>                                                MyFriendsList[0]=NewAssignmentRxbuf[8];        //朋友地址
<br>                                                MyFriendsList[1]=NewAssignmentRxbuf[9];        //朋友地址
<br>                                                MyFriendsList[2]=NewAssignmentRxbuf[10];        //朋友地址
<br>                                                MyFriendsList[3]=NewAssignmentRxbuf[11];        //朋友地址
<br>                                                MyFriendsList[4]=NewAssignmentRxbuf[12];        //朋友地址
<br>                                                MyFriendsList[5]=NewAssignmentRxbuf[13];        //朋友所在频道
<br>                                                MyFriendsList[6]=NewAssignmentRxbuf[14];        //朋友从事职业
<br>                                                MyFriendsList[7]=NewAssignmentRxbuf[15];        //朋友从事职业
<br>                       
<br>                                                linechar_1608t(1608,13,0,&nbsp;&quot;Sender:\0&quot;);
<br>                                                count_show(1608,14,0,MyFriendsList[0]);
<br>                                                count_show(1608,14,4,MyFriendsList[1]);
<br>                                                count_show(1608,14,8,MyFriendsList[2]);
<br>                                                count_show(1608,14,12,MyFriendsList[3]);
<br>                                                count_show(1608,14,16,MyFriendsList[4]);
<br>                                                //显示主发频道
<br>                                                linechar_1608t(1608,14,19,&nbsp;&quot;CH:\0&quot;);
<br>                                                count_show(1608,14,24,MyFriendsList[5]);
<br>                       
<br>                                                //显示主发器件属性
<br>                                                linechar_1608t(1608,15,0,&nbsp;&quotorfession&nbsp;ID:\0&quot;);
<br>                                                count_show(1608,15,16,MyFriendsList[6]);
<br>                                                count_show(1608,15,20,MyFriendsList[7]);
<br>                       
<br>                                                linechar_1608t(1608,16,0,&nbsp;&quot;FriendList&nbsp;location:\0&quot;);
<br>                                                count_show(1608,16,21,i);
<br>                                        }
<br>                                        else        {linechar_1608t(1608,16,0,&nbsp;&quot;FriendList&nbsp;is&nbsp;full!!\0&quot;);}
<br>                                }
<br>                                else        {Clear_line(19,16,0);        linechar_1608t(1608,16,0,&nbsp;&quot;I&nbsp;have&nbsp;same&nbsp;item.\0&quot;);        count_show(1608,16,18,LookupMyFriendsListSameItem());}
<br>                        }       
<br>                }
<br>                else        {Clear_line(19,0,30);        linechar_1608t(1608,19,8,&nbsp;&quot;Nothing......\0&quot;);}//否则显示没有收到任何数据包       
<br>        }
<br>
<br>}
<br>
<br>//*********************************************************************************************************
<br>//&nbsp;程式功能:主机建立领地操作
<br>//*********************************************************************************************************
<br>u8&nbsp;ThisIsMyTerritory(void)                //主机建立领地操作
<br>{
<br>        u16        i,j,k;
<br>
<br>        ImNewcomer(10);                                        //先找一次朋友
<br>        if((MyFriendsList[0][0]==0)                //先找一次朋友,如果第一次一个都没有,尽人事,再找一次。
<br>        &nbsp;&nbsp;&(MyFriendsList[0][1]==0)
<br>        &nbsp;&nbsp;&(MyFriendsList[0][2]==0)
<br>        &nbsp;&nbsp;&(MyFriendsList[0][3]==0)
<br>        &nbsp;&nbsp;&(MyFriendsList[0][4]==0)
<br>        &nbsp;&nbsp;)
<br>        {ImNewcomer(10);}
<br>       
<br>        B_COLOR=color(0,0,0);        &nbsp;//清屏
<br>        clear_lcd();
<br>        j=0;
<br>
<br>        if(ProfessionId_L==0)                        //进入创建领地操作&nbsp;先看看自己是否主机
<br>        {
<br>                k=0;
<br>                while(k==0)
<br>                {
<br>                        i=(TIM3-&gt;CNT/25);                                                                                //取一随机数(1~100以内)
<br>                        linechar_1608t(1608,j,0,&nbsp;&quot;TIM3-&gt;CNT=\0&quot;);                        //text
<br>                        count_show(1608,j,12,i);                                                &nbsp;&nbsp;&nbsp;&nbsp;//text
<br>                        j=j+1;
<br>
<br>                        if((i&gt;=3))
<br>                        {
<br>                                if(LookupFriendListSameCH(i)==0)        k=1;                //查找朋友表中有没有相同的频道
<br>                        }
<br>                }                                                                                                                //如果没有,进入建立自己的频道
<br>                linechar_1608t(1608,j,0,&nbsp;&quot;My&nbsp;Territory&nbsp;is:\0&quot;);                        //text
<br>                count_show(1608,j,18,i);                                                &nbsp;&nbsp;&nbsp;&nbsp;        //text
<br>                j=j+1;
<br>
<br>                MyCH=i;
<br>                delay_ms(1000);
<br>                delay_ms(1000);
<br>                delay_ms(1000);
<br>                return&nbsp;1;
<br>        }
<br>        else
<br>        {
<br>                MyCH=2;
<br>                linechar_1608t(1608,2,0,&nbsp;&quot;I&nbsp;need&nbsp;looking&nbsp;for&nbsp;my&nbsp;papa\0&quot;);                        //text
<br>                delay_ms(1000);
<br>                delay_ms(1000);
<br>                delay_ms(1000);
<br>                return&nbsp;0;
<br>        }
<br>}
<br>
<br>//*********************************************************************************************************
<br>//&nbsp;程式功能:数据发送服务代码
<br>//*********************************************************************************************************
<br>
<br>u8&nbsp;TXAssignment(u8&nbsp;AssignmenNo)                        &nbsp;&nbsp;&nbsp;//数据发送服务代码                &nbsp;AssignmenNo=1:建立包返回任务
<br>{
<br>        u8&nbsp;&nbsp;TX_sta;
<br>        u8&nbsp;&nbsp;SonADD;
<br>
<br>        RX_Mode(MyCH,0x3e);
<br>        delay_ms(10);
<br>        RX_Mode(MyCH,0x3e);
<br>        delay_ms(10);
<br>        TXRXFlag=0;
<br>
<br>        if(AssignmenNo==1)
<br>        {        //指令
<br>                txbuf[0]=ReplyBuidBagTXbuf[0];
<br>                txbuf[1]=ReplyBuidBagTXbuf[1];
<br>                //目标地址
<br>                txbuf[2]=ReplyBuidBagTXbuf[2];
<br>                txbuf[3]=ReplyBuidBagTXbuf[3];
<br>                txbuf[4]=ReplyBuidBagTXbuf[4];
<br>                txbuf[5]=ReplyBuidBagTXbuf[5];
<br>                txbuf[6]=ReplyBuidBagTXbuf[6];
<br>                //目标地址频道
<br>                txbuf[7]=ReplyBuidBagTXbuf[7];
<br>                //主发地址
<br>                txbuf[8]=ReplyBuidBagTXbuf[8];
<br>                txbuf[9]=ReplyBuidBagTXbuf[9];
<br>                txbuf[10]=ReplyBuidBagTXbuf[10];
<br>                txbuf[11]=ReplyBuidBagTXbuf[11];
<br>                txbuf[12]=ReplyBuidBagTXbuf[12];
<br>                //主发频道
<br>                txbuf[13]=ReplyBuidBagTXbuf[13];
<br>                //主发器件属性
<br>                txbuf[14]=ReplyBuidBagTXbuf[14];
<br>                txbuf[15]=ReplyBuidBagTXbuf[15];
<br>
<br>                TX_ADDRESS[0]=ReplyBuidBagTXbuf[2];                        //发回去的地址
<br>                TX_ADDRESS[1]=ReplyBuidBagTXbuf[3];                        //发回去的地址
<br>                TX_ADDRESS[2]=ReplyBuidBagTXbuf[4];                        //发回去的地址
<br>                TX_ADDRESS[3]=ReplyBuidBagTXbuf[5];                        //发回去的地址
<br>                TX_ADDRESS[4]=ReplyBuidBagTXbuf[6];                        //发回去的地址
<br>               
<br>                RX_ADDRESS_0[0]=&nbsp;ReplyBuidBagTXbuf[2];                //应答回复的地址
<br>                RX_ADDRESS_0[1]=&nbsp;ReplyBuidBagTXbuf[3];                //应答回复的地址
<br>                RX_ADDRESS_0[2]=&nbsp;ReplyBuidBagTXbuf[4];                //应答回复的地址
<br>                RX_ADDRESS_0[3]=&nbsp;ReplyBuidBagTXbuf[5];                //应答回复的地址
<br>                RX_ADDRESS_0[4]=&nbsp;ReplyBuidBagTXbuf[6];                //应答回复的地址
<br>
<br>                RX_ADDRESS_1[0]=MyAdd[0];                                        //自己的地址        &nbsp;&nbsp;频道1
<br>                RX_ADDRESS_1[1]=MyAdd[1];                                        //自己的地址        &nbsp;&nbsp;频道1
<br>                RX_ADDRESS_1[2]=MyAdd[2];                                        //自己的地址        &nbsp;&nbsp;频道1
<br>                RX_ADDRESS_1[3]=MyAdd[3];                                        //自己的地址        &nbsp;&nbsp;频道1
<br>                RX_ADDRESS_1[4]=MyAdd[4];                                        //自己的地址        &nbsp;&nbsp;频道1
<br>       
<br>                RX_ADDRESS_2[0]=2;                                                        //自己的地址        &nbsp;&nbsp;频道2
<br>                RX_ADDRESS_3[0]=3;                                                        //自己的地址        &nbsp;&nbsp;频道3
<br>                RX_ADDRESS_4[0]=4;                                                        //自己的地址        &nbsp;&nbsp;频道4
<br>                RX_ADDRESS_5[0]=5;                                                        //自己的地址        &nbsp;&nbsp;频道5
<br>
<br>        }
<br>       
<br>        if(AssignmenNo==2)                                                        &nbsp;&nbsp;&nbsp;        //在朋友表中找到职业高业相同底位不等于0而且在信道2的子机地址,并设置发送包
<br>        {       
<br>                if(LookupMySonFormFriendsList()==0xff)        return&nbsp;0;
<br>                //指令
<br>                txbuf[0]=0;
<br>                txbuf[1]=3;
<br>                //目标地址
<br>                SonADD=LookupMySonFormFriendsList();
<br>
<br>                txbuf[2]=MyFriendsList[SonADD][0];
<br>                txbuf[3]=MyFriendsList[SonADD][1];
<br>                txbuf[4]=MyFriendsList[SonADD][2];
<br>                txbuf[5]=MyFriendsList[SonADD][3];
<br>                txbuf[6]=MyFriendsList[SonADD][4];
<br>                //目标地址频道
<br>                txbuf[7]=2;                                                &nbsp;//待绑定子机一定在信道2
<br>                //主发地址
<br>                txbuf[8]=MyAdd[0];
<br>                txbuf[9]=MyAdd[1];
<br>                txbuf[10]=MyAdd[2];
<br>                txbuf[11]=MyAdd[3];
<br>                txbuf[12]=MyAdd[4];
<br>                //主发频道
<br>                txbuf[13]=MyCH;
<br>                //主发器件属性
<br>                txbuf[14]=ProfessionId_H;
<br>                txbuf[15]=ProfessionId_L;
<br>
<br>                TX_ADDRESS[0]=MyFriendsList[SonADD][0];                        //发回去的地址
<br>                TX_ADDRESS[1]=MyFriendsList[SonADD][1];                        //发回去的地址
<br>                TX_ADDRESS[2]=MyFriendsList[SonADD][2];                        //发回去的地址
<br>                TX_ADDRESS[3]=MyFriendsList[SonADD][3];                        //发回去的地址
<br>                TX_ADDRESS[4]=MyFriendsList[SonADD][4];                        //发回去的地址
<br>               
<br>                RX_ADDRESS_0[0]=&nbsp;MyFriendsList[SonADD][0];                //应答回复的地址
<br>                RX_ADDRESS_0[1]=&nbsp;MyFriendsList[SonADD][1];                //应答回复的地址
<br>                RX_ADDRESS_0[2]=&nbsp;MyFriendsList[SonADD][2];                //应答回复的地址
<br>                RX_ADDRESS_0[3]=&nbsp;MyFriendsList[SonADD][3];                //应答回复的地址
<br>                RX_ADDRESS_0[4]=&nbsp;MyFriendsList[SonADD][4];                //应答回复的地址
<br>
<br>                RX_ADDRESS_1[0]=MyAdd[0];                                        //自己的地址        &nbsp;&nbsp;频道1
<br>                RX_ADDRESS_1[1]=MyAdd[1];                                        //自己的地址        &nbsp;&nbsp;频道1
<br>                RX_ADDRESS_1[2]=MyAdd[2];                                        //自己的地址        &nbsp;&nbsp;频道1
<br>                RX_ADDRESS_1[3]=MyAdd[3];                                        //自己的地址        &nbsp;&nbsp;频道1
<br>                RX_ADDRESS_1[4]=MyAdd[4];                                        //自己的地址        &nbsp;&nbsp;频道1
<br>       
<br>                RX_ADDRESS_2[0]=2;                                                        //自己的地址        &nbsp;&nbsp;频道2
<br>                RX_ADDRESS_3[0]=3;                                                        //自己的地址        &nbsp;&nbsp;频道3
<br>                RX_ADDRESS_4[0]=4;                                                        //自己的地址        &nbsp;&nbsp;频道4
<br>                RX_ADDRESS_5[0]=5;                                                        //自己的地址        &nbsp;&nbsp;频道5
<br>
<br>        }
<br>
<br>        Clear_line(5,0,30);
<br>        Clear_line(6,0,30);
<br>        Clear_line(7,0,30);
<br>        Clear_line(8,0,30);
<br>        Clear_line(9,0,30);
<br>
<br>        linechar_1608t(1608,5,0,&nbsp;&quot;I&nbsp;will&nbsp;reply&nbsp;this&nbsp;message:\0&quot;);
<br>        //显示指令
<br>        count_show(1608,6,0,txbuf[0]);
<br>        count_show(1608,6,4,txbuf[1]);
<br>        //显示目标地址
<br>        count_show(1608,7,0,txbuf[2]);
<br>        count_show(1608,7,4,txbuf[3]);
<br>        count_show(1608,7,8,txbuf[4]);
<br>        count_show(1608,7,12,txbuf[5]);
<br>        count_show(1608,7,16,txbuf[6]);
<br>        //显示目标频道
<br>        count_show(1608,7,24,txbuf[7]);
<br>        //显示主发地址
<br>        count_show(1608,8,0,txbuf[8]);
<br>        count_show(1608,8,4,txbuf[9]);
<br>        count_show(1608,8,8,txbuf[10]);
<br>        count_show(1608,8,12,txbuf[11]);
<br>        count_show(1608,8,16,txbuf[12]);
<br>        //显示主发频道
<br>        count_show(1608,8,24,txbuf[13]);
<br>        //显示主发器件属性
<br>        count_show(1608,9,0,txbuf[14]);
<br>        count_show(1608,9,4,txbuf[15]);
<br>
<br>        TX_Mode(PublicCH,0x3f);
<br>        TXRXFlag=1;
<br>
<br>        TX_sta=0;
<br>        TX_sta=NRF24L01_TxPacket(txbuf);
<br>
<br>        if(TX_sta==MAX_TX)        {Clear_line(19,0,30);        linechar_1608t(1608,19,8,&nbsp;&quot;MAX_TX......\0&quot;);        delay_ms(1000);                return        0;}        &nbsp;&nbsp;&nbsp;//text
<br>        if(TX_sta==0xff)        {Clear_line(19,0,30);        linechar_1608t(1608,19,8,&nbsp;&quot;TX_ERROR......\0&quot;);        delay_ms(1000);                return        0;}        &nbsp;&nbsp;&nbsp;//text
<br>
<br>        if(TX_sta==TX_OK)       
<br>        {
<br>                Clear_line(19,0,30);        linechar_1608t(1608,19,8,&nbsp;&quot;TX_OK......\0&quot;);        &nbsp;&nbsp;delay_ms(1000);//text
<br>                SetPublicCH();
<br>                RX_Mode(MyCH,0x3e);
<br>                TXRXFlag=0;
<br>
<br>                return        1;
<br>        }
<br>        return&nbsp;0;
<br>}
<br>
<br>//*********************************************************************************************************
<br>//&nbsp;程式功能:新朋友数据包回应操作
<br>//
<br>//&nbsp;1:先看朋友表里有没有收到的地址,如果有就压入朋友表
<br>//&nbsp;2:随机延时&nbsp;0-500ms
<br>//&nbsp;3:将收到的数据包装入本任务专有的数组&nbsp;ReplyBuidBagTXbuf【】
<br>//
<br>//*********************************************************************************************************
<br>u8&nbsp;IGetANewFriend(void)                //回应成功返回1,不成功返回0。
<br>{
<br>        u16&nbsp;ReplyDelayTime;
<br>        u8&nbsp;&nbsp;i;
<br>
<br>        if(LookupMyFriendsListSameItem()==0xff)                //从地址表中找出是否有同相的朋友地址在里边,如果有就不做压放朋友地址表操作        &nbsp;&nbsp;
<br>        {                                                                                        //LookupMyFriendsListSameItem()返回的数表示在列表中的相同地址位置,返回255表示没有相同项
<br>               
<br>                i=LookupMyFriendsListEmptyLocation();        //从地址表(10个空位)中找到空位
<br>                if(i&lt;10)
<br>                {
<br>                        //压入朋友地址表中
<br>                        MyFriendsList[0]=NewAssignmentRxbuf[8];        //朋友地址
<br>                        MyFriendsList[1]=NewAssignmentRxbuf[9];        //朋友地址
<br>                        MyFriendsList[2]=NewAssignmentRxbuf[10];        //朋友地址
<br>                        MyFriendsList[3]=NewAssignmentRxbuf[11];        //朋友地址
<br>                        MyFriendsList[4]=NewAssignmentRxbuf[12];        //朋友地址
<br>                        MyFriendsList[5]=NewAssignmentRxbuf[13];        //朋友所在频道
<br>                        MyFriendsList[6]=NewAssignmentRxbuf[14];        //朋友从事职业
<br>                        MyFriendsList[7]=NewAssignmentRxbuf[15];        //朋友从事职业
<br>
<br>                        linechar_1608t(1608,13,0,&nbsp;&quot;Sender:\0&quot;);
<br>                        count_show(1608,14,0,MyFriendsList[0]);
<br>                        count_show(1608,14,4,MyFriendsList[1]);
<br>                        count_show(1608,14,8,MyFriendsList[2]);
<br>                        count_show(1608,14,12,MyFriendsList[3]);
<br>                        count_show(1608,14,16,MyFriendsList[4]);
<br>                        //显示主发频道
<br>                        linechar_1608t(1608,14,19,&nbsp;&quot;CH:\0&quot;);
<br>                        count_show(1608,14,24,MyFriendsList[5]);
<br>
<br>                        //显示主发器件属性
<br>                        linechar_1608t(1608,15,0,&nbsp;&quotorfession&nbsp;ID:\0&quot;);
<br>                        count_show(1608,15,16,MyFriendsList[6]);
<br>                        count_show(1608,15,20,MyFriendsList[7]);
<br>
<br>                        linechar_1608t(1608,16,0,&nbsp;&quot;FriendList&nbsp;location:\0&quot;);
<br>                        count_show(1608,16,21,i);
<br>                }
<br>                else        {linechar_1608t(1608,16,0,&nbsp;&quot;FriendList&nbsp;is&nbsp;full!!\0&quot;);}
<br>               
<br>        }
<br>        else        {Clear_line(19,16,0);        linechar_1608t(1608,16,0,&nbsp;&quot;I&nbsp;have&nbsp;same&nbsp;item.\0&quot;);        count_show(1608,16,18,LookupMyFriendsListSameItem());}       
<br>                               
<br>        linechar_1608t(1608,0,0,&nbsp;&quot;I&nbsp;get&nbsp;this&nbsp;message:\0&quot;);
<br>        //显示指令
<br>        count_show(1608,1,0,NewAssignmentRxbuf[0]);
<br>        count_show(1608,1,4,NewAssignmentRxbuf[1]);
<br>        //显示目标地址
<br>        count_show(1608,2,0,NewAssignmentRxbuf[2]);
<br>        count_show(1608,2,4,NewAssignmentRxbuf[3]);
<br>        count_show(1608,2,8,NewAssignmentRxbuf[4]);
<br>        count_show(1608,2,12,NewAssignmentRxbuf[5]);
<br>        count_show(1608,2,16,NewAssignmentRxbuf[6]);
<br>        //显示目标频道
<br>        count_show(1608,2,24,NewAssignmentRxbuf[7]);
<br>        //显示主发地址
<br>        count_show(1608,3,0,NewAssignmentRxbuf[8]);
<br>        count_show(1608,3,4,NewAssignmentRxbuf[9]);
<br>        count_show(1608,3,8,NewAssignmentRxbuf[10]);
<br>        count_show(1608,3,12,NewAssignmentRxbuf[11]);
<br>        count_show(1608,3,16,NewAssignmentRxbuf[12]);
<br>        //显示主发频道
<br>        count_show(1608,3,24,NewAssignmentRxbuf[13]);
<br>        //显示主发器件属性
<br>        count_show(1608,4,0,NewAssignmentRxbuf[14]);
<br>        count_show(1608,4,4,NewAssignmentRxbuf[15]);
<br>       
<br>
<br>        //***********************************************************************************************************随机延时&nbsp;0-500ms
<br>        ReplyDelayTime=(TIM3-&gt;CNT);        &nbsp;        //取随机数,定时器的上限是500.&nbsp;
<br>        if(ReplyDelayTime!=0)        {delay_ms(ReplyDelayTime);        count_show(1608,0,24,ReplyDelayTime);}
<br>        //***********************************************************************************************************
<br>
<br>        SetReplyBuildBag(PublicCH,MyCH);
<br>
<br>        return&nbsp;1;
<br>}
<br>
<br>//*********************************************************************************************************
<br>//&nbsp;程式功能:子机绑定操作
<br>//
<br>//&nbsp;1:
<br>//&nbsp;2:
<br>//&nbsp;3:
<br>//
<br>//*********************************************************************************************************
<br>
<br>u8&nbsp;WaitingForMyPapa(void)
<br>{
<br>        while&nbsp;(1)
<br>        {
<br>                if(TXRXFlag==1)
<br>                {
<br>                        MyCH=PublicCH;                                        //将自己切换到共公信道                &nbsp;&nbsp;
<br>                        SetPublicCH();                                        //设置自己的地址
<br>                        RX_Mode(MyCH,0x3f);                                //0x3f=自动应答                切换回接收状态
<br>                        delay_ms(10);
<br>                        linechar_1608t(1608,3,8,&nbsp;&quot;Set&nbsp;RX_Mode......\0&quot;);
<br>                }
<br>                linechar_1608t(1608,3,8,&nbsp;&quot;RX_Mode......\0&quot;);
<br>
<br>                if(!NRF24L01_RxPacket(rxbuf))                       
<br>                {
<br>                        F_COLOR=color(0,0,0);                linechar_1608t(1608,19,8,&nbsp;&quot;RX_OK......\0&quot;);
<br>                        F_COLOR=color(30,60,30);        linechar_1608t(1608,19,8,&nbsp;&quot;RX_OK......\0&quot;);
<br>               
<br>                        linechar_1608t(1608,4,0,&nbsp;&quot;I&nbsp;get&nbsp;this&nbsp;message:\0&quot;);
<br>                        //显示指令
<br>                        linechar_1608t(1608,5,0,&nbsp;&quot;Instruct:\0&quot;);
<br>                        count_show(1608,5,10,NewAssignmentRxbuf[0]);                &nbsp;//这里返回的指令应该是&nbsp;02
<br>                        count_show(1608,5,14,NewAssignmentRxbuf[1]);
<br>                        //显示目标地址
<br>                        linechar_1608t(1608,6,0,&nbsp;&quot;Destination:\0&quot;);
<br>                        count_show(1608,7,0,NewAssignmentRxbuf[2]);
<br>                        count_show(1608,7,4,NewAssignmentRxbuf[3]);
<br>                        count_show(1608,7,8,NewAssignmentRxbuf[4]);
<br>                        count_show(1608,7,12,NewAssignmentRxbuf[5]);
<br>                        count_show(1608,7,16,NewAssignmentRxbuf[6]);
<br>                        //显示目标频道
<br>                        linechar_1608t(1608,7,19,&nbsp;&quot;CH:\0&quot;);
<br>                        count_show(1608,7,24,NewAssignmentRxbuf[7]);
<br>                        //显示主发地址
<br>                        linechar_1608t(1608,8,0,&nbsp;&quot;Sender:\0&quot;);
<br>                        count_show(1608,9,0,NewAssignmentRxbuf[8]);
<br>                        count_show(1608,9,4,NewAssignmentRxbuf[9]);
<br>                        count_show(1608,9,8,NewAssignmentRxbuf[10]);
<br>                        count_show(1608,9,12,NewAssignmentRxbuf[11]);
<br>                        count_show(1608,9,16,NewAssignmentRxbuf[12]);
<br>                        //显示主发频道
<br>                        linechar_1608t(1608,9,19,&nbsp;&quot;CH:\0&quot;);
<br>                        count_show(1608,9,24,NewAssignmentRxbuf[13]);
<br>
<br>                        //显示主发器件属性
<br>                        linechar_1608t(1608,10,0,&nbsp;&quotorfession&nbsp;ID:\0&quot;);
<br>                        count_show(1608,10,16,NewAssignmentRxbuf[14]);
<br>                        count_show(1608,10,20,NewAssignmentRxbuf[15]);
<br>                       
<br>                       
<br>                        F_COLOR=color(30,60,30);
<br>                        linechar_1608t(1608,11,0,&nbsp;&quot;I&nbsp;finded&nbsp;my&nbsp;papa......\0&quot;);
<br>                        linechar_1608t(1608,12,0,&nbsp;&quot;My&nbsp;Territory&nbsp;is:\0&quot;);       
<br>                        count_show(1608,12,18,NewAssignmentRxbuf[13]);
<br>                }
<br>                else
<br>                {
<br>                        F_COLOR=color(0,0,0);                linechar_1608t(1608,19,8,&nbsp;&quot;Nothing......\0&quot;);
<br>                        F_COLOR=color(30,60,30);        linechar_1608t(1608,19,8,&nbsp;&quot;Nothing......\0&quot;);
<br>                }
<br>                //开包************************************************************************************************
<br>                //任务1                                                                                                        &nbsp;&nbsp;                                &nbsp;&nbsp;&nbsp;
<br>                if((NewAssignmentRxbuf[0]==0)&(NewAssignmentRxbuf[1]==3))                                        //如果指令是03(主机向子机反来的绑定指令)
<br>                {
<br>                       
<br>
<br>                        MyCH=NewAssignmentRxbuf[13];
<br>
<br>                        delay_ms(1000);
<br>                        delay_ms(1000);
<br>                        delay_ms(1000);
<br>                        return&nbsp;1;
<br>                }
<br>        }
<br>}
我的工作就是天天在玩
回复 支持 反对

使用道具 举报

71

主题

467

帖子

0

精华

高级会员

Rank: 4

积分
800
金钱
800
注册时间
2011-11-18
在线时间
5 小时
 楼主| 发表于 2014-12-8 23:17:29 | 显示全部楼层
学一样东西不要急,多做实验,出现的问题解决了才是有机会学到。所以出现问题本身就是一个很幸运的事。
我的工作就是天天在玩
回复 支持 反对

使用道具 举报

0

主题

6

帖子

0

精华

新手上路

积分
26
金钱
26
注册时间
2015-6-2
在线时间
0 小时
发表于 2015-6-16 20:08:29 | 显示全部楼层
回复【33楼】边疆一线:
<br>---------------------------------
<br>这个地址到底是怎么分配的,能不能说详细一点,接受地址和发射地址必须保持一致,能不能举个例子,到底是怎么一致?&nbsp;
<br>谢谢
回复 支持 反对

使用道具 举报

0

主题

6

帖子

0

精华

新手上路

积分
26
金钱
26
注册时间
2015-6-2
在线时间
0 小时
发表于 2015-6-16 20:25:18 | 显示全部楼层
回复【34楼】jermy_z:
<br>---------------------------------
<br>哥们,能不能把这个接受地址和发射地址必须保持一致,能不能举个例子,到底是怎么一致?
回复 支持 反对

使用道具 举报

5

主题

16

帖子

0

精华

初级会员

Rank: 2

积分
176
金钱
176
注册时间
2017-1-5
在线时间
52 小时
发表于 2017-8-3 16:32:50 | 显示全部楼层
楼主程序在发送模式下, 发送地址TX_ADDR和通道0RX_ADDR_P0地址不一样,但是却能成功通信,但是大家的却不能,只有在两者相同时才能正常通信。其原因可能是楼主选的的是ShockBurst TM 模式,但是增强型ShockBurst TM 模式下TX_ADDR和通道0RX_ADDR_P0必须保持一致。 因此大家最好将地址保持一致,这样肯定是没有任何问题的。
你站在桥上看风景 看风景的人在楼上看你
回复 支持 反对

使用道具 举报

8

主题

145

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
462
金钱
462
注册时间
2016-12-14
在线时间
75 小时
发表于 2017-8-3 18:05:42 | 显示全部楼层
学习了。。。。
书山有路勤为径,学海无涯苦作舟!
回复 支持 反对

使用道具 举报

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

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2024-11-22 22:31

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表