天线|RF射频
直播中

黄鸿江

7年用户 177经验值
私信 关注
[问答]

无法正常使用NRF2401

之前参考原子哥代码写了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,感觉整个输出都右移了,相当于输出有延时,我在代码中加入延时液没有用,还是一样的,但不论我是用FLASH_INIT();还是NRF2401_Init(),调用SPI1_Init();初始化SPI1,但SPI_FLASH却能正常使用,这两个函数中调用的SPI_Init();配置都是一样的,都是第一个上升沿捕获,时钟相性为常低和第一边缘捕获,原子个说过复位外设寄存器就是将相关外设寄存器复位成默认值,可是为啥对SPI_Flash没什么影响,对NRF24L01就影响那么大,我都卡在这好久了,都快崩溃了,希望原子哥能帮我好好解答下,谢谢了。



void NRF24L01_Init(void)

{

GPIO_InitTypeDef GPIO_InitStructure;

RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOB|RCC_AHB1Periph_GPIOG,ENABLE);



GPIO_SetBits(GPIOB,GPIO_Pin_14);//SPI片选失能,防止产生干扰

GPIO_InitStructure.GPIO_Pin=GPIO_Pin_14;

GPIO_InitStructure.GPIO_Mode=GPIO_Mode_OUT;

GPIO_InitStructure.GPIO_OType=GPIO_OType_PP;

GPIO_InitStructure.GPIO_Speed=GPIO_Speed_100MHz;

GPIO_InitStructure.GPIO_PuPd=GPIO_PuPd_UP;

GPIO_Init(GPIOB,&GPIO_InitStructure);





GPIO_SetBits(GPIOG,GPIO_Pin_7);//NRF片选失能

GPIO_InitStructure.GPIO_Pin=GPIO_Pin_6|GPIO_Pin_7;

GPIO_InitStructure.GPIO_Mode=GPIO_Mode_OUT;

GPIO_InitStructure.GPIO_OType=GPIO_OType_PP;

GPIO_InitStructure.GPIO_Speed=GPIO_Speed_100MHz;

GPIO_InitStructure.GPIO_PuPd=GPIO_PuPd_UP;

GPIO_Init(GPIOG,&GPIO_InitStructure);





GPIO_InitStructure.GPIO_Pin=GPIO_Pin_8;

GPIO_InitStructure.GPIO_Mode=GPIO_Mode_IN;

GPIO_InitStructure.GPIO_OType=GPIO_OType_PP;

GPIO_InitStructure.GPIO_Speed=GPIO_Speed_100MHz;

GPIO_InitStructure.GPIO_PuPd=GPIO_PuPd_UP;

GPIO_Init(GPIOG,&GPIO_InitStructure);



GPIO_ResetBits(GPIOB,GPIO_Pin_14);

GPIO_SetBits(GPIOB,GPIO_Pin_14);//SPI片选失能,防止产生干扰

SPI1_Init();

NRF_CE_LOW;

NRF_CS_DISABLE;

if(NRF24L01_Check())

GUI_Text(0,48,"WIRELESS IS ERROR!",24,RED,WHITE);

else

{

NRF24L01_Write_Buf(W_REGISTER+RX_ADDR_P0,RX_ADDRESS,RX_ADR_WIDTH);//设置本地通道0要接收的地址

NRF24L01_Write_Buf(W_REGISTER+TX_ADDR,(u8 *)TX_ADDRESS,TX_ADR_WIDTH);//设置发送时的本地地址

NRF24L01_REG(W_REGISTER+EN_AA,0x00);//自动应答关闭

NRF24L01_REG(W_REGISTER+EN_RXADDR,0x00);//设置默认通道

NRF24L01_REG(W_REGISTER+SETUP_RETR,0x00);//自动重发关闭

NRF24L01_REG(W_REGISTER+SETUP_AW,RX_ADR_WIDTH);//设置接收地址长度

NRF24L01_REG(W_REGISTER+RF_CH,0x00);//2.4GHz

NRF24L01_REG(W_REGISTER+RF_SETUP,0x07);//2MHZ传输, 0dB发射

NRF24L01_REG(W_REGISTER+RX_PW_P0,RX_PLOAD_WIDTH);//设置通道接收的数据长度

NRF24L01_REG(W_REGISTER+CONFIG,0x0E);//主发送,收发完成中断,16CRC

GUI_Text(0,48,"WIRELESS IS OK!",24,RED,WHITE);

}



}

u8 NRF24L01_Check(void)

