OpenEdv-开源电子网

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

求助,NFR24L01初始化为什么把SPI初始化两次,而且两次极性和相位不同?

[复制链接]

20

主题

122

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
222
金钱
222
注册时间
2013-9-21
在线时间
0 小时
发表于 2013-9-29 15:43:55 | 显示全部楼层 |阅读模式
<p> void NRF24L01_Init(void)<br />
{ &nbsp;<br />
&nbsp;GPIO_InitTypeDef GPIO_InitStructure;<br />
&nbsp; &nbsp;SPI_InitTypeDef&nbsp; SPI_InitStructure;</p>
<p>&nbsp;RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB|RCC_APB2Periph_GPIOD|RCC_APB2Periph_GPIOG, ENABLE);&nbsp; //使能PB,D,G端口时钟<br />
&nbsp;&nbsp;&nbsp; &nbsp;<br />
&nbsp;<br />
&nbsp;GPIO_InitStructure.GPIO_Pin = GPIO_Pin_12;&nbsp;&nbsp;&nbsp;&nbsp; //PB12上拉 防止W25X的干扰<br />
&nbsp;&nbsp;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; &nbsp;&nbsp; //推挽输出<br />
&nbsp;&nbsp;GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;<br />
&nbsp;&nbsp;GPIO_Init(GPIOB, &amp;GPIO_InitStructure);&nbsp;//初始化指定IO<br />
&nbsp;&nbsp;GPIO_SetBits(GPIOB,GPIO_Pin_12);//上拉&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;<br />
&nbsp;GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2;&nbsp;&nbsp;&nbsp;&nbsp; //PD2推挽输出上拉&nbsp;&nbsp; 禁止SD卡的干扰<br />
&nbsp;&nbsp;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; &nbsp;&nbsp; //推挽输出<br />
&nbsp;&nbsp;GPIO_SetBits(GPIOD,GPIO_Pin_2);//初始化指定IO</p>
<p>&nbsp;GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6|GPIO_Pin_7;&nbsp;//PG6 7 推挽 &nbsp;&nbsp; <br />
&nbsp;&nbsp;GPIO_Init(GPIOG, &amp;GPIO_InitStructure);//初始化指定IO<br />
&nbsp; <br />
&nbsp;GPIO_InitStructure.GPIO_Pin&nbsp; = GPIO_Pin_8;&nbsp;&nbsp; <br />
&nbsp;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPD; //PG8 输入&nbsp; <br />
&nbsp;GPIO_Init(GPIOG, &amp;GPIO_InitStructure);</p>
<p>&nbsp;GPIO_ResetBits(GPIOG,GPIO_Pin_6|GPIO_Pin_7|GPIO_Pin_8);//PG6,7,8上拉&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;<br />
SPI2_Init();&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;//初始化SPI&nbsp;<span style="color:#e53333;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<strong>在这里进行了SPI第一次初始化,</strong></span><br />
&nbsp;<br />
&nbsp;SPI_Cmd(SPI2, DISABLE); // SPI外设不使能</p>
<p>&nbsp;SPI_InitStructure.SPI_Direction = SPI_Direction_2Lines_FullDuplex;&nbsp; //SPI设置为双线双向全双工<br />
&nbsp;SPI_InitStructure.SPI_Mode = SPI_Mode_Master;&nbsp;&nbsp;//SPI主机<br />
&nbsp;SPI_InitStructure.SPI_DataSize = SPI_DataSize_8b;&nbsp;&nbsp;//发送接收8位帧结构<br />
&nbsp;SPI_InitStructure.SPI_CPOL = SPI_CPOL_Low;&nbsp;&nbsp;//时钟悬空低<br />
&nbsp;SPI_InitStructure.SPI_CPHA = SPI_CPHA_1Edge;&nbsp;//数据捕获于第1个时钟沿<br />
&nbsp;SPI_InitStructure.SPI_NSS = SPI_NSS_Soft;&nbsp;&nbsp;//NSS信号由软件控制<br />
&nbsp;SPI_InitStructure.SPI_BaudRatePrescaler = SPI_BaudRatePrescaler_16;&nbsp;&nbsp;//定义波特率预分频的值:波特率预分频值为16<br />
&nbsp;SPI_InitStructure.SPI_FirstBit = SPI_FirstBit_MSB;&nbsp;//数据传输从MSB位开始<br />
&nbsp;SPI_InitStructure.SPI_CRCPolynomial = 7;&nbsp;//CRC值计算的多项式<br />
&nbsp;SPI_Init(SPI2, &amp;SPI_InitStructure);&nbsp; //根据SPI_InitStruct中指定的参数初始化外设SPIx寄存器&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color:#e53333;">这里又进行了第二次初始化,极性和相位与第一次的相反</span><br />
&nbsp;<br />
&nbsp;SPI_Cmd(SPI2, ENABLE); //使能SPI外设&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp; <br />
&nbsp;NRF24L01_CE=0; &nbsp;&nbsp;&nbsp;//使能24L01<br />
&nbsp;NRF24L01_CSN=1;&nbsp;&nbsp;&nbsp;//SPI片选取消&nbsp; <br />
&nbsp; &nbsp;&nbsp; &nbsp; <br />
}<br />
<br />
<br />
我注释掉第一次初始化后,就检测不到NFR24L01模块,这是怎么回事啊?<br />
</p>
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

