OpenEdv-开源电子网

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

最近刚搞NRF24L01,用的是原子的程序就是改了几个IO口,一直检测不到nrf24L01怎么回事

[复制链接]

2

主题

6

帖子

0

精华

新手上路

积分
34
金钱
34
注册时间
2014-4-17
在线时间
0 小时
发表于 2014-4-17 19:33:25 | 显示全部楼层 |阅读模式
<span style="font-size:16px;">int main(void)</span><br />
<span style="font-size:16px;">{                         &nbsp;</span><br />
<span style="font-size:16px;">&nbsp; &nbsp; u16 t=0;                        &nbsp;</span><br />
<span style="font-size:16px;">&nbsp; &nbsp; u8 a,tmp_buf[33];</span><br />
<span style="font-size:16px;">&nbsp;&nbsp;</span><br />
<span style="font-size:16px;">&nbsp; &nbsp; Stm32_Clock_Init(9);        //系统时钟设置</span><br />
<span style="font-size:16px;">&nbsp; &nbsp;&nbsp;</span><span style="font-size:16px;">uart_init(72,9600);                 //串口初始化为9600</span><br />
<span style="font-size:16px;">&nbsp; &nbsp; delay_init(72);         &nbsp;                  //延时初始化&nbsp;</span><br />
<span style="font-size:16px;">&nbsp; &nbsp; NRF24L01_Init(); &nbsp; &nbsp;        //初始化NRF24L01&nbsp;</span><br />
<br />
<span style="font-size:16px;">&nbsp; &nbsp; a=NRF24L01_Check(); &nbsp; //</span><span style="font-size:16px;color:#E53333;">设置变量a是为了看</span><span style="font-size:16px;color:#E53333;">NRF24L01_Check()返回来什么值,调试的时候一直显示0x01,不知道怎么回事</span><span style="font-size:16px;color:#E53333;">?</span><br />
<span style="font-size:16px;">&nbsp; &nbsp;&nbsp;</span><span style="font-size:16px;">while(a)        //检查NRF24L01是否在位. </span><br />
<span style="font-size:16px;">&nbsp; &nbsp;{</span><br />
<span style="font-size:16px;">&nbsp; &nbsp; &nbsp;;</span><br />
<span style="font-size:16px;">&nbsp; &nbsp;}</span><br />
<span style="font-size:16px;">}</span><br />
<span style="font-size:16px;"></span><br />
<span style="font-size:16px;"></span><span style="font-size:16px;">//初始化24L01的IO口</span><br />
<span style="font-size:16px;">void NRF24L01_Init(void)</span><br />
<span style="font-size:16px;">{</span><br />
<span style="font-size:16px;">&nbsp;         RCC-&gt;APB2ENR|=1&lt;&lt;3; &nbsp; &nbsp; //使能PORTB时钟          &nbsp; &nbsp;</span><br />
<span style="font-size:16px;">&nbsp;        RCC-&gt;APB2ENR|=1&lt;&lt;2;                //使能PORTA时钟</span><br />
<span style="font-size:16px;"> GPIOA-&gt;CRL&amp;=0XFFF0FFFF;&nbsp;</span><br />
<span style="font-size:16px;"> GPIOA-&gt;CRL|=0X00030000;        //<span style="color:#E53333;">A4=PG6 推挽</span> &nbsp; &nbsp;</span><br />
<span style="font-size:16px;"> GPIOA-&gt;CRH&amp;=0XFF0F0FFF;&nbsp;</span><br />
<span style="font-size:16px;"> GPIOA-&gt;CRH|=0X00803000;        /<span style="color:#E53333;">/PA11=PG7推挽 &nbspA13=PG8 输入</span> &nbsp; &nbsp;</span><br />
<span style="font-size:16px;"> GPIOA-&gt;ODR|=0X00003810; //<span style="color:#E53333;">A4 11 13上拉 &nbsp; &nbspG6 7 8 上拉 </span> &nbsp;&nbsp;</span><br />
<br />
<span style="font-size:16px;"> SPI2_Init(); &nbsp; &nbsp;                //初始化SPI         &nbsp;</span><br />
<span style="font-size:16px;"> //针对NRF的特点修改SPI的设置</span><br />
<span style="font-size:16px;">&nbsp;        SPI2-&gt;CR1&amp;=~(1&lt;&lt;6);         //SPI设备失能</span><br />
<span style="font-size:16px;"> SPI2-&gt;CR1&amp;=~(1&lt;&lt;1);         //空闲模式下SCK为0 CPOL=0</span><br />
<span style="font-size:16px;"> SPI2-&gt;CR1&amp;=~(1&lt;&lt;0);         //数据采样从第1个时间边沿开始,CPHA=0 &nbsp;</span><br />
<span style="font-size:16px;"> SPI2-&gt;CR1|=1&lt;&lt;6;                 //SPI设备使能</span><br />
<br />
<span style="font-size:16px;"> NRF24L01_CE=0;                         //使能24L01</span><br />
<span style="font-size:16px;"> NRF24L01_CSN=1;                        //SPI片选取消                                  &nbsp;</span><br />
<span style="font-size:16px;">}</span><br />
<br />
<span style="font-size:16px;"></span><span style="font-size:16px;">void SPI2_Init(void)</span><br />
<span style="font-size:16px;">{        &nbsp;</span><br />
<span style="font-size:16px;"> RCC-&gt;APB2ENR|=1&lt;&lt;2; &nbsp;        //PORTA时钟使能         &nbsp;</span><br />
<span style="font-size:16px;"> RCC-&gt;APB1ENR|=1&lt;&lt;14; &nbsp;         //SPI2时钟使能&nbsp;</span><br />
<span style="font-size:16px;"> //这里只针对SPI口初始化</span><br />
<span style="font-size:16px;"> GPIOA-&gt;CRL&amp;=0X000FFFFF;&nbsp;</span><br />
<span style="font-size:16px;"> GPIOA-&gt;CRL|=0XBBB00000;        //<span style="color:#E53333;">A5 6 7 复用 </span> &nbsp; &nbsp;</span><br />
<span style="font-size:16px;"> GPIOA-&gt;ODR|=0X7&lt;&lt;5; &nbsp;         //<span style="color:#E53333;">A5 6 7 上拉</span></span><br />
<span style="font-size:16px;"> SPI2-&gt;CR1|=0&lt;&lt;10;                //全双工模式 </span><br />
<span style="font-size:16px;"> SPI2-&gt;CR1|=1&lt;&lt;9;                 //软件nss管理</span><br />
<span style="font-size:16px;"> SPI2-&gt;CR1|=1&lt;&lt;8; &nbsp;</span><br />
<br />
<span style="font-size:16px;"> SPI2-&gt;CR1|=1&lt;&lt;2;                 //SPI主机</span><br />
<span style="font-size:16px;"> SPI2-&gt;CR1|=0&lt;&lt;11;                //8bit数据格式 </span><br />
<span style="font-size:16px;"> SPI2-&gt;CR1|=1&lt;&lt;1;                 //空闲模式下SCK为1 CPOL=1</span><br />
<span style="font-size:16px;"> SPI2-&gt;CR1|=1&lt;&lt;0;                 //数据采样从第二个时间边沿开始,CPHA=1 &nbsp;</span><br />
<span style="font-size:16px;"> //对SPI2属于APB1的外设.时钟频率最大为36M.</span><br />
<span style="font-size:16px;"> SPI2-&gt;CR1|=3&lt;&lt;3;                 //Fsck=Fpclk1/256</span><br />
<span style="font-size:16px;"> SPI2-&gt;CR1|=0&lt;&lt;7;                 //MSBfirst &nbsp;&nbsp;</span><br />
<span style="font-size:16px;"> SPI2-&gt;CR1|=1&lt;&lt;6;                 //SPI设备使能</span><br />
<span style="font-size:16px;"> SPI2_ReadWriteByte(0xff);//启动传输                &nbsp;</span><br />
<span style="font-size:16px;">}</span><br />
<span style="font-size:16px;"></span><br />
<span style="font-size:16px;">//24L01操作线<br />
#define NRF24L01_CE &nbsp;<span style="color:#E53333;"> PAout(4)</span> &nbsp; &nbsp; &nbsp;//24L01片选信号<br />
#define NRF24L01_CSN <span style="color:#E53333;">&nbspAout(11)</span> &nbsp; //SPI片选信号         &nbsp;&nbsp;<br />
#define NRF24L01_IRQ &nbsp;<span style="color:#E53333;">Ain(13) </span>&nbsp; &nbsp; //IRQ主机数据输入<br />
</span><br />
<span style="font-size:16px;">改过的地方都用红色标出来了,其他的都是原子的程序没动,不知道怎么回事检测不到NRF24L01?还有就是检测的时候只要把发射端打开还是发射,接收都打开啊?求解啊 &nbsp; 小白一枚</span><span style="font-size:16px;"></span><br />
<span style="font-size:16px;"></span><br />
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