{



u8 buf[TX_ADR_WIDTH]={0x88,0x88,0x88,0x88,0x88};

u8 i,s=0;

SetSpeed(SPI_BaudRatePrescaler_128);

NRF24L01_Write_Buf(W_REGISTER+TX_ADDR,buf,TX_ADR_WIDTH);//设置本地通道0要接收的地址

buf[0]=0x01;buf[4]=0xff;

delay_us(2);

NRF24L01_Read_Buf(R_REGISTER+TX_ADDR,buf,RX_ADR_WIDTH);

for(i=0;i
{

if(buf!=0x88)s=1;//break;

printf("buf:%02xrn",buf);

}

if(s)return 1;

return 0;

}

void Flash_Init(void)

{

GPIO_InitTypeDef GPIO_InitStructure;



RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOB,ENABLE);

RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOG,ENABLE);



GPIO_InitStructure.GPIO_Pin=GPIO_Pin_14;

GPIO_InitStructure.GPIO_Mode=GPIO_Mode_OUT;

GPIO_InitStructure.GPIO_PuPd=GPIO_PuPd_UP;

GPIO_Init(GPIOB,&GPIO_InitStructure);

GPIO_SetBits(GPIOB,GPIO_Pin_14);



GPIO_InitStructure.GPIO_Pin=GPIO_Pin_7;

GPIO_InitStructure.GPIO_Mode=GPIO_Mode_OUT;

GPIO_InitStructure.GPIO_PuPd=GPIO_PuPd_UP;

GPIO_Init(GPIOB,&GPIO_InitStructure);

GPIO_SetBits(GPIOG,GPIO_Pin_7);

SPI1_Init();

SetSpeed(SPI_BaudRatePrescaler_2);

W25QX_TYPE=W25QXX_ReadID();

}



void SPI1_Init(void)

{

GPIO_InitTypeDef GPIO_InitStructure;

SPI_InitTypeDef SPI_InitStructure;



RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOB,ENABLE);

RCC_APB2PeriphClockCmd(RCC_APB2Periph_SPI1,ENABLE);



SPI_Cmd(SPI1,DISABLE);



GPIO_InitStructure.GPIO_Pin=GPIO_Pin_3|GPIO_Pin_4|GPIO_Pin_5;

GPIO_InitStructure.GPIO_Mode=GPIO_Mode_AF;

GPIO_InitStructure.GPIO_OType=GPIO_OType_PP;

GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;

GPIO_InitStructure.GPIO_PuPd=GPIO_PuPd_UP;

GPIO_Init(GPIOB,&GPIO_InitStructure);



GPIO_PinAFConfig(GPIOB,GPIO_PinSource3,GPIO_AF_SPI1);

GPIO_PinAFConfig(GPIOB,GPIO_PinSource4,GPIO_AF_SPI1);

GPIO_PinAFConfig(GPIOB,GPIO_PinSource5,GPIO_AF_SPI1);



//这里只针对SPI口初始化

//        RCC_APB2PeriphResetCmd(RCC_APB2Periph_SPI1,ENABLE);//复位SPI1

//        RCC_APB2PeriphResetCmd(RCC_APB2Periph_SPI1,DISABLE);//停止复位SPI1



    SPI_InitStructure.SPI_Direction = SPI_Direction_2Lines_FullDuplex;

    SPI_InitStructure.SPI_Mode = SPI_Mode_Master;

    SPI_InitStructure.SPI_DataSize = SPI_DataSize_8b;

    SPI_InitStructure.SPI_CPOL = SPI_CPOL_Low;

    SPI_InitStructure.SPI_CPHA = SPI_CPHA_1Edge;

    SPI_InitStructure.SPI_NSS = SPI_NSS_Soft;   //SPI_NSS_Hard

    SPI_InitStructure.SPI_BaudRatePrescaler = SPI_BaudRatePrescaler_256;

    SPI_InitStructure.SPI_FirstBit = SPI_FirstBit_MSB;

    SPI_InitStructure.SPI_CRCPolynomial = 7;           

SPI_Init(SPI1,&SPI_InitStructure);

SPI_Cmd(SPI1,ENABLE);

ReadWriteByte(0XFF);

}



int main()

{

NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);

delay_init(168);

LCD_Init();

LED_Init();

BEEP_Init();

KEY_Init();

Remote_Init();

uart_init(460800);

usmart_dev.init(84);

Flash_Init();

TPAD_Init(8);

RTC_Config();

IIC_Init();

Temp_Init();

NRF24L01_Init();//Flash_Init();和NRF24L01(),不放在一起就会出错。

while(1)

{

}



回帖(2)

刘慧

2020-4-20 10:22:01
SPI FLASH可以兼容NRF的时序。

但是NRF不可以兼容SPI FLASH的时序。
举报

乐骞添

2020-4-20 10:41:34

我用的是NRF的时序,时序,和底层代码没问题,能正常的读出数据,可是就是会出现前面的问题
举报

更多回帖

发帖
×
20
完善资料,
赚取积分