oscar10 发表于 2011-7-23 11:15:42

上传一个STM32编写的NRF905的接收模块的程序,大家帮忙看看问题出在哪里?

下面是我将51的程序改到STM32内的程序,就是收不到,大家帮忙看看能不能解决啊??????

这是51原来的收发一体的程序:
#include <reg52.h>
#include <ABSACC.h>
#include <intrins.h>
#include <stdio.h>
//----------------------------------------------------------------------------------------------------------------
#define uint unsigned int
#define uchar unsigned char
//----------------------------------------------------------------------------------------------------------------
#define BYTE_BIT0        0x01
#define BYTE_BIT1        0x02
#define BYTE_BIT2        0x04
#define BYTE_BIT3        0x08
#define BYTE_BIT4        0x10
#define BYTE_BIT5        0x20
#define BYTE_BIT6        0x40
#define BYTE_BIT7        0x80
//----------------------------------------------------------------------------------------------------------------
bdata unsignedchar DATA_BUF;
#define DATA7        ((DATA_BUF&BYTE_BIT7) != 0)
#define DATA0   ((DATA_BUF&BYTE_BIT0) != 0)
sbit        flag        =DATA_BUF^7;
sbit        flag1        =DATA_BUF^0;
//---------------------------------------------------发送数据缓冲区-------------------------------------------------
#define TxRxBuf_Len 4
unsigned char TxRxBuf=
{
0x29,0x30,0x31,0x32,
};
//---------------------------------------------------配置口定义---------------------------------------------------
//配置口定义//
sbit        TXEN=P2^1;
sbit        PWR=P2^2;
sbit        CD=P2^3;
sbit        DR=P2^4;
sbit        MOSI=P2^5;
sbit        CSN=P2^6;
sbit        TRX_CE=P3^3;
sbit        AM=P3^5;
sbit        MISO=P3^6;
sbit        SCK=P3^7;
//----------------------------------------------------按键--------------------------------------------------

