OpenEdv-开源电子网

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

NRF24L01无线通和SPI初始化问题,跪求高手解答

[复制链接]

15

主题

40

帖子

0

精华

初级会员

Rank: 2

积分
158
金钱
158
注册时间
2015-4-12
在线时间
13 小时
发表于 2015-12-2 19:49:57 | 显示全部楼层 |阅读模式
5金钱
之前参考原子哥代码写了SPI1_Init()的初始化程序,其中没有复位SPI1外设,当我在NRF24L01中再一次调用spi_init()l初始化,来判断有没有NRF24L01,的时候,FLASH_INIT();和NRF2401_Init(),在main(),中紧挨着中间没有其他函数和代码时没有问题,能够检测到无线模块,但是无法正常使用NRF2401,当我注释掉FLASH_INIT();或者中间有调用其它函数,或者代码是,检测不到无线模块,在几个星期的调试中,我发现加入了SPI_DeInit();就可以了,我用逻辑分析仪看了下波形,如果没有用SPI_DeInit();spi输出的数据不正确,如输出0x30,0x88,0x88,0x88,0x88,0x88,结果变成了0xff,0x11,0x11,0x11,0x11,0x10,感觉整个输出都右移了,相当于输出有延时,我在代码中加入延时液没有用,还是一样的,但不论我是用<span style="line-height:23.3333px;">FLASH_INIT();还是<span style="line-height:23.3333px;">NRF2401_Init(),调用SPI1_Init();初始化SPI1,但SPI_FLASH却能正常使用,这两个函数中调用的SPI_Init();配置都是一样的,都是第一个上升沿捕获,时钟相性为常低和第一边缘捕获,原子个说过</span>复位外设寄存器就是将相关外设寄存器复位成默认值,可是为啥对SPI_Flash没什么影响,对NRF24L01就影响那么大,我都卡在这好久了,都快崩溃了,希望原子哥能帮我好好解答下,谢谢了。<br />
<br />
void NRF24L01_Init(void)<br />
{<br />
GPIO_InitTypeDef GPIO_InitStructure;<br />
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOB|RCC_AHB1Periph_GPIOG,ENABLE);<br />
<br />
GPIO_SetBits(GPIOB,GPIO_Pin_14);//SPI片选失能,防止产生干扰<br />
GPIO_InitStructure.GPIO_Pin=GPIO_Pin_14;<br />
GPIO_InitStructure.GPIO_Mode=GPIO_Mode_OUT;<br />
GPIO_InitStructure.GPIO_OType=GPIO_OType_PP;<br />
GPIO_InitStructure.GPIO_Speed=GPIO_Speed_100MHz;<br />
GPIO_InitStructure.GPIO_PuPd=GPIO_PuPd_UP;<br />
GPIO_Init(GPIOB,&amp;GPIO_InitStructure);<br />
<br />
<br />
GPIO_SetBits(GPIOG,GPIO_Pin_7);//NRF片选失能<br />
GPIO_InitStructure.GPIO_Pin=GPIO_Pin_6|GPIO_Pin_7;<br />
GPIO_InitStructure.GPIO_Mode=GPIO_Mode_OUT;<br />
GPIO_InitStructure.GPIO_OType=GPIO_OType_PP;<br />
GPIO_InitStructure.GPIO_Speed=GPIO_Speed_100MHz;<br />
GPIO_InitStructure.GPIO_PuPd=GPIO_PuPd_UP;<br />
GPIO_Init(GPIOG,&amp;GPIO_InitStructure);<br />
<br />
<br />
GPIO_InitStructure.GPIO_Pin=GPIO_Pin_8;<br />
GPIO_InitStructure.GPIO_Mode=GPIO_Mode_IN;<br />
GPIO_InitStructure.GPIO_OType=GPIO_OType_PP;<br />
GPIO_InitStructure.GPIO_Speed=GPIO_Speed_100MHz;<br />
GPIO_InitStructure.GPIO_PuPd=GPIO_PuPd_UP;<br />
GPIO_Init(GPIOG,&amp;GPIO_InitStructure);<br />
<br />
GPIO_ResetBits(GPIOB,GPIO_Pin_14);<br />
GPIO_SetBits(GPIOB,GPIO_Pin_14);//SPI片选失能,防止产生干扰<br />
SPI1_Init();<br />
NRF_CE_LOW;<br />
NRF_CS_DISABLE;<br />
if(NRF24L01_Check())<br />
GUI_Text(0,48,"WIRELESS IS ERROR!",24,RED,WHITE);<br />
else<br />
{ <br />
NRF24L01_Write_Buf(W_REGISTER+RX_ADDR_P0,RX_ADDRESS,RX_ADR_WIDTH);//设置本地通道0要接收的地址<br />
NRF24L01_Write_Buf(W_REGISTER+TX_ADDR,(u8 *)TX_ADDRESS,TX_ADR_WIDTH);//设置发送时的本地地址<br />
NRF24L01_REG(W_REGISTER+EN_AA,0x00);//自动应答关闭<br />
NRF24L01_REG(W_REGISTER+EN_RXADDR,0x00);//设置默认通道<br />
NRF24L01_REG(W_REGISTER+SETUP_RETR,0x00);//自动重发关闭<br />
NRF24L01_REG(W_REGISTER+SETUP_AW,RX_ADR_WIDTH);//设置接收地址长度<br />
NRF24L01_REG(W_REGISTER+RF_CH,0x00);//2.4GHz<br />
NRF24L01_REG(W_REGISTER+RF_SETUP,0x07);//2MHZ传输, 0dB发射<br />
NRF24L01_REG(W_REGISTER+RX_PW_P0,RX_PLOAD_WIDTH);//设置通道接收的数据长度<br />
NRF24L01_REG(W_REGISTER+CONFIG,0x0E);//主发送,收发完成中断,16CRC<br />
GUI_Text(0,48,"WIRELESS IS OK!",24,RED,WHITE);<br />
}<br />
<br />
}<br />
u8 NRF24L01_Check(void)<br />
{<br />
<br />
u8 buf[TX_ADR_WIDTH]={0x88,0x88,0x88,0x88,0x88};<br />
u8 i,s=0;<br />
SetSpeed(SPI_BaudRatePrescaler_128);<br />
NRF24L01_Write_Buf(W_REGISTER+TX_ADDR,buf,TX_ADR_WIDTH);//设置本地通道0要接收的地址<br />
buf[0]=0x01;buf[4]=0xff;<br />
delay_us(2);<br />
NRF24L01_Read_Buf(R_REGISTER+TX_ADDR,buf,RX_ADR_WIDTH);<br />
for(i=0;i&lt;TX_ADR_WIDTH;i++)<br />
{<br />
if(buf!=0x88)s=1;//break;<br />
printf("buf:%02x\r\n",buf);<br />
}<br />
if(s)return 1;<br />
return 0;<br />
}<br />
void Flash_Init(void)<br />
{<br />
GPIO_InitTypeDef GPIO_InitStructure;<br />
<br />
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOB,ENABLE);<br />
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOG,ENABLE);<br />
<br />
GPIO_InitStructure.GPIO_Pin=GPIO_Pin_14;<br />
GPIO_InitStructure.GPIO_Mode=GPIO_Mode_OUT;<br />
GPIO_InitStructure.GPIO_PuPd=GPIO_PuPd_UP;<br />
GPIO_Init(GPIOB,&amp;GPIO_InitStructure);<br />
GPIO_SetBits(GPIOB,GPIO_Pin_14);<br />
<br />
GPIO_InitStructure.GPIO_Pin=GPIO_Pin_7;<br />
GPIO_InitStructure.GPIO_Mode=GPIO_Mode_OUT;<br />
GPIO_InitStructure.GPIO_PuPd=GPIO_PuPd_UP;<br />
GPIO_Init(GPIOB,&amp;GPIO_InitStructure);<br />
GPIO_SetBits(GPIOG,GPIO_Pin_7);<br />
SPI1_Init();<br />
SetSpeed(SPI_BaudRatePrescaler_2);<br />
W25QX_TYPE=W25QXX_ReadID();<br />
}<br />
<br />
void SPI1_Init(void)<br />
{<br />
GPIO_InitTypeDef GPIO_InitStructure;<br />
SPI_InitTypeDef SPI_InitStructure;<br />
<br />
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOB,ENABLE);<br />
RCC_APB2PeriphClockCmd(RCC_APB2Periph_SPI1,ENABLE);<br />
<br />
SPI_Cmd(SPI1,DISABLE);<br />
<br />
GPIO_InitStructure.GPIO_Pin=GPIO_Pin_3|GPIO_Pin_4|GPIO_Pin_5;<br />
GPIO_InitStructure.GPIO_Mode=GPIO_Mode_AF;<br />
GPIO_InitStructure.GPIO_OType=GPIO_OType_PP;<br />
GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;<br />
GPIO_InitStructure.GPIO_PuPd=GPIO_PuPd_UP;<br />
GPIO_Init(GPIOB,&amp;GPIO_InitStructure);<br />
<br />
GPIO_PinAFConfig(GPIOB,GPIO_PinSource3,GPIO_AF_SPI1);<br />
GPIO_PinAFConfig(GPIOB,GPIO_PinSource4,GPIO_AF_SPI1);<br />
GPIO_PinAFConfig(GPIOB,GPIO_PinSource5,GPIO_AF_SPI1);<br />
<br />
//这里只针对SPI口初始化<br />
//        RCC_APB2PeriphResetCmd(RCC_APB2Periph_SPI1,ENABLE);//复位SPI1<br />
//        RCC_APB2PeriphResetCmd(RCC_APB2Periph_SPI1,DISABLE);//停止复位SPI1<br />
<br />
&nbsp; &nbsp; SPI_InitStructure.SPI_Direction = SPI_Direction_2Lines_FullDuplex;&nbsp;<br />
&nbsp; &nbsp; SPI_InitStructure.SPI_Mode = SPI_Mode_Master;&nbsp;<br />
&nbsp; &nbsp; SPI_InitStructure.SPI_DataSize = SPI_DataSize_8b;&nbsp;<br />
&nbsp; &nbsp; SPI_InitStructure.SPI_CPOL = SPI_CPOL_Low;&nbsp;<br />
&nbsp; &nbsp; SPI_InitStructure.SPI_CPHA = SPI_CPHA_1Edge;&nbsp;<br />
&nbsp; &nbsp; SPI_InitStructure.SPI_NSS = SPI_NSS_Soft; &nbsp; //SPI_NSS_Hard<br />
&nbsp; &nbsp; SPI_InitStructure.SPI_BaudRatePrescaler = SPI_BaudRatePrescaler_256;&nbsp;<br />
&nbsp; &nbsp; SPI_InitStructure.SPI_FirstBit = SPI_FirstBit_MSB;&nbsp;<br />
&nbsp; &nbsp; SPI_InitStructure.SPI_CRCPolynomial = 7;          &nbsp;<br />
SPI_Init(SPI1,&amp;SPI_InitStructure);<br />
SPI_Cmd(SPI1,ENABLE);<br />
ReadWriteByte(0XFF);<br />
}<br />
<br />
int main()<br />
{<br />
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);<br />
delay_init(168);<br />
LCD_Init();<br />
LED_Init();<br />
BEEP_Init();<br />
KEY_Init();<br />
Remote_Init();<br />
uart_init(460800);<br />
usmart_dev.init(84);<br />
Flash_Init();<br />
TPAD_Init(8);<br />
RTC_Config();<br />
IIC_Init();<br />
Temp_Init();<br />
NRF24L01_Init();//<span style="line-height:23.3333px;">Flash_Init();和NRF24L01(),不放在一起就会出错。</span><br />
while(1)<br />
{<br />
}<br />
<br />
</span>

正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

558

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
164897
金钱
164897
注册时间
2010-12-1
在线时间
2100 小时
发表于 2015-12-2 21:32:41 | 显示全部楼层
SPI&nbsp;FLASH可以兼容NRF的时序。
<br>但是NRF不可以兼容SPI&nbsp;FLASH的时序。
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复

使用道具 举报

15

主题

40

帖子

0

精华

初级会员

Rank: 2

积分
158
金钱
158
注册时间
2015-4-12
在线时间
13 小时
 楼主| 发表于 2015-12-2 22:54:07 | 显示全部楼层
回复【2楼】正点原子:
<br>---------------------------------
<br>我用的是NRF的时序,时序,和底层代码没问题,能正常的读出数据,可是就是会出现前面的问题
回复

使用道具 举报

0

主题

6

帖子

0

精华

新手上路

积分
43
金钱
43
注册时间
2017-10-27
在线时间
11 小时
发表于 2019-8-15 15:00:49 | 显示全部楼层
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2024-6-10 10:29

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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