发 帖  
原厂入驻New
[问答] 用STM32和LPC1114无线通信,LPC1114做为接收方STM32做为发射方不能通信的原因?
110 STM32
分享
<center></center><br />
我用STM32和LPC1114无线通信,STM32下载的是“无线通信实验”源程序。<br />
LPC1114做为发射方,STM32做为接收方,加自动应答和16位crc校验,可以正常通信。<br />
LPC1114做为接收方,STM32做为发射方,不能通信!后来我把STM32和LPC1114的自动应答和CRC校验取消,STM32显示可以发送出数据,但LPC1114就是接收不到!<br />
没有取消双方的自动应答和CRC校验时,STM32显示发送失败,取消了双方的自动应答和CRC校验后,STM32开始显示发送出去的数据,证明STM32发送是没问题的;<br />
所以我想应该是LPC1114接收不到数据!我的LPC1114和nRF24l01是用杜邦线连接的,连线大约有10CM,不过我想应该和连线没有关系吧,因为它只是SPI读写用的。我一直在监视接收时IRQ,不产生中断!<br />
<br />
请问:问题可能出在哪里?<br />
<br />
谢谢!<br />
0
2020-5-17 18:45:00   评论 分享淘帖 邀请回答
20个回答
回复【楼主位】richgood518:
<br>-------------------------------
<br>都是用我的代码么?
<br>我觉得你可以参考下我的代码,然后对照下.
<br>应该不会有问题的.
回复【2楼】发烧友:
<br>-------------------------------
<br>LPC1114上的程序和你的几乎是一模一样的,当STM32做为接收方,LPC1114做为发送方时,演示效果和你用两个STM32开发板做的无线通信实验室一模一样的。换成STM32发送,LPC1114接收时,就不行了!头大呀!我在想想吧!
2020-5-18 06:09:27 评论

举报

2020-5-18 06:26:43 评论

举报

<p>&nbsp;我的问题搞定了,真是麻烦原子老师了!问题是怎么搞定的呢?说出来真是太可笑了!</p>
<p><br />
STM32的发送频道是40.<br />
我把LPC1114的发送频道写成0x40.<br />
<br />
频道不一样呀!<br />
<br />
真是细节决定成败!调试这个花了3天时间了!多么可惜的时间呀!<br />
</p>
2020-5-18 06:41:01 评论

举报

回复【5楼】richgood518:
<br>-------------------------------
<br>恭喜.
<br>不知道可否把LPC1114的代码上传,给需要的朋友一个参考?
2020-5-18 06:49:27 评论

举报

