微波EDA网,见证研发工程师的成长!
首页 > 研发问答 > 嵌入式设计讨论 > MCU和单片机设计讨论 > stm32 f407 调试2.4g接收端收不到数据

stm32 f407 调试2.4g接收端收不到数据

时间:10-02 整理:3721RD 点击:
我是按照这位仁兄的方法进行调试的
http://blog.sina.com.cn/s/blog_a6164cc90101awp5.html
发送端已经调试通过 statue寄存器返回值是0x2e  fifo_status=0x11
我现在的问题是接收端status始终等于0x0e   fifo_status=0x11 没有收到数据,有没有人遇到相同的问题,帮忙解决一下啊
马上要交作品了   急 啊 大家帮帮忙   

下边是f407程序


#include "NRF24L01.h"
#include "stm32f4xx.h"
#define        RX_DR                        0x40
#define        TX_DS                        0x20
#define        MAX_RT                        0x10
u8 TX_ADDRESS[TX_ADR_WIDTH] = {0xb2,0xb2,0xb3,0xb4,0x01};  // 定义一个静态发送地址

u8 RX_BUF[TX_PLOAD_WIDTH];
u8 TX_BUF[TX_PLOAD_WIDTH];
void Initial_SPI(SPI_TypeDef* SPIx)  //初始化IOB端口
{
        GPIO_InitTypeDef GPIO_InitStructure;
        SPI_InitTypeDef SPI_InitStruct;
       
        if(SPIx==SPI2)
        {
          RCC_APB1PeriphClockCmd(RCC_APB1Periph_SPI2, ENABLE);         //使能SPI2的时钟
          RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOB ,ENABLE);        //使能PB口的时钟
          GPIO_PinAFConfig(GPIOB, GPIO_PinSource10, GPIO_AF_SPI2);//将PB10,14,15三个引脚映射到SPI2功能上
          GPIO_PinAFConfig(GPIOB, GPIO_PinSource14, GPIO_AF_SPI2);
          GPIO_PinAFConfig(GPIOB, GPIO_PinSource15, GPIO_AF_SPI2);
          GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;                        //IO口的模式为服用模式
          GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;                        //推挽输出
          GPIO_InitStructure.GPIO_PuPd  = GPIO_PuPd_DOWN;                        //下拉电阻,平时状态为低电平
          GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;                //速度为50MHz
          GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10 | GPIO_Pin_14 | GPIO_Pin_15;
          GPIO_Init(GPIOB, &GPIO_InitStructure);                                        //执行初始化函数
          SPI_I2S_DeInit(SPI2);
        }
        SPI_InitStruct.SPI_BaudRatePrescaler = SPI_BaudRatePrescaler_8;
        SPI_InitStruct.SPI_Direction= SPI_Direction_2Lines_FullDuplex;
        SPI_InitStruct.SPI_Mode = SPI_Mode_Master;
        SPI_InitStruct.SPI_DataSize = SPI_DataSize_8b;
        SPI_InitStruct.SPI_CPOL = SPI_CPOL_Low;
        SPI_InitStruct.SPI_CPHA = SPI_CPHA_1Edge;
        SPI_InitStruct.SPI_NSS = SPI_NSS_Soft;
        SPI_InitStruct.SPI_FirstBit = SPI_FirstBit_MSB;
        SPI_InitStruct.SPI_CRCPolynomial = 7;
        SPI_Init(SPIx, &SPI_InitStruct);
        SPI_Cmd(SPIx, ENABLE);
}
/*发送一个字节*/
void SPI_Send_byte(SPI_TypeDef* SPIx,u8 data)
{
        while(SPI_I2S_GetFlagStatus(SPIx, SPI_I2S_FLAG_TXE)==RESET);
        SPI_I2S_SendData(SPIx,data);
        while(SPI_I2S_GetFlagStatus(SPIx, SPI_I2S_FLAG_RXNE)==RESET);
        SPI_I2S_ReceiveData(SPIx);
}
/*接受一个字节*/
u8 SPI_Receive_byte(SPI_TypeDef* SPIx,u8 data)
{
        while(SPI_I2S_GetFlagStatus(SPIx, SPI_I2S_FLAG_TXE)==RESET);
        SPI_I2S_SendData(SPIx,data);
        while(SPI_I2S_GetFlagStatus(SPIx, SPI_I2S_FLAG_RXNE)==RESET);
        return SPI_I2S_ReceiveData(SPIx);
}
void delay1us(u8 t)
{
        while(--t);
}
/****向寄存器reg写一个字节,同时返回状态字节**************/
u8 SPI_RW_Reg(u8 reg,u8 value)
{
        u8 status;
        CSN_L;
        status=SPI_Receive_byte(SPI2,reg);   //select register  and write value to it
        SPI_Send_byte(SPI2,value);   
        CSN_H;
        delay1us(100);
        return(status);
}
/****向寄存器reg读一个字节,同时返回状态字节**************/
u8 SPI_Read_Reg(u8 reg)
{
        u8 status;
        CSN_L;
        SPI_Send_byte(SPI2,reg);
        status=SPI_Receive_byte(SPI2,0);   //select register  and write value to it
        CSN_H;
                delay1us(100);
        return(status);
}
/********读出bytes字节的数据*************************/
u8 SPI_Read_Buf(u8 reg,u8 *pBuf,u8 bytes)
{
        u8 status,byte_ctr;
        CSN_L;
        status=SPI_Receive_byte(SPI2,reg);      
        for(byte_ctr=0;byte_ctr<bytes;byte_ctr++)
                pBuf[byte_ctr]=SPI_Receive_byte(SPI2,0);
        CSN_H;
        return(status);
}
/****************写入bytes字节的数据*******************/
u8 SPI_Write_Buf(u8 reg,u8 *pBuf,u8 bytes)
{
        u8 status,byte_ctr;
        CSN_L;
        status=SPI_Receive_byte(SPI2,reg);
        delay1us(50);
        for(byte_ctr=0;byte_ctr<bytes;byte_ctr++)
                SPI_Send_byte(SPI2,*pBuf++);
        CSN_H;
        return(status);
}