9

主题

156

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
212
金钱
212
注册时间
2013-9-24
在线时间
0 小时
发表于 2013-9-29 15:56:36 | 显示全部楼层
第一个事低速SPI模式,第二个是高速SPI模式 <br />
再者。。SPI2的GPIO口初始化在第一个里面<br />
人需要沐浴阳光,也必将经历风雨
回复 支持 反对

使用道具 举报

20

主题

122

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
222
金钱
222
注册时间
2013-9-21
在线时间
0 小时
 楼主| 发表于 2013-9-29 16:43:25 | 显示全部楼层
回复【2楼】LOVE_FYD:
<br>---------------------------------
<br>还是不太懂,o(╯□╰)o,第一个SPI2的是APB1上的,是低速的,这个我知道;但第二个高速SPI是什么那,为什么要用到它,百度搜别的例程,里面是一次SPI设置。请您再和我详细说一下,本人刚开始学。
回复 支持 反对

使用道具 举报

9

主题

156

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
212
金钱
212
注册时间
2013-9-24
在线时间
0 小时
发表于 2013-9-29 16:54:49 | 显示全部楼层
可能SPI2_init()低速模式是在别的设备时用的。。是为了方便吧。应为第一个SPI2_init()是一个函数,里面已经使能了SPI2的时钟以及初始化了SPI2对应的引脚。
<br>所以在void&nbsp;NRF24L01_Init(void)里面为了方便,就直接调用了SPI2_init()函数,省去了再次使能时钟和引脚初始化,而SPI的配置初始化就重新写了一个高速的,为了给NRF24L01。
<br>不知道我的理解对不对。。(*^__^*)&nbsp;嘻嘻……
人需要沐浴阳光,也必将经历风雨
回复 支持 反对

使用道具 举报

20

主题

122

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
222
金钱
222
注册时间
2013-9-21
在线时间
0 小时
 楼主| 发表于 2013-9-29 17:16:23 | 显示全部楼层
回复【4楼】LOVE_FYD:
<br>--------------------------
<br>确实第一个SPI——Init()里是256分频,低速;第二个是16分频,速度高。刚才和您一样,也是认为方便才这么写,于是我把第一次SPI_Init()里改成16分频,然后直接在NFR24L01初始化函数里调用,结果竟然还没检测到。。。。不知道哪又出错了。
回复 支持 反对

使用道具 举报

20

主题

122

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
222
金钱
222
注册时间
2013-9-21
在线时间
0 小时
 楼主| 发表于 2013-9-29 17:30:41 | 显示全部楼层
回复【4楼】LOVE_FYD:
<br>---------------------------------
<br>我把SPI2的极性设置为Low,相位设置为第1个跳变沿取样,这才能检测到,不知道NFR24L01模块的SPI接口是不是只能工作在极性设置为Low,相位设置为第1个跳变沿取样时序下。
回复 支持 反对

使用道具 举报

9

主题

156

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
212
金钱
212
注册时间
2013-9-24
在线时间
0 小时
发表于 2013-9-29 23:09:35 | 显示全部楼层
回复【6楼】jikaishihuaidan:
<br>---------------------------------
<br>是的。。。NRF24L01我记得是第一个上升沿。。而且好像是上升沿触发
人需要沐浴阳光,也必将经历风雨
回复 支持 反对

使用道具 举报

20

主题

122

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
222
金钱
222
注册时间
2013-9-21
在线时间
0 小时
 楼主| 发表于 2013-9-30 08:21:36 | 显示全部楼层
回复【7楼】LOVE_FYD:
<br>---------------------------------
<br>谢谢您帮忙解答O(∩_∩)O~
回复 支持 反对

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2024-11-23 19:21

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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