微波EDA网,见证研发工程师的成长!
首页 > 研发问答 > 嵌入式设计讨论 > MCU和单片机设计讨论 > 关于stm32的nrf905的接收程序接收不到的问题

关于stm32的nrf905的接收程序接收不到的问题

时间:10-02 整理:3721RD 点击:
main.c
#include "stm32f10x.h"   
#include "SysTick.h"
#include "Delay.h"
#include "Usart.h"
#include "stdio.h"
#include "NRF905.h"
u8  RxBuf[32];
/*******由于没有做外设测试的程序是:串口采用的是PA9->(T<->T),PA9->(R<->R)*****/
int main(void)
{
        //初始化系统定时器
        SysTick_Init();
        USART1_Config();
        
        NRF905_Init();
        NRF905_Config();
        
        SetRxMode();
        Delay_ms(200);
        while(!(CD_read() & AM_read()))                //载波检测引脚置高/地址匹配引脚置高                                 
        {
                printf("Connect . . . . \n");
                Delay_ms(2000);
        }
        printf("OK, connect  !\n");
        RxPacket(RxBuf);
        while(1);
}
nrf905.c
#include "NRF905.h"
#include "Delay.h"
extern  u8  RxBuf[32];
typedef struct RFConfig
{
        u8 n;
        u8 buf[10];
}RFConfig;
/**************************************************************************************
* 名    称: 配置寄存器中的内容!
**************************************************************************************/
RFConfig RxTxConf ={10,
        0x4c,        //CH_NO[7:0] 连同字节 1 的 CH_NO[8]和 HFREQ_PLL 控制 905 的载波频段 433MHZ
        0x0c, //7,6:no use;5:自动重发=0;4:接收灵敏度降低=0;3,2:发射功率=10dBm;1:433MHz;CH_NO[8]=0
        0x44, //7:no use;6,5,4:发送地址宽度4;3:no use;2,1,0:接收地址宽度4
        0x20, //7,6 no use;5-0:接收数据宽度32
        0x20, //7,6 no use;5-0:发送数据宽度32
        0xcc, //接收地址字节0(设备ID)
        0xcc, //接收地址字节1(设备ID)
        0xcc, //接收地址字节2(设备ID)
        0xcc, //接收地址字节3(设备ID)
        0x58        //7:CRC模式8位;6:CRC校验许可;5,4,3:011表示16MHz;2:UP_CLK_EN=0没有外部时钟;1,0:外部时钟频率        
};
/**************************************************************************************
* 名    称: SetTxMode
* 功    能: 设置NRF905发送状态
* 参    数: 无
* 调用方式:SetTxMode();
* 返 回 值:无
**************************************************************************************/
void SetTxMode(void)                                
{        
        NRF905_TX_EN_H;
        NRF905_TRX_CE_L;
  Delay_us(650);
}               
/**************************************************************************************
* 名    称: SetRxMode
* 功    能: 设置NRF905发送状态
* 参    数: 无
* 调用方式:SetRxMode();
* 返 回 值:无
**************************************************************************************/
void SetRxMode(void)
{
        NRF905_TX_EN_L;
        NRF905_TRX_CE_H;
  Delay_us(650);                        
}
/**************************************************************************************
* 名    称: CD_read
* 功    能: 读取CD的值(载波检测)
* 参    数: 无
* 调用方式:CD_read();
* 返 回 值: CD的值
**************************************************************************************/
u8 CD_read(void)
{        
        u8 ReadValue;
        ReadValue = NRF905_CD_DATA;
        return ReadValue;
}
/**************************************************************************************
* 名    称: AM_read
* 功    能: 读取AM的值(地址匹配AM)
* 参    数: 无
* 调用方式:AM_read();
* 返 回 值: AM的值
**************************************************************************************/
u8 AM_read(void)
{        
        u8 ReadValue;
        ReadValue = NRF905_AM_DATA;
        return ReadValue;
}
/**************************************************************************************
* 名    称: DR_read
* 功    能: 读取CD的值(数据就绪DR)
* 参    数: 无
* 调用方式:DR_read();
* 返 回 值: DR的值
**************************************************************************************/
u8 DR_read(void)
{        
        u8 ReadValue;
        ReadValue = NRF905_DR_DATA;
        return ReadValue;
}
/**************************************************************************************
* 名    称: NRF905_SPI_Read_Bit
* 功    能: 读取MISO的值
* 参    数: 无
* 调用方式:NRF905_SPI_Read_Bit();
* 返 回 值: MISO的值,0或者1
**************************************************************************************/
static u8 NRF905_SPI_Read_Bit(void)
{        
        u8 ReadValue;
        ReadValue = NRF905_MISO_DATA;
        return ReadValue;
}
/**************************************************************************************
* 名    称: NRF905_SPI_Read_Byte
* 功    能: 读取MISO的值,字节的形式
* 参    数: 无
* 调用方式:NRF905_SPI_Read_Byte();
* 返 回 值: MISO的值
**************************************************************************************/
u8 NRF905_SPI_Read_Byte(void)
{ u8 i;
        u8 Temp_data;        
        for (i = 0;i < 8;i ++)                                        // Setup byte circulation bits
        {        
                Temp_data = Temp_data << 1;                // Right shift Temp_data
                NRF905_SCK_H;                                                                        // Set clock line high
                if (NRF905_SPI_Read_Bit())
                {
                        Temp_data |= 0x01;                                                // Read data
                }                                                
                NRF905_SCK_L;                                                                        // Set clock line low
        }
        return Temp_data;                                                                // Return function parameter        
}
/**************************************************************************************
* 名    称: NRF905_SPI_Write_Byte
* 功    能: NRF905写1字节函数
* 参    数: DATA: 需要写入的字节
* 调用方式:NRF905_SPI_Write_Byte(0xaa);
* 返 回 值:无
**************************************************************************************/
void NRF905_SPI_Write_Byte(u8 DATA)
{
        u8 i,Temp_data;
        Temp_data = DATA;
        for (i=0;i<8;i++)
        {
                if (Temp_data & 0x80)                                        //总是发送最高位
                {
                        NRF905_MOSI_H;
                }
                else
                {
                        NRF905_MOSI_L;
                }
                NRF905_SCK_H;
                Temp_data=Temp_data<<1;
                NRF905_SCK_L;
        }
}
/**************************************************************************************
* 名    称: TxPacket
* 功    能: 发送数据包
* 参    数: 需要发送的内容
* 调用方式:TxPacket();
* 返 回 值: MISO的值
**************************************************************************************/
void TxPacket(u8 *TxBuf)
{
        u8 i;                        
        NRF905_CSN_L;                                                                                                        // 使能SPI
        NRF905_SPI_Write_Byte(WTP);                                                // Write payload command
        for (i=0;i<32;i++)
        {
                NRF905_SPI_Write_Byte(TxBuf);                // Write 32 bytes Tx data
        }
        for(i = 0; i < 32;i ++)
        {
                printf("%x \r",TxBuf);
        }
        NRF905_CSN_H;                                                                                                        // Spi disable               
        Delay_us(1);                                
        NRF905_CSN_L;                                                                                                        // Spi enable for write a spi command        
        NRF905_SPI_Write_Byte(WTA);                                                // Write address command
        for (i=0;i<4;i++)                                                                                        // Write 4 bytes address
        {
                NRF905_SPI_Write_Byte(RxTxConf.buf[i+5]);
        }
        for(i = 0; i < 4;i ++)
        {
                printf("%x \r",RxTxConf.buf[i+5]);
        }
        NRF905_CSN_H;                                                                                                        // Spi disable
        NRF905_TRX_CE_H;                                                                                        // Set TRX_CE high,start Tx data transmission
  Delay_us(1);
//         while(!DR_read());                                                                  
        NRF905_TRX_CE_L;                                                                                        // Set TRX_CE low
}
/**************************************************************************************
* 名    称: TxPacket
* 功    能: 发送数据包
* 参    数: 需要发送的内容
* 调用方式:TxPacket();
* 返 回 值: MISO的值
**************************************************************************************/
void RxPacket(u8*RxBuf)
{
        u8 i;                        
        NRF905_CSN_L;                                                                                                          // 使能SPI
        NRF905_TRX_CE_L;                                                                                          // 待机模式        (模块接收到数据后要进入)
        Delay_ms(200);
        while(!DR_read())                                                                                          // 数据正确?
        {
                printf("Sorry,The module failed to Recieve DATA !\n");
        }
        printf("OK,The module Recieve DATA success!\n");
        
        NRF905_SPI_Write_Byte(RRP);                                                  // Ready Read payload command
        for (i=0;i<32;i++)
        {
                RxBuf = NRF905_SPI_Read_Byte();                // Read 32 bytes Tx data
        }
        for(i = 0; i < 32;i ++)
        {
                printf("%x \r",RxBuf);
        }
        while(DR_read() || AM_read())
        {
                printf("DATA Recieve NO finish !\n");
        }
        printf("DATA Recieve finish !\n");
        NRF905_CSN_H;                                                                                                          // Spi disable               
        Delay_us(1);                                
}
/**************************************************************************************
* 名    称: NRF905_GPIO_Configuration
* 功    能: 初始化NRF905的管脚
* 参    数: cmd: 彩屏模块命令字
* 调用方式:NRF905_GPIO_Configuration();内部调用
* 返 回 值:无
**************************************************************************************/
static void NRF905_GPIO_Configuration(void)
{
        GPIO_InitTypeDef GPIO_InitStructure;
        RCC_APB2PeriphClockCmd(NRF905_RCC_APB2Periph_GPIO,ENABLE);
        GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0|GPIO_Pin_3 |GPIO_Pin_4|GPIO_Pin_5|GPIO_Pin_8 |GPIO_Pin_9;
        GPIO_InitStructure.GPIO_Speed = GPIO_Speed_10MHz;
        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
        GPIO_Init(NRF905_GPIO_CONTROL, &GPIO_InitStructure);
        
        GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1|GPIO_Pin_2|GPIO_Pin_6|GPIO_Pin_7;
        GPIO_InitStructure.GPIO_Speed = GPIO_Speed_10MHz;
        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
        GPIO_Init(NRF905_GPIO_CONTROL, &GPIO_InitStructure);
}
/**************************************************************************************
* 名    称: NRF905_Init
* 功    能: 初始化NRF905
* 参    数: DATA: 需要写入的字节
* 调用方式:NRF905_Init();
* 返 回 值:无
**************************************************************************************/
void NRF905_Init(void)
{
        NRF905_GPIO_Configuration();
        NRF905_AM_DATA_L;                //先拉低
        NRF905_DR_DATA_L;                //先拉低
        NRF905_CSN_H;                                //关掉SPI
        NRF905_SCK_L;                                //初始化时钟低
        NRF905_PWR_UP_H;                //power低
        NRF905_TRX_CE_L;                // Set nRF905 in standby mode
}
/**************************************************************************************
* 名    称: NRF905_Init
* 功    能: 配置NRF905寄存器
* 参    数: 无
* 调用方式:NRF905_Init();
* 返 回 值:无
**************************************************************************************/
void NRF905_Config(void)
{
        u8 i;
        NRF905_CSN_L;                                                                                                        // Spi enable for write a spi command
        NRF905_SPI_Write_Byte(WC);                                                // Write config command写放配置命令
        for (i = 0;i < RxTxConf.n; i++)                                                // Write configration words  写放配置字
        {
           NRF905_SPI_Write_Byte(RxTxConf.buf);
        }
        for(i = 0; i < 10; i ++)
        {
                printf(" %x \r",RxTxConf.buf);
        }
        NRF905_CSN_H;                                                                                                        // Disable Spi
}

for (i = 0;i < RxTxConf.n; i++)                                                       {
            NRF905_SPI_Write_Byte(RxTxConf.buf);
RxTxConf.n 是不是错了?

这个是地址,没有错,我对正过了

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

网站地图

Top