/*接收函数,返回1表示有数据收到,否则没有数据接收到**/
u8 nRF24L01_RxPacket(u8* rx_buf)
{
    u8 status,revale=0;
        CE_L;
        delay1us(50);
        status=SPI_Receive_byte(SPI2,STATUS);        // 读取状态寄存其来判断数据接收状况

        if(status & RX_DR)                                // 判断是否接收到数据
        {
                SPI_Read_Buf(RD_RX_PLOAD,rx_buf,TX_PLOAD_WIDTH);// read receive payload from RX_FIFO buffer
                revale =1;                        //读取数据完成标志
        }
        SPI_RW_Reg(WRITE_REG_NRF24L01 + STATUS,status);   //接收到数据后RX_DR,TX_DS,MAX_PT都置高为1,通过写1来清楚中断标志
        CE_H;
        return revale;       
}
/****************发送函数***************************/
void nRF24L01_TxPacket(unsigned char * tx_buf)
{
        CE_L;                        //StandBy I模式       
        SPI_Write_Buf(WRITE_REG_NRF24L01 + RX_ADDR_P0, TX_ADDRESS, TX_ADR_WIDTH); // 装载接收端地址
        SPI_Write_Buf(WR_TX_PLOAD, tx_buf, TX_PLOAD_WIDTH);                          // 装载数据       
        SPI_RW_Reg(WRITE_REG_NRF24L01 + CONFIG, 0x0e);                    // IRQ收发完成中断响应,16位CRC,主发送
        CE_H;                 //置高CE,激发数据发送
        delay1us(50);
}
void RX_Mode(void)
{
        CE_L;
       
          SPI_Write_Buf(WRITE_REG_NRF24L01 + RX_ADDR_P0, TX_ADDRESS, TX_ADR_WIDTH);  // 接收设备接收通道0使用和发送设备相同的发送地址
          SPI_RW_Reg(WRITE_REG_NRF24L01 + RX_PW_P0, TX_PLOAD_WIDTH);  // 接收通道0选择和发送通道相同有效数据宽度
          SPI_RW_Reg(WRITE_REG_NRF24L01 + EN_AA, 0x00);               // 使能接收通道0自动应答
          SPI_RW_Reg(WRITE_REG_NRF24L01 + EN_RXADDR, 0x01);           // 使能接收通道0
          SPI_RW_Reg(WRITE_REG_NRF24L01 + RF_CH, 40);                 // 选择射频通道0x40
          SPI_RW_Reg(WRITE_REG_NRF24L01 + CONFIG, 0x0f);              // CRC使能,16位CRC校验,上电,接收模式
          CE_H;
        delay1us(200);
}