2

主题

6

帖子

0

精华

新手上路

积分
34
金钱
34
注册时间
2014-4-17
在线时间
0 小时
 楼主| 发表于 2014-4-17 19:40:01 | 显示全部楼层
用的是自己买的最小系统开发板,不知道哪儿的问题,求指导啊
回复 支持 反对

使用道具 举报

69

主题

475

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1334
金钱
1334
注册时间
2013-12-28
在线时间
197 小时
发表于 2014-4-17 19:52:11 | 显示全部楼层
回复【楼主位】灰雪:
<br>---------------------------------
<br>检测的时候跟发送和接受都没有太大的关系。检测只不过是看你有没有连接NRF模块。检测的方式是通过SPI向NRF中写入数据然后读取数据的方式去进行检测。并没有涉及到NRF之间的通信问题。
回复 支持 反对

使用道具 举报

2

主题

6

帖子

0

精华

新手上路

积分
34
金钱
34
注册时间
2014-4-17
在线时间
0 小时
 楼主| 发表于 2014-4-17 19:55:35 | 显示全部楼层
回复【3楼】jiaozhu:
<br>---------------------------------
<br>程序都是原子的,我所改动的就那几个管脚,能帮忙看看问题在哪儿吗?
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165186
金钱
165186
注册时间
2010-12-1
在线时间
2106 小时
发表于 2014-4-17 21:08:32 | 显示全部楼层
代码看上去OK,找找硬件是不是有其他问题吧?
<br>比如SPI是否多个器件共用?
<br>电路连接是否正常?
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