sbit    KEY0    =P3^2;
sbit    KEY1    =P3^1;
//----------------------------------------------------数码管位控制-------------------------------------------------------
sbit    led0    =P1^7;
sbit    led1    =P1^6;
//-----------------------------------------------------------------------------------------------------------------
uchar seg={0xC0,0xCF,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90};         //0~~9段码
//-------------------------------------------------------nrf905控制指令-------------------------------------------
#define WC                0x00
#define RC                0x10
#define WTP                0x20
#define RTP                0x21
#define WTA                0x22
#define RTA                0x23
#define RRP                0x24
//------------------------------------------------NRF905寄存器配置------------------------------------------------
unsigned char idata RFConf=
{
0x00,                           //配置命令//
0x4c,                           //CH_NO,配置频段在430MHZ
0x0c,                           //输出功率为10db,不重发,节电为正常模式
0x44,                           //地址宽度设置,为4字节
0x04,0x04,                        //接收发送有效数据长度为32字节
0xCC,0xCC,0xCC,0xCC,            //接收地址
0x58,                              //CRC充许,8位CRC校验,外部时钟信号不使能,16M晶振
};
code TxAddress={0xcc,0xcc,0xcc,0xcc};
char tf;
//------------------------------------------------延时------------------------------------------------------------
static void Delay(uchar n)
{
        uint i;
        while(n--)
        for(i=0;i<80;i++);
}
//---------------------------------------------------SPI读函数-----------------------------------------------------
unsigned char SpiRead(void)
{
        unsigned char j;
        for (j=0;j<8;j++)
        {
      DATA_BUF=DATA_BUF<<1;
                SCK=1;
                if (MISO)        //读取最高位,保存至最末尾,通过左移位完成整个字节
                {
                        DATA_BUF|=BYTE_BIT0;
                }
                else
                {
                        DATA_BUF&=~BYTE_BIT0;
                }
                SCK=0;
       }
       return DATA_BUF;
}
//-------------------------------------------------SPI写函数----------------------------------------------------------
void SpiWrite(unsigned char send)
{
        unsigned char i;
        DATA_BUF=send;
        for (i=0;i<8;i++)
        {
                if (DATA7)        //总是发送最高位
                {
                        MOSI=1;
                }
                else
                {
                        MOSI=0;
                }
                SCK=1;
                DATA_BUF=DATA_BUF<<1;
                SCK=0;
        }
}
//------------------------------------------------------初始化nRF905---------------------------------------------
void nRF905Init(void)
{
    CSN=1;                                                // Spi         disable
        SCK=0;                                                // Spi clock line init low
        DR=0;                                                // Init DR for input
        AM=0;                                                // Init AM for input
        CD=0;                                                // Init CD for input
        PWR=1;                                        // nRF905 power on
        TRX_CE=0;                                        // Set nRF905 in standby mode
        TXEN=0;                                        // set radio in Rx mode
}
//-----------------------------------------------------初始化寄存器-----------------------------------------------
void Config905(void)
{
        uchar i;
        CSN=0;                                                // Spi enable for write a spi command
        //SpiWrite(WC);                                // Write config command写放配置命令
        for (i=0;i<11;i++)        // Write configration words写放配置字
        {
           SpiWrite(RFConf);
        }
        CSN=1;                                        // Disable Spi
}
//-----------------------------------------------------发送数据打包---------------------------------------------------
void TxPacket(uchar *TxRxBuf)
{
        uchar i;
        //Config905();
        CSN=0;
        SpiWrite(WTP);                                // Write payload command
        for (i=0;i<4;i++)
        {
                SpiWrite(TxRxBuf);                // Write 32 bytes Tx data
        }// Spi enable for write a spi command
        CSN=1;
        Delay(1);                                                // Spi disable
        CSN=0;                                                // Spi enable for write a spi command
        SpiWrite(WTA);                                // Write address command
        for (i=0;i<4;i++)                        // Write 4 bytes address
        {
                SpiWrite(TxAddress);
        }
        CSN=1;                                                // Spi disable
        TRX_CE=1;                                        // Set TRX_CE high,start Tx data transmission
        Delay(1);                                        // while (DR!=1);
        TRX_CE=0;                                        // Set TRX_CE low
}
//----------------------------------------------------------设置发送状态---------------------------------------------
void SetTxMode(void)
{
        TRX_CE=0;
        TXEN=1;
        Delay(1);                                         // delay for mode change(>=650us)
}
//-----------------------------------------------设置发送状态---------------------------------------------------
void SetRxMode(void)
{
        TXEN=0;
        TRX_CE=1;
        Delay(1);                                         // delay for mode change(>=650us)
}
//-------------------------------------------------判断数据接收状态-----------------------------------------------------
unsigned char CheckDR(void)                //检查是否有新数据传入 Data Ready
{
        if (DR=1&&TRX_CE==1 && TXEN==0)
        {
       // Delay(50);
                return 1;
        }
        else
        {
                return 0;
        }
}
//----------------------------------------------------读NRF905接收数据------------------------------------------------------------
void RxPacket(void)                                               
{
        uchar i;
    Delay(1);
//        TRX_CE=0;                                        // Set nRF905 in standby mode
    Delay(100);
    TRX_CE=0;
        CSN=0;                                                // Spi enable for write a spi command
    Delay(1);
        SpiWrite(RRP);
        for (i = 0 ;i < 4 ;i++)
        {
                TxRxBuf=SpiRead();                // Read data and save to buffer      
        }
        CSN=1;
    Delay(10);
        TRX_CE=1;                                                       
}
//--------------------------------------------------------数据接收------------------------------------------------
voidRX(void)
{
          SetRxMode();                        // Set nRF905 in Rx mode
          while (CheckDR()==0);
                  Delay(10);
                    RxPacket();
                  if(TxRxBuf==0x29)
                  {
                                P1=0x0f;
                       
                  }
                  if(TxRxBuf==0x29)
                  {
                       
                                P1=0xf0;
                       
                  }
}
void delay_10ms(void)   //误差 -0.000000000002us
{
    unsigned char a,b;
    for(b=249;b>0;b--)
      for(a=17;a>0;a--);
}
//-----------------------------------------------------------------------------------------------------------------
void main(void)
{
      nRF905Init();
           Config905();
                led0=0;
                led1=0;
               
      while(1)
                {
                        RX();
                        if(KEY0 ==0)
                        {
                                delay_10ms();
                          if(KEY0 ==0 )
                                {       
                                        tf = 1 ;
                                        TxRxBuf=0x29;
                                        TxRxBuf=0x30;
                                        P1=0x0f;
                                        while(!KEY0);
                                        delay_10ms();
                                        while(!KEY0);
                                }
                        }
                        if(KEY1 ==0)
                        {
                                delay_10ms();
                          if(KEY1 ==0 )
                                {       
                                        tf = 1 ;
                                        TxRxBuf=0x30;
                                        TxRxBuf=0x29;
                                        P1=0xf0;
                                        while(!KEY1);
                                        delay_10ms();
                                        while(!KEY1);
                               }
                        }
             if (tf==1)
                        {
                SetTxMode();// Set nRF905 in Tx mode
                          TxPacket(TxRxBuf);// Send data by nRF905
                                tf = 0;       
                                Delay(100);
                        }
                Delay(100);
                P1=0xff;
                Delay(100);
        }
}