void TX_Mode(u8 * tx_buf)
{
        CE_L;
          SPI_Write_Buf(WRITE_REG_NRF24L01 + TX_ADDR, TX_ADDRESS, TX_ADR_WIDTH);     // 写入发送地址
          SPI_Write_Buf(WRITE_REG_NRF24L01 + RX_ADDR_P0, TX_ADDRESS, TX_ADR_WIDTH);  // 为了应答接收设备,接收通道0地址和发送地址相同
          SPI_Write_Buf(WR_TX_PLOAD, tx_buf, TX_PLOAD_WIDTH);                          // 装载数据
          SPI_RW_Reg(WRITE_REG_NRF24L01 + EN_AA, 0x3f);       // 使能接收通道0自动应答
          SPI_RW_Reg(WRITE_REG_NRF24L01 + EN_RXADDR, 0x3f);   // 使能接收通道0
          SPI_RW_Reg(WRITE_REG_NRF24L01 + SETUP_RETR, 0x0a);  // 自动重发延时等待250us+86us,自动重发10次
          SPI_RW_Reg(WRITE_REG_NRF24L01 + RF_CH, 40);         // 选择射频通道0x40
          SPI_RW_Reg(WRITE_REG_NRF24L01 + RF_SETUP, 0x07);    // 数据传输率1Mbps,发射功率0dBm,低噪声放大器增益
        SPI_RW_Reg(WRITE_REG_NRF24L01 + RX_PW_P0, TX_PLOAD_WIDTH);  // 接收通道0选择和发送通道相同有效数据宽度
          SPI_RW_Reg(WRITE_REG_NRF24L01 + CONFIG, 0x0e);      // CRC使能,16位CRC校验,上电
        CE_H;
        delay1us(50);
}

void nRF24L01_Initial(void)                   //片选 中断 模式选择 引脚初始化 spi配置初始化
{
        GPIO_InitTypeDef GPIO_InitStruct;
        RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOD,ENABLE);

        GPIO_InitStruct.GPIO_Pin = GPIO_Pin_14 | GPIO_Pin_0|GPIO_Pin_3;
        GPIO_InitStruct.GPIO_OType = GPIO_OType_PP;//对结构体的GPIO_OType对象赋值,声明IO口的结构是推挽输出
        GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz;
        GPIO_Init(GPIOD, &GPIO_InitStruct);       
        GPIO_InitStruct.GPIO_Pin = GPIO_Pin_0;
        GPIO_InitStruct.GPIO_Mode = GPIO_Mode_IN;
           GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz;
        GPIO_Init(GPIOD, &GPIO_InitStruct);       
        Initial_SPI(SPI2);
}
/****************** 配置函数********************************/
void nRF24L01_Config(void)
{     
        SPI_RW_Reg(WRITE_REG_NRF24L01 + CONFIG, 0x0e); // Set PWR_UP bit, enable CRC(2 bytes) &Prim:RX. RX_DR enabled..
        SPI_RW_Reg(WRITE_REG_NRF24L01 + EN_AA, 0x3f);
        SPI_RW_Reg(WRITE_REG_NRF24L01 + EN_RXADDR, 0x3f); // Enable Pipe0
        SPI_RW_Reg(WRITE_REG_NRF24L01 + RF_CH, 40);
        SPI_RW_Reg(WRITE_REG_NRF24L01 + RF_SETUP,0x07); // TX_PWR:0dBm, Datarate:2Mbps,
}
void NRF24L01_Send(void)
{
    u8 status=0x00;
        TX_Mode(TX_BUF);
        while(IRQ);
        CE_L;
        delay1us(50);
        status=SPI_Read_Reg(STATUS);        // 读取状态寄存其来判断数据接收状况
        if(status&TX_DS)        /*tx_ds == 0x20*/
        {
                SPI_RW_Reg(WRITE_REG_NRF24L01 + STATUS, 0x20);      // 清除TX,让IRQ拉低;
                       
        }
        else if(status&MAX_RT)
                {
                        SPI_RW_Reg(WRITE_REG_NRF24L01 + STATUS, 0x10);      // 清除TX,让IRQ拉低;                       
                }
        CE_H;
//        status=20;
}
void NRF24L01_Receive(void)
{   
    u8 i,status=0x01;  
        Initial_SPI(SPI2);
        RX_Mode();
        while(IRQ);
        CE_L;
        delay1us(50);
        status=SPI_Read_Reg(STATUS);        // 读取状态寄存其来判断数据接收状况
        if(status & 0x40)                        //接受中断标志位
        {
                SPI_Read_Buf(RD_RX_PLOAD,RX_BUF,TX_PLOAD_WIDTH);// read receive payload from RX_FIFO buffer
                SPI_RW_Reg(WRITE_REG_NRF24L01 + STATUS, 0x40);      // 清除TX,让IRQ拉低
        }  
        CE_H;
}


有没有人啊  我看网上好多人遇到这个问题

都没有人回答啊。

两天了 要沉了

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top