2

主题

6

帖子

0

精华

新手上路

积分
34
金钱
34
注册时间
2014-4-17
在线时间
0 小时
 楼主| 发表于 2014-4-19 09:58:45 | 显示全部楼层
原子哥,为什么到这一步while(NRF24L01_Check()),有时候能够监测到NRF24L01,有时候监测不到呢,监测不到的时间在线调试后显示停在了延时函数哪儿,这是为什么啊?各位大神,求解啊&nbsp;&nbsp;在线等
回复 支持 反对

使用道具 举报

0

主题

2

帖子

0

精华

新手入门

积分
22
金钱
22
注册时间
2014-4-18
在线时间
0 小时
发表于 2014-4-19 10:38:45 | 显示全部楼层
有可能是线连接的问题,自己买的最小系统开发板,引脚之间是用杜邦线连接起来的吧,杜邦线看似插好了,但是在通讯时,只要稍微动一下就会出问题,以前我也遇到过,最好是自己焊个电路连接板,不要用杜邦线。
青春是用来奋斗的,而不是用来享受的
回复 支持 反对

使用道具 举报

2

主题

6

帖子

0

精华

新手上路

积分
34
金钱
34
注册时间
2014-4-17
在线时间
0 小时
 楼主| 发表于 2014-4-19 10:55:24 | 显示全部楼层
回复【7楼】DLP1990:
<br>---------------------------------
<br>还真是这问题,csn引脚松了,,,,,,,谢了
回复 支持 反对

使用道具 举报

5

主题

110

帖子

0

精华

初级会员

Rank: 2