这是通过上面的程序改成STM32中的程序:
#include "stm32f10x_it.h"
#include "nrf905.h"
#include "ABSACC.h"
void Delay_ms(u16 Nms);
void Delay_us(u32 Nus);
#define uint unsigned int
#define uchar unsigned char
//----------------------------------------------------------------------------------------------------------------
#define BYTE_BIT0        0x01
#define BYTE_BIT1        0x02
#define BYTE_BIT2        0x04
#define BYTE_BIT3        0x08
#define BYTE_BIT4        0x10
#define BYTE_BIT5        0x20
#define BYTE_BIT6        0x40
#define BYTE_BIT7        0x80
//----------------------------------------------------------------------------------------------------------------
u8 DATA_BUF;
#define DATA7        ((DATA_BUF&BYTE_BIT7) != 0)
#define DATA0   ((DATA_BUF&BYTE_BIT0) != 0)
#define flag        (DATA_BUF & 0X80)
#define flag1        (DATA_BUF & 0X01)
#define TxRxBuf_Len 4
unsigned char TxRxBuf=
{
0x29,0x30,0x31,0x32,
};
#define WC                0x00
#define RC                0x10
#define WTP                0x20
#define RTP                0x21
#define WTA                0x22
#define RTA                0x23
#define RRP                0x24
//------------------------------------------------NRF905寄存器配置------------------------------------------------
unsigned charRFConf=
{
0x00,                           //配置命令//
0x4c,                           //CH_NO,配置频段在430MHZ
0x0c,                           //输出功率为10db,不重发,节电为正常模式
0x44,                           //地址宽度设置,为4字节
0x04,0x04,                        //接收发送有效数据长度为32字节
0xCC,0xCC,0xCC,0xCC,            //接收地址
0x58,                              //CRC充许,8位CRC校验,外部时钟信号不使能,16M晶振
};
unsigned char TxAddress={0xcc,0xcc,0xcc,0xcc};
char tf;
void GPIO_Configuration(void)
{
        GPIO_InitTypeDef GPIO_InitStructure;
        GPIO_InitStructure.GPIO_Pin = GPIO_Pin_All;
        GPIO_InitStructure.GPIO_Speed = GPIO_Speed_10MHz;
        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
        GPIO_Init(GPIOA, &GPIO_InitStructure);

        GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0|GPIO_Pin_1|GPIO_Pin_3;
        GPIO_InitStructure.GPIO_Speed = GPIO_Speed_10MHz;
        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
        GPIO_Init(GPIOB, &GPIO_InitStructure);


        GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2;
        GPIO_InitStructure.GPIO_Speed = GPIO_Speed_10MHz;
        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPD;
        GPIO_Init(GPIOB, &GPIO_InitStructure);
}
//------------------------------------------------延时------------------------------------------------------------
/*static void Delay(uchar n)
{
        uint i;
        while(n--)
        for(i=0;i<80;i++);
}*/
//---------------------------------------------------SPI读函数-----------------------------------------------------
unsigned char SpiRead(void)
{
        unsigned char j;
        for (j=0;j<8;j++)
        {
      DATA_BUF=DATA_BUF<<1;
                GPIO_WriteBit(GPIOB, GPIO_Pin_3, Bit_SET);
                if (GPIO_ReadInputDataBit(GPIOB, GPIO_Pin_2))        //读取最高位,保存至最末尾,通过左移位完成整个字节
                {
                        DATA_BUF|=BYTE_BIT0;
                }
                else
                {
                        DATA_BUF&=~BYTE_BIT0;
                }
                GPIO_WriteBit(GPIOB, GPIO_Pin_3, Bit_RESET);
       }
       return DATA_BUF;
}
//-------------------------------------------------SPI写函数----------------------------------------------------------
void SpiWrite(unsigned char send)
{
        unsigned char i;
        DATA_BUF=send;
        for (i=0;i<8;i++)
        {
                if (DATA7)        //总是发送最高位
                {
                        GPIO_WriteBit(GPIOA, GPIO_Pin_4, Bit_SET);
                }
                else
                {
                        GPIO_WriteBit(GPIOA, GPIO_Pin_4, Bit_RESET);
                }
                GPIO_WriteBit(GPIOB, GPIO_Pin_3, Bit_SET);
                DATA_BUF=DATA_BUF<<1;
                GPIO_WriteBit(GPIOB, GPIO_Pin_3, Bit_RESET);
        }
}
//------------------------------------------------------初始化nRF905---------------------------------------------
void nRF905Init(void)
{
    GPIO_WriteBit(GPIOA, GPIO_Pin_5, Bit_SET);                                                // Spi         disable
        GPIO_WriteBit(GPIOB, GPIO_Pin_3, Bit_RESET);                                                // Spi clock line init low
        GPIO_WriteBit(GPIOA, GPIO_Pin_3, Bit_RESET);                                                // Init DR for input
        GPIO_WriteBit(GPIOB, GPIO_Pin_1, Bit_RESET);                                                // Init AM for input
        GPIO_WriteBit(GPIOA, GPIO_Pin_2, Bit_RESET);                                                // Init CD for input
        GPIO_WriteBit(GPIOA, GPIO_Pin_1, Bit_SET);                                        // nRF905 power on
        GPIO_WriteBit(GPIOB, GPIO_Pin_0, Bit_RESET);                                        // Set nRF905 in standby mode
        GPIO_WriteBit(GPIOA, GPIO_Pin_0, Bit_RESET);                                        // set radio in Rx mode
}
//-----------------------------------------------------初始化寄存器-----------------------------------------------
void Config905(void)
{
        uchar i;
        GPIO_WriteBit(GPIOA, GPIO_Pin_5, Bit_RESET);                                                // Spi enable for write a spi command
        //SpiWrite(WC);                                // Write config command写放配置命令
        for (i=0;i<11;i++)        // Write configration words写放配置字
        {
           SpiWrite(RFConf);
        }
        GPIO_WriteBit(GPIOA, GPIO_Pin_5, Bit_SET);                                        // Disable Spi
}
//-----------------------------------------------------发送数据打包---------------------------------------------------
void TxPacket(uchar *TxRxBuf)
{
        uchar i;
        //Config905();
        GPIO_WriteBit(GPIOA, GPIO_Pin_5, Bit_RESET);
        SpiWrite(WTP);                                // Write payload command
        for (i=0;i<4;i++)
        {
                SpiWrite(TxRxBuf);                // Write 32 bytes Tx data
        }// Spi enable for write a spi command
        GPIO_WriteBit(GPIOA, GPIO_Pin_5, Bit_SET);
        Delay_us(1);                                                // Spi disable
        GPIO_WriteBit(GPIOA, GPIO_Pin_5, Bit_RESET);                                                // Spi enable for write a spi command
        SpiWrite(WTA);                                // Write address command
        for (i=0;i<4;i++)                        // Write 4 bytes address
        {
                SpiWrite(TxAddress);
        }
        GPIO_WriteBit(GPIOA, GPIO_Pin_5, Bit_SET);                                                // Spi disable
        GPIO_WriteBit(GPIOB, GPIO_Pin_0, Bit_SET);                                        // Set TRX_CE high,start Tx data transmission
        Delay_us(1);                                        // while (DR!=1);
        GPIO_WriteBit(GPIOB, GPIO_Pin_0, Bit_RESET);                                                // Set TRX_CE low
}
//----------------------------------------------------------设置发送状态---------------------------------------------
void SetTxMode(void)
{
        GPIO_WriteBit(GPIOB, GPIO_Pin_0, Bit_RESET);
        GPIO_WriteBit(GPIOA, GPIO_Pin_0, Bit_SET);
        Delay_us(1);                                         // delay for mode change(>=650us)
}
//-----------------------------------------------设置发送状态---------------------------------------------------
void SetRxMode(void)
{
        GPIO_WriteBit(GPIOA, GPIO_Pin_0, Bit_RESET);
        GPIO_WriteBit(GPIOB, GPIO_Pin_0, Bit_SET);
        Delay_us(1);                                         // delay for mode change(>=650us)
}
//-------------------------------------------------判断数据接收状态-----------------------------------------------------
unsigned char CheckDR(void)                //检查是否有新数据传入 Data Ready
{
        GPIO_InitTypeDef GPIO_InitStructure;
        GPIO_InitStructure.GPIO_Pin = GPIO_Pin_3 |GPIO_Pin_0;
        GPIO_InitStructure.GPIO_Speed = GPIO_Speed_10MHz;
        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPD ;
        GPIO_Init(GPIOA, &GPIO_InitStructure);

        GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0;
        GPIO_InitStructure.GPIO_Speed = GPIO_Speed_10MHz;
        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPD ;
        GPIO_Init(GPIOB, &GPIO_InitStructure);

        if (GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_3)&&GPIO_ReadInputDataBit(GPIOB, GPIO_Pin_0) && (!GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_0)))
        {
       // Delay(50);
                return 1;
        }
        else
        {
                return 0;
        }
}
//----------------------------------------------------读NRF905接收数据------------------------------------------------------------
void RxPacket(void)                                               
{
        uchar i;
    Delay_us(1);
//        TRX_CE=0;                                        // Set nRF905 in standby mode
    Delay_us(3);
    GPIO_WriteBit(GPIOB, GPIO_Pin_0, Bit_RESET);
        GPIO_WriteBit(GPIOA, GPIO_Pin_5, Bit_RESET);                                                // Spi enable for write a spi command
    Delay_us(1);
        SpiWrite(RRP);
        for (i = 0 ;i < 4 ;i++)
        {
                TxRxBuf=SpiRead();                // Read data and save to buffer      
        }
        GPIO_WriteBit(GPIOA, GPIO_Pin_5, Bit_SET);
           Delay_us(2);
        GPIO_WriteBit(GPIOB, GPIO_Pin_0, Bit_SET);                                                       
}