<p><strong><span style="font-size:small;">它哥M3终于和它弟M0通上话了(同父异母的)下面是LPC1114上的代码,都是照抄发烧友的,只是对应M0上的寄存器做了相应的修改!实验成功!放心使用!</span><br />
</strong><br />
const uint8 TX_ADDRESS[TX_ADR_WIDTH]={0x34,0x43,0x10,0x10,0x01}; //发送地址<br />
const uint8 RX_ADDRESS[RX_ADR_WIDTH]={0x34,0x43,0x10,0x10,0x01}; //发送地址</p>
<p>/*****************************************/<br />
/* 函数功能:SPI通信&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; */<br />
/* 说明:&nbsp;&nbsp;&nbsp; 发送一个字节,接收一个字节&nbsp; */<br />
/*****************************************/<br />
uint8 SPI1_communication(uint8 TxData)<br />
{&nbsp;&nbsp;<br />
&nbsp;while(((SSP1-&gt;SR)&amp;(1&lt;&lt;4))==(1&lt;&lt;4));//忙时等待,SR状态寄存器bit4 BSY:忙时为1<br />
&nbsp;SSP1-&gt;DR = TxData;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //把要发送的数写入TxFIFO<br />
&nbsp;while(((SSP1-&gt;SR)&amp;(1&lt;&lt;2))!=(1&lt;&lt;2));//等待接收完,SR状态寄存器bit2 RNE:接收FIFO非空为1<br />
&nbsp;return(SSP1-&gt;DR);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; //返回收到的数据<br />
}<br />
/*****************************************/<br />
/* 函数功能:SPI1初始化&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; */<br />
/* 说明:&nbsp;&nbsp;&nbsp; 没有用SSEL1&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; */<br />
/*****************************************/<br />
void SPI1_Init(void)<br />
{<br />
&nbsp;uint8 i,Clear=Clear;//Clear=Clear:用这种语句形式解决编译产生的Waring:never used!&nbsp;</p>
<p>&nbsp;SYSCON-&gtRESETCTRL |= (0x1&lt;&lt;2);&nbsp;&nbsp;&nbsp; //禁止SSP1复位<br />
&nbsp;SYSCON-&gt;SYSAHBCLKCTRL |= (0x1&lt;&lt;18);//允许SSP1时钟<br />
&nbsp;SYSCON-&gt;SSP1CLKDIV = 0x06;&nbsp;&nbsp;&nbsp;&nbsp; //6分频:48/6=8Mhz</p>
<p>&nbsp;IOCON-&gtIO2_1 &amp;= ~0x07;<br />
&nbsp;IOCON-&gtIO2_1 |= 0x02;&nbsp;&nbsp;//把PIO2_1选择为SSP CLK <br />
&nbsp;IOCON-&gtIO2_2 &amp;= ~0x07;&nbsp;<br />
&nbsp;IOCON-&gtIO2_2 |= 0x02;&nbsp;&nbsp;//把PIO2_2选择为SSP MISO <br />
&nbsp;IOCON-&gtIO2_3 &amp;= ~0x07;&nbsp;<br />
&nbsp;IOCON-&gtIO2_3 |= 0x02;&nbsp;&nbsp;//把PIO2_3选择为SSP MOSI <br />
&nbsp;// 8位数据传输,SPI模式, CPOL = 0, CPHA = 0,空闲时CLI为1,第一个上升沿采集数据,SCR = 0<br />
&nbsp;SSP1-&gt;CR0 = 0x0107;&nbsp;&nbsp;&nbsp;&nbsp; <br />
&nbsp;// 预分频值为254(注意:这里最小为2,而且必须为偶数 2~254) <br />
&nbsp;SSP1-&gt;CPSR = 0x02;<br />
&nbsp;SSP1-&gt;CR1 &amp;= ~(1&lt;&lt;0);//LBM=0:正常模式<br />
&nbsp;SSP1-&gt;CR1 &amp;= ~(1&lt;&lt;2);//MS=0:主机模式 <br />
&nbsp;SSP1-&gt;CR1 |=&nbsp; (1&lt;&lt;1);//SSE=1:使能SPI1<br />
&nbsp;//清空RxFIFO,LPC1114收发均有8帧FIFO,每帧可放置4~16位数据<br />
&nbsp;for ( i = 0; i &lt; 8; i++ )<br />
&nbsp;{<br />
&nbsp;&nbsp; &nbsp;Clear = SSP1-&gt;DR;//读数据寄存器DR将清空RxFIFO<br />
&nbsp;} &nbsp;&nbsp; &nbsp;&nbsp;&nbsp; <br />
}</p>
<p>/*******************************************/<br />
/* 函数功能;NRF24L01初始化&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; */<br />
/*******************************************/<br />
void NRF24L01_Init()<br />
{<br />
&nbsp;SPI1_Init();<br />
&nbsp;GPIO0-&gt;DIR |= (1&lt;&lt;3);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //P0.3脚为输出,用做CSN<br />
&nbsp;GPIO0-&gt;DATA |= (1&lt;&lt;3);&nbsp;&nbsp;//CSN=1;<br />
&nbsp;GPIO3-&gt;DIR &amp;= ~(1&lt;&lt;4);&nbsp;&nbsp; //NRF24L01_IRQ连接P3.4脚,设置P3.4脚为输入引脚<br />
&nbsp;GPIO3-&gt;DIR |= (1&lt;&lt;5);&nbsp;//NRF24L01_CE连接P3.5脚,设置P3.5脚为输出引脚<br />
&nbsp;GPIO3-&gt;DATA &amp;= ~(1&lt;&lt;5);&nbsp;//CE置低,使能24L01</p>
<p>}</p>
<p>uint8 NRF24L01_Write_Reg(uint8 reg,uint8 value)<br />
{<br />
&nbsp;uint8 status;</p>
<p>&nbsp;GPIO0-&gt;DATA &amp;= ~(1&lt;&lt;3);&nbsp; //CSN=0;&nbsp;&nbsp; <br />
&nbsp; &nbsp;status = SPI1_communication(reg);//发送寄存器值(位置),并读取状态值<br />
&nbsp;SPI1_communication(value);<br />
&nbsp;GPIO0-&gt;DATA |= (1&lt;&lt;3); //CSN=1;</p>
<p>&nbsp;return status;<br />
}</p>
<p>uint8 NRF24L01_Read_Reg(uint8 reg)<br />
{<br />
&nbsp;&nbsp;uint8 value;</p>
<p>&nbsp;GPIO0-&gt;DATA &amp;= ~(1&lt;&lt;3);&nbsp; //CSN=0;&nbsp;&nbsp; <br />
&nbsp; &nbsp;SPI1_communication(reg);//发送寄存器值(位置),并读取状态值<br />
&nbsp;value = SPI1_communication(NOP);<br />
&nbsp;GPIO0-&gt;DATA |= (1&lt;&lt;3); //CSN=1;</p>
<p>&nbsp;return value;<br />
}<br />
&nbsp;<br />
uint8 NRF24L01_Read_Buf(uint8 reg,uint8 *pBuf,uint8 len)<br />
{<br />
&nbsp;uint8 status,u8_ctr;<br />
&nbsp;GPIO0-&gt;DATA &amp;= ~(1&lt;&lt;3);//CSN=0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />
&nbsp; &nbsp;status=SPI1_communication(reg);//发送寄存器值(位置),并读取状态值&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;for(u8_ctr=0;u8_ctr&lt;len;u8_ctr++)pBuf[u8_ctr]=SPI1_communication(0XFF);//读出数据<br />
&nbsp;GPIO0-&gt;DATA |= (1&lt;&lt;3); //CSN=1<br />
&nbsp; &nbsp;return status;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //返回读到的状态值<br />
}</p>
<p>uint8 NRF24L01_Write_Buf(uint8 reg, uint8 *pBuf, uint8 len)<br />
{<br />
&nbsp;uint8 status,u8_ctr;<br />
&nbsp;GPIO0-&gt;DATA &amp;= ~(1&lt;&lt;3);&nbsp;&nbsp;&nbsp;&nbsp; <br />
&nbsp; &nbsp;status = SPI1_communication(reg);//发送寄存器值(位置),并读取状态值<br />
&nbsp; &nbsp;for(u8_ctr=0; u8_ctr&lt;len; u8_ctr++)SPI1_communication(*pBuf++); //写入数据<br />
&nbsp;GPIO0-&gt;DATA |= (1&lt;&lt;3);&nbsp; <br />
&nbsp; &nbsp;return status;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //返回读到的状态值<br />
}<br />
&nbsp;<br />
uint8 NRF24L01_Check(void)<br />
{<br />
&nbsp;uint8 check_in_buf[5]={0x11,0x22,0x33,0x44,0x55};<br />
&nbsp;uint8 check_out_buf[5]={0x00};</p>
<p>&nbsp;NRF24L01_Write_Buf(WRITE_REG+TX_ADDR, check_in_buf, 5);</p>
<p>&nbsp;NRF24L01_Read_Buf(READ_REG+TX_ADDR, check_out_buf, 5);</p>
<p>&nbsp;if((check_out_buf[0] == 0x11)&amp;&amp;\<br />
&nbsp;&nbsp;&nbsp; (check_out_buf[1] == 0x22)&amp;&amp;\<br />
&nbsp;&nbsp;&nbsp; (check_out_buf[2] == 0x33)&amp;&amp;\<br />
&nbsp;&nbsp;&nbsp; (check_out_buf[3] == 0x44)&amp;&amp;\<br />
&nbsp;&nbsp;&nbsp; (check_out_buf[4] == 0x55))return 0;<br />
&nbsp;else return 1;<br />
}</p>
<p>void NRF24L01_RX_Mode(void)<br />
{</p>
<p>&nbsp;GPIO3-&gt;DATA &amp;= ~(1&lt;&lt;5);&nbsp;//CE拉低,使能24L01配置<br />
&nbsp;<br />
&nbsp;NRF24L01_Write_Buf(WRITE_REG+RX_ADDR_P0, (uint8*)RX_ADDRESS, RX_ADR_WIDTH);//写RX接收地址<br />
&nbsp;&nbsp; <br />
&nbsp; &nbsp;NRF24L01_Write_Reg(WRITE_REG+EN_AA,0x01);&nbsp;&nbsp;&nbsp; //开启通道0自动应答&nbsp;&nbsp;&nbsp; <br />
&nbsp; &nbsp;NRF24L01_Write_Reg(WRITE_REG+EN_RXADDR,0x01);//通道0接收允许&nbsp; &nbsp; <br />
&nbsp; &nbsp;NRF24L01_Write_Reg(WRITE_REG+RF_CH,40);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //设置RF工作通道频率 &nbsp;&nbsp;&nbsp; <br />
&nbsp; &nbsp;NRF24L01_Write_Reg(WRITE_REG+RX_PW_P0,RX_PLOAD_WIDTH);//选择通道0的有效数据宽度<br />
&nbsp;NRF24L01_Write_Reg(WRITE_REG+RF_SETUP,0x0f);//设置TX发射参数,0db增益,2Mbps,低噪声增益开启 &nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />
&nbsp; &nbsp;NRF24L01_Write_Reg(WRITE_REG+CONFIG, 0x0f);//配置基本工作模式的参数WR_UP,EN_CRC,16BIT_CRC,接收模式<br />
&nbsp;NRF24L01_Write_Reg(FLUSH_RX,0xff);//清除RX FIFO寄存器 <br />
&nbsp;GPIO3-&gt;DATA |=&nbsp; (1&lt;&lt;5);&nbsp;//CE置高,使能接收</p>
<p>}</p>
<p>void NRF24L01_TX_Mode(void)<br />
{<br />
&nbsp;GPIO3-&gt;DATA &amp;= ~(1&lt;&lt;5);&nbsp;//CE拉低,使能24L01配置&nbsp;&nbsp;&nbsp;&nbsp; <br />
&nbsp; &nbsp;NRF24L01_Write_Buf(WRITE_REG+TX_ADDR,(uint8*)TX_ADDRESS,TX_ADR_WIDTH);//写TX节点地址 <br />
&nbsp; &nbsp;NRF24L01_Write_Buf(WRITE_REG+RX_ADDR_P0,(uint8*)RX_ADDRESS,RX_ADR_WIDTH); //设置TX节点地址,主要为了使能ACK&nbsp;&nbsp; <br />
&nbsp; &nbsp;NRF24L01_Write_Reg(WRITE_REG+EN_AA,0x01);&nbsp;&nbsp;&nbsp;&nbsp; //使能通道0的自动应答&nbsp;&nbsp;&nbsp; <br />
&nbsp; &nbsp;NRF24L01_Write_Reg(WRITE_REG+EN_RXADDR,0x01); //使能通道0的接收地址&nbsp; <br />
&nbsp; &nbsp;NRF24L01_Write_Reg(WRITE_REG+SETUP_RETR,0x1a);//设置自动重发间隔时间:500us + 86us;最大自动重发次数:10次<br />
&nbsp; &nbsp;NRF24L01_Write_Reg(WRITE_REG+RF_CH,40);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //设置RF通道为40<br />
&nbsp; &nbsp;NRF24L01_Write_Reg(WRITE_REG+RF_SETUP,0x0f);&nbsp; //设置TX发射参数,0db增益,2Mbps,低噪声增益开启&nbsp;&nbsp; <br />
&nbsp; &nbsp;NRF24L01_Write_Reg(WRITE_REG+CONFIG,0x0e);&nbsp;&nbsp;&nbsp; //配置基本工作模式的参数WR_UP,EN_CRC,16BIT_CRC,接收模式,开启所有中断<br />
&nbsp;GPIO3-&gt;DATA |=&nbsp; (1&lt;&lt;5);&nbsp;//CE置高,使能发送<br />
}<br />
//接收数据<br />
uint8 NRF24L01_RxPacket(uint8 *rxbuf)<br />
{<br />
&nbsp;uint8 state;</p>
<p>&nbsp;state=NRF24L01_Read_Reg(STATUS);&nbsp; //读取状态寄存器的值&nbsp;&nbsp;&nbsp; &nbsp; <br />
&nbsp;NRF24L01_Write_Reg(WRITE_REG+STATUS,state); //清除TX_DS或MAX_RT中断标志<br />
&nbsp;if(state&amp;RX_OK)//接收到数据<br />
&nbsp;{<br />
&nbsp;&nbsp;NRF24L01_Read_Buf(RD_RX_PLOAD,rxbuf,RX_PLOAD_WIDTH);//读取数据<br />
&nbsp;&nbsp;NRF24L01_Write_Reg(FLUSH_RX,0xff);//清除RX FIFO寄存器 <br />
&nbsp;&nbsp;return 0; <br />
&nbsp;}&nbsp;&nbsp;&nbsp; <br />
&nbsp;return 1;//没收到任何数据<br />
}<br />
//发送数据<br />
uint8 NRF24L01_TxPacket(uint8 *txbuf)<br />
{<br />
&nbsp;uint8 state;<br />
&nbsp;&nbsp; <br />
&nbsp;GPIO3-&gt;DATA &amp;= ~(1&lt;&lt;5);&nbsp;//CE拉低,使能24L01配置<br />
&nbsp; &nbsp;NRF24L01_Write_Buf(WR_TX_PLOAD,txbuf,TX_PLOAD_WIDTH);//写数据到TX BUF&nbsp; 32个字节<br />
&nbsp;&nbsp;GPIO3-&gt;DATA |=&nbsp; (1&lt;&lt;5);&nbsp;//CE置高,使能发送&nbsp;&nbsp;&nbsp; <br />
&nbsp;while((GPIO3-&gt;DATA&amp;(1&lt;&lt;4))==(1&lt;&lt;4));//等待发送完成<br />
&nbsp;state=NRF24L01_Read_Reg(STATUS);&nbsp; //读取状态寄存器的值&nbsp;&nbsp;&nbsp; <br />
&nbsp;NRF24L01_Write_Reg(WRITE_REG+STATUS,state); //清除TX_DS或MAX_RT中断标志<br />
&nbsp;if(state&amp;MAX_TX)//达到最大重发次数<br />
&nbsp;{<br />
&nbsp;&nbsp;NRF24L01_Write_Reg(FLUSH_TX,0xff);//清除TX FIFO寄存器 <br />
&nbsp;&nbsp;return MAX_TX; <br />
&nbsp;}<br />
&nbsp;if(state&amp;TX_OK)//发送完成<br />
&nbsp;{<br />
&nbsp;&nbsp;return TX_OK;<br />
&nbsp;}<br />
&nbsp;return 0xff;//其他原因发送失败<br />
}&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />
&nbsp;</p>
2020-5-18 07:04:43 评论