积分
152
金钱
152
注册时间
2013-9-16
在线时间
0 小时
发表于 2014-12-25 12:59:18 | 显示全部楼层
主机可以通过切换频率参数来分别和B&nbsp;C节点通讯,方法如下
<br>&nbsp;
<br>第一步-&gt;&nbsp;设置电平SETA=1&nbsp;SETB=1&nbsp;进入参数设置模式
<br>第二步-&gt;&nbsp;0xFF&nbsp;0x56&nbsp;0xAE&nbsp;0x35&nbsp;0xA9&nbsp;0x55&nbsp;0x9F&nbsp;0x00&nbsp;0x03&nbsp;0x07&nbsp;0x2f&nbsp;0xD8
<br>第三步-&gt;&nbsp;等待返回0x24&nbsp;0x24&nbsp;0x24&nbsp;0x07&nbsp;0x2f&nbsp;0xD8&nbsp;后再设置电平SETA=0&nbsp;SETB=0&nbsp;进入正常收发模式
<br>第四步-&gt;&nbsp;输入要传的数据即可将数据传输给B节点
<br>&nbsp;
<br>&nbsp;
<br>第五步-&gt;&nbsp;设置电平SETA=1&nbsp;SETB=1&nbsp;进入参数设置模式
<br>第六步-&gt;&nbsp;0xFF&nbsp;0x56&nbsp;0xAE&nbsp;0x35&nbsp;0xA9&nbsp;0x55&nbsp;0x9F&nbsp;0x00&nbsp;0x03&nbsp;0x07&nbsp;0x33&nbsp;0xC0
<br>第七步-&gt;&nbsp;等待返回0x24&nbsp;0x24&nbsp;0x24&nbsp;0x07&nbsp;0x33&nbsp;0xC0后再设置电平SETA=0&nbsp;SETB=0&nbsp;进入正常收发模式
<br>第八步-&gt;&nbsp;输入要传的数据即可将数据传输给C节点
<br>&nbsp;
<br>更多节点以此类推即可
<br>&nbsp;
<br>@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
<br>例如变址多点通讯,
<br>@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
<br>&nbsp;
<br>例如
<br>当主机为WLK01L39模块,
<br>主机A本机地址1:0x01,本机地址2:0x01,
<br>从机B本机地址1:0x02&nbsp;,本机地址2:0x01&nbsp;,
<br>从机C本机地址1:0x03,本机地址2:0x01&nbsp;,&nbsp;&nbsp;
<br>主机可以通过切换目标地址参数来分别和B&nbsp;C节点通讯,因为在频率一样的前提下
<br>只有主机的目标地址和从机的本机地址一致时,对应从机才能与其建立通讯,并接收数据方法如下
<br>&nbsp;
<br>第一步-&gt;&nbsp;设置电平SETA=1&nbsp;SETB=1&nbsp;进入参数设置模式
<br>第二步-&gt;&nbsp;0xFF&nbsp;0x56&nbsp;0xAE&nbsp;0x35&nbsp;0xA9&nbsp;0x55&nbsp;0x8E&nbsp;0x00&nbsp;0x01&nbsp;0x02&nbsp;
<br>第三步-&gt;&nbsp;等待返回0x24&nbsp;0x24&nbsp;0x24&nbsp;&nbsp;0x02&nbsp;后再&nbsp;设置电平SETA=0&nbsp;SETB=0&nbsp;进入正常收发模式
<br>第四步-&gt;&nbsp;输入要传的数据即可将数据传输给B节点
<br>&nbsp;
<br>&nbsp;
<br>第五步-&gt;&nbsp;设置电平SETA=1&nbsp;SETB=1&nbsp;进入参数设置模式
<br>第六步-&gt;&nbsp;0xFF&nbsp;0x56&nbsp;0xAE&nbsp;0x35&nbsp;0xA9&nbsp;0x55&nbsp;0x8E&nbsp;0x00&nbsp;0x01&nbsp;0x03
<br>第七步-&gt;&nbsp;等待返回0x24&nbsp;0x24&nbsp;0x24&nbsp;&nbsp;0x03&nbsp;后再设置电平SETA=0&nbsp;SETB=0&nbsp;进入正常收发模式
<br>第八步-&gt;&nbsp;输入要传的数据即可将数据传输给C节点
<br>&nbsp;
<br>更多节点以此类推即可
<br>&nbsp;
<br>###################################################################
<br>多点通讯还有一种最简单的方式,就是点名通讯
<br>###################################################################
<br>1.主机和从机的参数都完全一样
<br>2.都处于正常收发模式
<br>3.当主机A发0x01(该指令可自定义),
<br>&nbsp;&nbsp;当从机B和从机C都收到0x01,
<br>&nbsp;&nbsp;从机B视0x01为上传数据命令,立刻发射要上传数据,然后主机A会收到B上传数据,而从机C视0x01为无效指令,不发送数据
<br>&nbsp;&nbsp;当主机A发0x02(该指令可自定义),
<br>&nbsp;&nbsp;当从机B和从机C都收到0x01,
<br>&nbsp;&nbsp;从机C视0x02为上传数据指令,立刻发射要上传数据,然后主机A会收到C上传数据,而从机B视0x02为无效指令,不发送数据
<br>更多节点以此类推即可
<br>------------------
<br>NRF905&nbsp;RF903&nbsp;CC1100&nbsp;CC2500&nbsp;CC1020&nbsp;NRF2401&nbsp;NRF24L01&nbsp;无线数传芯片/模块性能汇总及应用指南
<br>你好,我们是无线制造供应商,欢迎交流
<br>QQ:35625400&nbsp;&nbsp;&nbsp;&nbsp;MSN:ll88mm88@hotmail.com&nbsp;
<br>HONE:13704018223&nbsp;&nbsp;&nbsp;陈工
RFinchina 团队欢迎无线方面的技术交流 QQ 474882985
回复 支持 反对

使用道具 举报

13

主题

51

帖子

0

精华

初级会员

Rank: 2

积分
143
金钱
143
注册时间
2014-12-12
在线时间
4 小时
发表于 2015-1-6 16:46:01 | 显示全部楼层
回复【3楼】jiaozhu:
<br>---------------------------------
<br>难怪,终于知道为什么是在24l01初始化之前就检测了!
回复 支持 反对

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2024-10-1 12:14

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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