//--------------------------------------------------------数据接收------------------------------------------------
voidRX(void)
{
          SetRxMode();                        // Set nRF905 in Rx mode
                  while (CheckDR()==0);
                  Delay_us(2);
                    RxPacket();
                  if(TxRxBuf==0x30)
                  {
                               GPIO_WriteBit(GPIOA, GPIO_Pin_8, (BitAction)((1-GPIO_ReadOutputDataBit(GPIOA, GPIO_Pin_8))));
                  }
}

oscar10 发表于 2011-7-24 20:02:46

回复【楼主位】oscar10
-----------------------------------------------------------------------

大家都没有做好吗?我今天调了下,终于弄好了,就是延时和IO口操作的问题,现在我将STM32控制的NRF收发程序发在上面大家有兴趣的看看啦!呵呵

oscar10 发表于 2011-7-24 20:03:42

回复【1楼】oscar10
-----------------------------------------------------------------------

这个是发的程序:
#include "stm32f10x_it.h"
#include "nrf905.h"
GPIO_InitTypeDef GPIO_InitStructure;
void Delay_ms(u16 Nms);
void Delay_us(u32 Nus);
#define uint unsigned int
#define uchar unsigned char
//----------------------------------------------------------------------------------------------------------------
#define BYTE_BIT0        0x01
#define BYTE_BIT1        0x02
#define BYTE_BIT2        0x04
#define BYTE_BIT3        0x08
#define BYTE_BIT4        0x10
#define BYTE_BIT5        0x20
#define BYTE_BIT6        0x40
#define BYTE_BIT7        0x80
//----------------------------------------------------------------------------------------------------------------
unsigned char DATA_BUF;
#define DATA7        ((DATA_BUF&BYTE_BIT7) != 0)
#define DATA0   ((DATA_BUF&BYTE_BIT0) != 0)
#define TxRxBuf_Len 4
unsigned char TxRxBuf=
{
0x29,0x30,0x31,0x32,
};
#define WC                0x00
#define RC                0x10
#define WTP                0x20
#define RTP                0x21
#define WTA                0x22
#define RTA                0x23
#define RRP                0x24
//------------------------------------------------NRF905寄存器配置------------------------------------------------
unsigned charRFConf=
{
0x00,                           //配置命令//
0x4c,                           //CH_NO,配置频段在430MHZ
0x0c,                           //输出功率为10db,不重发,节电为正常模式
0x44,                           //地址宽度设置,为4字节
0x04,0x04,                        //接收发送有效数据长度为32字节
0xCC,0xCC,0xCC,0xCC,            //接收地址
0x58,                              //CRC充许,8位CRC校验,外部时钟信号不使能,16M晶振
};
unsigned charTxAddress={0xCC,0xCC,0xCC,0xCC};
char tf;
void GPIO_Configuration(void)
{
        GPIO_InitStructure.GPIO_Pin = GPIO_Pin_All;
        GPIO_InitStructure.GPIO_Speed = GPIO_Speed_10MHz;
        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
        GPIO_Init(GPIOA, &GPIO_InitStructure);


        GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0|GPIO_Pin_5 |GPIO_Pin_1;
        GPIO_InitStructure.GPIO_Speed = GPIO_Speed_10MHz;
        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
        GPIO_Init(GPIOB, &GPIO_InitStructure);

        GPIO_InitStructure.GPIO_Pin = GPIO_Pin_13;
        GPIO_InitStructure.GPIO_Speed = GPIO_Speed_10MHz;
        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;
        GPIO_Init(GPIOC, &GPIO_InitStructure);


        GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2;
        GPIO_InitStructure.GPIO_Speed = GPIO_Speed_10MHz;
        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
        GPIO_Init(GPIOB, &GPIO_InitStructure);
}
//------------------------------------------------延时------------------------------------------------------------
static void Delay(uchar n)
{
        while(n--);
}
//---------------------------------------------------SPI读函数-----------------------------------------------------
unsigned char SpiRead(void)
{
        unsigned char j;
        for (j=0;j<8;j++)
        {
      DATA_BUF=DATA_BUF<<1;
                GPIO_WriteBit(GPIOB, GPIO_Pin_5, Bit_SET);
                if (GPIO_ReadInputDataBit(GPIOB, GPIO_Pin_2))        //读取最高位,保存至最末尾,通过左移位完成整个字节
                {
                        DATA_BUF|=BYTE_BIT0;
                }
                else
                {
                        DATA_BUF&=~BYTE_BIT0;
                }
                GPIO_WriteBit(GPIOB, GPIO_Pin_5, Bit_RESET);
       }
       return DATA_BUF;
}
//-------------------------------------------------SPI写函数----------------------------------------------------------
void SpiWrite(unsigned char send)
{
        unsigned char i;
        DATA_BUF=send;
        for (i=0;i<8;i++)
        {
                if (DATA7)        //总是发送最高位
                {
                        GPIO_WriteBit(GPIOA, GPIO_Pin_4, Bit_SET);
                }
                else
                {
                        GPIO_WriteBit(GPIOA, GPIO_Pin_4, Bit_RESET);
                }
                GPIO_WriteBit(GPIOB, GPIO_Pin_5, Bit_SET);
                DATA_BUF=DATA_BUF<<1;
                GPIO_WriteBit(GPIOB, GPIO_Pin_5, Bit_RESET);
        }
}
//------------------------------------------------------初始化nRF905---------------------------------------------
void nRF905Init(void)
{
        GPIO_WriteBit(GPIOA, GPIO_Pin_5, Bit_SET);                                                // Spi         disable
        GPIO_WriteBit(GPIOB, GPIO_Pin_5, Bit_RESET);                                                // Spi clock line init low
        GPIO_WriteBit(GPIOA, GPIO_Pin_3, Bit_RESET);                                                // Init DR for input
        GPIO_WriteBit(GPIOB, GPIO_Pin_1, Bit_RESET);                                                // Init AM for input
        GPIO_WriteBit(GPIOA, GPIO_Pin_2, Bit_RESET);                                                // Init CD for input
        GPIO_WriteBit(GPIOA, GPIO_Pin_1, Bit_SET);                                        // nRF905 power on
        GPIO_WriteBit(GPIOB, GPIO_Pin_0, Bit_RESET);                                        // Set nRF905 in standby mode
        GPIO_WriteBit(GPIOA, GPIO_Pin_0, Bit_RESET);                                        // set radio in Rx mode

        GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2 |GPIO_Pin_3;
        GPIO_InitStructure.GPIO_Speed = GPIO_Speed_10MHz;
        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
        GPIO_Init(GPIOA, &GPIO_InitStructure);

        GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1;
        GPIO_InitStructure.GPIO_Speed = GPIO_Speed_10MHz;
        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
        GPIO_Init(GPIOB, &GPIO_InitStructure);
}
//-----------------------------------------------------初始化寄存器-----------------------------------------------
void Config905(void)
{
        uchar i;
        GPIO_WriteBit(GPIOA, GPIO_Pin_5, Bit_RESET);                                                // Spi enable for write a spi command
        //SpiWrite(WC);                                // Write config command写放配置命令
        for (i=0;i<11;i++)        // Write configration words写放配置字
        {
           SpiWrite(RFConf);
        }

oscar10 发表于 2011-7-24 20:04:25

回复【2楼】oscar10
-----------------------------------------------------------------------

这个是收的程序:
#include "stm32f10x_it.h"
#include "nrf905.h"
GPIO_InitTypeDef GPIO_InitStructure;
void Delay_ms(u16 Nms);
void Delay_us(u32 Nus);
#define uint unsigned int
#define uchar unsigned char
//----------------------------------------------------------------------------------------------------------------
#define BYTE_BIT0        0x01
#define BYTE_BIT1        0x02
#define BYTE_BIT2        0x04
#define BYTE_BIT3        0x08
#define BYTE_BIT4        0x10
#define BYTE_BIT5        0x20
#define BYTE_BIT6        0x40
#define BYTE_BIT7        0x80
//----------------------------------------------------------------------------------------------------------------
unsignedchar DATA_BUF;
#define DATA7        ((DATA_BUF&BYTE_BIT7) != 0)
#define DATA0   ((DATA_BUF&BYTE_BIT0) != 0)
#define TxRxBuf_Len 4
unsignedchar TxRxBuf=
{
0x29,0x30,0x31,0x32,
};
#define WC                0x00
#define RC                0x10
#define WTP                0x20
#define RTP                0x21
#define WTA                0x22
#define RTA                0x23
#define RRP                0x24
//------------------------------------------------NRF905寄存器配置------------------------------------------------
unsigned charRFConf=
{
0x00,                           //配置命令//
0x4c,                           //CH_NO,配置频段在430MHZ
0x0c,                           //输出功率为10db,不重发,节电为正常模式
0x44,                           //地址宽度设置,为4字节
0x04,0x04,                        //接收发送有效数据长度为32字节
0xCC,0xCC,0xCC,0xCC,            //接收地址
0x58,                              //CRC充许,8位CRC校验,外部时钟信号不使能,16M晶振
};
unsigned char TxAddress={0xCC,0xCC,0xCC,0xCC};
char tf;
void GPIO_Configuration(void)
{

        GPIO_InitStructure.GPIO_Pin = GPIO_Pin_All;
        GPIO_InitStructure.GPIO_Speed = GPIO_Speed_10MHz;
        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
        GPIO_Init(GPIOA, &GPIO_InitStructure);


        GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0|GPIO_Pin_5 |GPIO_Pin_1;
        GPIO_InitStructure.GPIO_Speed = GPIO_Speed_10MHz;
        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
        GPIO_Init(GPIOB, &GPIO_InitStructure);


        GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2;
        GPIO_InitStructure.GPIO_Speed = GPIO_Speed_10MHz;
        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
        GPIO_Init(GPIOB, &GPIO_InitStructure);
}
//------------------------------------------------延时------------------------------------------------------------
static void Delay(uchar n)
{
        while(n--);
}
//---------------------------------------------------SPI读函数-----------------------------------------------------
unsigned char SpiRead(void)
{
        unsigned char j;
        for (j=0;j<8;j++)
        {
      DATA_BUF=DATA_BUF<<1;
                GPIO_WriteBit(GPIOB, GPIO_Pin_5, Bit_SET);
                if (GPIO_ReadInputDataBit(GPIOB, GPIO_Pin_2))        //读取最高位,保存至最末尾,通过左移位完成整个字节
                {
                        DATA_BUF|=BYTE_BIT0;
                }
                else
                {
                        DATA_BUF&=~BYTE_BIT0;
                }
                GPIO_WriteBit(GPIOB, GPIO_Pin_5, Bit_RESET);
       }
       return DATA_BUF;
}
//-------------------------------------------------SPI写函数----------------------------------------------------------
void SpiWrite(unsigned char send)
{
        unsigned char i;
        DATA_BUF=send;
        for (i=0;i<8;i++)
        {
                if (DATA7)        //总是发送最高位
                {
                        GPIO_WriteBit(GPIOA, GPIO_Pin_4, Bit_SET);
                }
                else
                {
                        GPIO_WriteBit(GPIOA, GPIO_Pin_4, Bit_RESET);
                }
                GPIO_WriteBit(GPIOB, GPIO_Pin_5, Bit_SET);
                DATA_BUF=DATA_BUF<<1;
                GPIO_WriteBit(GPIOB, GPIO_Pin_5, Bit_RESET);
        }
}
//------------------------------------------------------初始化nRF905---------------------------------------------
void nRF905Init(void)
{
        GPIO_WriteBit(GPIOA, GPIO_Pin_5, Bit_SET);                                                // Spi         disable
        GPIO_WriteBit(GPIOB, GPIO_Pin_5, Bit_RESET);                                                // Spi clock line init low
        GPIO_WriteBit(GPIOA, GPIO_Pin_3, Bit_RESET);                                                // Init DR for input
        GPIO_WriteBit(GPIOB, GPIO_Pin_1, Bit_RESET);                                                // Init AM for input
        GPIO_WriteBit(GPIOA, GPIO_Pin_2, Bit_RESET);                                                // Init CD for input
        GPIO_WriteBit(GPIOA, GPIO_Pin_1, Bit_SET);                                        // nRF905 power on
        GPIO_WriteBit(GPIOB, GPIO_Pin_0, Bit_RESET);                                        // Set nRF905 in standby mode
        GPIO_WriteBit(GPIOA, GPIO_Pin_0, Bit_RESET);                                        // set radio in Rx mode

        GPIO_InitStructure.GPIO_Pin = GPIO_Pin_3|GPIO_Pin_2;
        GPIO_InitStructure.GPIO_Speed = GPIO_Speed_10MHz;
        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
        GPIO_Init(GPIOA, &GPIO_InitStructure);

        GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1;
        GPIO_InitStructure.GPIO_Speed = GPIO_Speed_10MHz;
        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
        GPIO_Init(GPIOB, &GPIO_InitStructure);
}
//-----------------------------------------------------初始化寄存器-----------------------------------------------
void Config905(void)
{
        uchar i;
        GPIO_WriteBit(GPIOA, GPIO_Pin_5, Bit_RESET);                                                // Spi enable for write a spi command
        //SpiWrite(WC);                                // Write config command写放配置命令
        for (i=0;i<11;i++)        // Write configration words写放配置字
        {
           SpiWrite(RFConf);
        }
        GPIO_WriteBit(GPIOA, GPIO_Pin_5, Bit_SET);                                        // Disable Spi
}
//-----------------------------------------------设置接收状态---------------------------------------------------
void SetRxMode(
页: [1]
查看完整版本: 上传一个STM32编写的NRF905的接收模块的程序,大家帮忙看看问题出在哪里?