举报

2020-5-18 07:17:12 评论

举报

顶。工程师不是一般的辛苦。再接再厉
2020-5-18 07:34:54 评论

举报

2020-5-18 07:46:43 评论

举报

2020-5-18 07:54:52 评论

举报

<p>和我遇到的问题一样,呵呵</p>
2020-5-18 08:10:13 评论

举报

2020-5-18 08:30:17 评论

举报

<br>啊能把你的程序发给我一份啊,我最近也调试了好几天了,感觉时间白白流逝了,我的邮箱782861417@qq.com,我用的是LPC1114,太感谢了
2020-5-18 08:35:58 评论

举报

<br>请问原子老师还有无线通信的代码吗?最好是LPC1114的,我最近调试了好几天都没反应
2020-5-18 08:49:31 评论

举报

这个移植一下就好了.
<br>我没弄过1114的.
<br>不过提醒你注意一下SPI的电平,CPHA,CPOL之类的,这两个设置错了,NRF24L01就不鸟你的.
2020-5-18 08:55:23 评论

举报

<br>能否把您的完整程序借用下,谢谢了,我的邮箱是:lvxjian@yahoo.com.cn
2020-5-18 09:01:14 评论

举报

<br>呵呵!高手就是高手!一下就说到重点.
<br>用LPC1114驱动24L01要注意两点:
<br>1、按照nRF24L01芯片手册,"The&nbsp;content&nbsp;of&nbsp;the&nbsp;STATUS&nbsp;register&nbsp;is&nbsp;always&nbsp;read&nbsp;to&nbsp;MISO&nbsp;after&nbsp;a&nbsp;high&nbsp;to&nbsp;low&nbsp;transition&nbsp;on&nbsp;CSN",也就是说,在CSN信号由高变低时,nRF24L01模块要返回Status寄存器的值。因此,在操作nRF24L01模块时,不能直接使用SSP0的SSEL0信号,因为SSEL0在发送每个字节都有一个由高到低的跳变。
<br>
<br>2、必须使用一个IO引脚作为输出,从而控制CSN信号。这里还有一个需要注意的问题,就是例子程序里,读写一字节SPI数据时,等待发送缓冲区是否为空的判断,即:while&nbsp;((SSP0SR&0x01)==0);,当这样使用时,会造成CSN信号在发送完第1字节的命令后,立即变高,也就是第2字节的数据尚未读取回来的时候,CSN信号已经发生了跳变。这里,需要改为等待SSP0忙信号,即:while((SSP0SR&0x10)!=0);
<br>
<br>&nbsp;
<br>
<br>如上两点加以注意,使用LPC1114驱动nRF24L01模块没有任何问题。
<br>
2020-5-18 09:17:40 评论

举报

2020-5-18 09:24:04 评论

举报

只有小组成员才能发言,加入小组>>

12下一页

106个成员聚集在这个小组

加入小组

热门话题

创建小组步骤

关闭

站长推荐 上一条 /7 下一条

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