OpenEdv-开源电子网

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

无线接收

[复制链接]

12

主题

25

帖子

0

精华

初级会员

Rank: 2

积分
93
金钱
93
注册时间
2013-12-30
在线时间
0 小时
发表于 2014-3-20 16:45:44 | 显示全部楼层 |阅读模式
  本人菜鸟,因为只买了一块战舰板,但是无线通信需要两块板,手头有一个stm32f103rc的最小系统板,所以拿战舰开发板作为发射设备,stm32f103rc作为接收设备,编写了stm32f103rc的程序,发射接收板现在都可以识别到无线模块,但是一按动战舰开发板的发射按钮,显示屏上就显示Send Failed,百思不得其解,请各位大神帮忙
main.c
#include "delay.h"
#include "sys.h"
#include "usart.h"
#include "usb_lib.h"
#include "hw_config.h"
#include "usb_pwr.h"
#include "24l01.h"  
#include "usb_istr.h"
#include "stm32f10x_flash.h"
u8  test,V_NUM;
u8  OUT_PACKET[64];
#define FLASH_PAGE_SIZE  (0x0800)  //页大小2k
#define FLASH_START_ADDRESS (0x08000000) //起始地址
#define STMFLASH_ReadHalfWord(addr) (*(vu16*)(addr))
#define PC13_H    GPIO_SetBits(GPIOC, GPIO_Pin_13) // PC13 高电平
#define PC13_L    GPIO_ResetBits(GPIOC, GPIO_Pin_13) // PC13低电平
#define PC3_H    GPIO_SetBits(GPIOC, GPIO_Pin_3)     // PC3 高电平
#define PC3_L    GPIO_ResetBits(GPIOC, GPIO_Pin_3) // PC3低电平
#define PC1_H    GPIO_SetBits(GPIOC, GPIO_Pin_1)     // PC3 高电平
#define PC1_L    GPIO_ResetBits(GPIOC, GPIO_Pin_1) // PC3低电平


void GPIO_Config(void)
{
GPIO_InitTypeDef GPIO_InitStructure;

// GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1|GPIO_Pin_6|GPIO_Pin_9|GPIO_Pin_12|GPIO_Pin_13|GPIO_Pin_14|GPIO_Pin_15 ;                        
// GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;                              
// GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;                            
// GPIO_Init(GPIOB, &GPIO_InitStructure); 
 
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1|GPIO_Pin_3|GPIO_Pin_13;                                
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;                              
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;                            
GPIO_Init(GPIOC, &GPIO_InitStructure);
}

/****************************************************************************
* 名    称:void RCC_Configuration(void)
* 功    能:系统时钟配置为72MHZ, 外设时钟配置
* 入口参数:无
* 出口参数:无
* 说    明:
* 调用方法:无 
****************************************************************************/ 
void RCC_Configuration(void)
{
  SystemInit(); 
  RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_GPIOB| RCC_APB2Periph_GPIOC
  | RCC_APB2Periph_GPIOD,ENABLE);
}

//设置USB 连接/断线
//enable:0,断开
//       1,允许连接   
void usb_port_set(u8 enable)
{  
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
if(enable)_SetCNTR(_GetCNTR()&(~(1<<1)));//退出断电模式
else
{  
_SetCNTR(_GetCNTR()|(1<<1));  // 断电模式
GPIOA->CRH &= 0XFFF00FFF;
GPIOA->CRH |= 0X00033000;
PAout(12)=0;      
}
}
void Sys_Soft_Reset(void)      //软件复位
{   
 SCB->AIRCR =0x05FA0000|(u32)0x04;     /* wait until reset */

void EP2_CMD(void)
{
 u16 i;
    u32 BACKUP_BOOTLOAD_HEAD_START_ADDRESS;


  //if ((OUT_PACKET[0]==0xAA)&&(OUT_PACKET[1]==0xF0)
//&&(OUT_PACKET[7]==(OUT_PACKET[1]+OUT_PACKET[2]+OUT_PACKET[3]+OUT_PACKET[4]+OUT_PACKET[5]+OUT_PACKET[6])))
  if ((OUT_PACKET[0]==0xAA)&&(OUT_PACKET[1]==0xF0))
  {
        //PCA0MD  &= 0xbf;     //看门狗关闭
     test = OUT_PACKET[2];

        if (OUT_PACKET[2]<0x06) {
       //if  (test==5) 
            {
                //ADJUST_ADC3 = OUT_PACKET[3];//10;
            }
        }
        /*else if ((OUT_PACKET[2]==0x06)&&(OUT_PACKET[3]==0x07)) //Sharp
        {
            EA=0;
            FLASH_PageErase (0x0000);
            FLASH_ByteWrite (0x0000,0x02);
            FLASH_ByteWrite (0x0001,0xf1);
            FLASH_ByteWrite (0x0002,0x11);
            
            FLASH_ByteWrite (0x0043,0x02);
            FLASH_ByteWrite (0x0044,0xef);
            FLASH_ByteWrite (0x0045,0xdf);
            
            for(i=0;i<1024;i++);
            RSTSRC = 0x10;
        }
        else if ((OUT_PACKET[2]==0x06)&&(OUT_PACKET[3]==0x07))
        {
            EA=0;
            FLASH_PageErase (0x0000);
            FLASH_ByteWrite (0x0000,0x02);
            FLASH_ByteWrite (0x0001,0xf2);
            FLASH_ByteWrite (0x0002,0x73);
            
            FLASH_ByteWrite (0x0043,0x02);
            FLASH_ByteWrite (0x0044,0xf1);
            FLASH_ByteWrite (0x0045,0x41);
            
            for(i=0;i<1024;i++);
            RSTSRC = 0x10;
        }*/
        else if ((OUT_PACKET[2]==0x06)&&(OUT_PACKET[3]==0x07))
        {
            __disable_irq();

          FLASH_Unlock();
         
          FLASH_ErasePage(FLASH_START_ADDRESS);
          
            BACKUP_BOOTLOAD_HEAD_START_ADDRESS = STMFLASH_ReadHalfWord(0x0803FFFC)+(STMFLASH_ReadHalfWord(0x0803FFFE)<<16);
          //写入Bootloader前2k代码
          for(i = 0; i < FLASH_PAGE_SIZE ; i += 2)
          {
            FLASH_ProgramHalfWord((FLASH_START_ADDRESS + i), STMFLASH_ReadHalfWord(BACKUP_BOOTLOAD_HEAD_START_ADDRESS + i));
          }
          FLASH_Lock();

            for(i=0;i<1024;i++);
            //__enable_irq();
            Sys_Soft_Reset();              //软件复位
        }
        else if ((OUT_PACKET[2]>0xA0)&&(OUT_PACKET[2]<=0xA9))
        {
            V_NUM = OUT_PACKET[2] - 0xA1;
        }
  }
}

void EP2_OUT_Callback(void)
{
  u16 out_length;
    out_length = GetEPRxCount(ENDP2);//_GetEPRxCount(ENDP2);//
  PMAToUserBufferCopy(OUT_PACKET, ENDP2_RXADDR, out_length);
    SetEPRxStatus(ENDP2,EP_RX_VALID);
    EP2_CMD();
}

int main(void)
{
u8 tmp_buf[33];    
 
RCC_Configuration();
NVIC_Configuration(); //设置NVIC中断分组2:2位抢占优先级,2位响应优先级

delay_init();     //延时函数初始化  
delay_ms(200);
usb_port_set(0); //USB先断开
delay_ms(200);
usb_port_set(1); //USB再次连接
//USB配置
USB_Interrupts_Config();    
Set_USBClock();   
USB_Init();      
GPIO_Config();
uart_init(9600);        //串口初始化为9600
NRF24L01_Init();     //初始化NRF24L01 
// while(NRF24L01_Check()) //检查NRF24L01是否在位.
// {
// PC13_L;delay_ms(200)C13_H;delay_ms(200); PC13_L;delay_ms(200)C13_H;delay_ms(200)C13_L;delay_ms(200)C13_H;delay_ms(200);
// PC13_L;delay_ms(200)C13_H;delay_ms(200); PC13_L;delay_ms(200)C13_H;delay_ms(200)C13_L;delay_ms(200)C13_H;delay_ms(200);
// }
while(1)
{ PC13_H;
 NRF24L01_RX_Mode();
 delay_ms(500);
 while(1)
 {
    if(NRF24L01_RxPacket(tmp_buf)==0)//一旦接收到信息,则显示出来
    { tmp_buf[32]=0;//加入字符串结束符

   C1_H;
   C3_H;

      }
 }
}
}


spi.c
#include "spi.h"
//////////////////////////////////////////////////////////////////////////////////  
//本程序只供学习使用,未经作者许可,不得用于其它任何用途
//ALIENTEK战舰STM32开发板
//SPI驱动 代码   
//正点原子@ALIENTEK
//技术论坛:www.openedv.com
//修改日期:2012/9/9
//版本:V1.0
//版权所有,盗版必究。
//Copyright(C) 广州市星翼电子科技有限公司 2009-2019
//All rights reserved  
//////////////////////////////////////////////////////////////////////////////////
 
//以下是SPI模块的初始化代码,配置成主机模式,访问SD Card/W25Q64/NRF24L01  
//SPI口初始化
//这里针是对SPI2的初始化



void SPI2_Init(void)
{
  GPIO_InitTypeDef GPIO_InitStructure;
  SPI_InitTypeDef  SPI_InitStructure;

RCC_APB2PeriphClockCmd( RCC_APB2Periph_GPIOB, ENABLE );//PORTB时钟使能 
RCC_APB1PeriphClockCmd( RCC_APB1Periph_SPI2,  ENABLE );//SPI2时钟使能
 
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_13 | GPIO_Pin_14 | GPIO_Pin_15;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;  //PB13/14/15复用推挽输出 
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOB, &GPIO_InitStructure);//初始化GPIOB

  GPIO_SetBits(GPIOB,GPIO_Pin_13|GPIO_Pin_14|GPIO_Pin_15);  //PB13/14/15上拉

SPI_InitStructure.SPI_Direction = SPI_Direction_1Line_Rx; ;  //设置SPI的通信方式,设置SPI单向或者双向的数据模式:SPI设置为双线双向全双工
SPI_InitStructure.SPI_Mode = SPI_Mode_Slave; //设置SPI工作模式:设置为主SPI,从机模式SPI_Mode_Slave
SPI_InitStructure.SPI_DataSize = SPI_DataSize_8b; //设置SPI的数据大小:SPI发送接收8位帧结构
SPI_InitStructure.SPI_CPOL = SPI_CPOL_High; //用来设置时钟极性,串行同步时钟的空闲状态为高电平
SPI_InitStructure.SPI_CPHA = SPI_CPHA_2Edge; //用来设置时钟相位,也就是选择在串行同步时钟的第几个跳变沿(上升或下降)数据被采样,可以为第一个或第二个跳变沿采集,串行同步时钟的第二个跳变沿(上升或下降)数据被采样
SPI_InitStructure.SPI_NSS = SPI_NSS_Soft; //NSS信号由硬件(NSS管脚)还是软件(使用SSI位)管理:内部NSS信号有SSI位控制
SPI_InitStructure.SPI_BaudRatePrescaler = SPI_BaudRatePrescaler_256; //设置SPI波特率预分频值也就是决定SPI的时钟的参数,定义波特率预分频的值:波特率预分频值为256,传输速度为36M/256=140.256KHz
SPI_InitStructure.SPI_FirstBit = SPI_FirstBit_MSB; //指定数据传输从MSB位还是LSB位开始:数据传输从MSB位开始
SPI_InitStructure.SPI_CRCPolynomial = 7; //设置CRC校验多项式,提高通信可靠性,大于1即可。CRC值计算的多项式
SPI_Init(SPI2, &SPI_InitStructure);  //根据SPI_InitStruct中指定的参数初始化外设SPIx寄存器
 
SPI_Cmd(SPI2, ENABLE); //使能SPI外设,使能SPI通信
SPI2_ReadWriteByte(0xff);//启动传输  
 

}   
//SPI 速度设置函数
//SpeedSet:
//SPI_BaudRatePrescaler_2   2分频   
//SPI_BaudRatePrescaler_8   8分频   
//SPI_BaudRatePrescaler_16  16分频  
//SPI_BaudRatePrescaler_256 256分频 
  
void SPI2_SetSpeed(u8 SPI_BaudRatePrescaler)
{
  assert_param(IS_SPI_BAUDRATE_PRESCALER(SPI_BaudRatePrescaler));
SPI2->CR1&=0XFFC7;
SPI2->CR1|=SPI_BaudRatePrescaler; //设置SPI2速度 
SPI_Cmd(SPI2,ENABLE); 


//SPIx 读写一个字节
//TxData:要写入的字节
//返回值:读取到的字节
u8 SPI2_ReadWriteByte(u8 TxData)
{
u8 retry=0;
while (SPI_I2S_GetFlagStatus(SPI2, SPI_I2S_FLAG_TXE) == RESET) //检查指定的SPI标志位设置与否:发送缓存空标志位
{
retry++;
if(retry>200)return 0;
}  
SPI_I2S_SendData(SPI2, TxData); //通过外设SPIx发送一个数据
retry=0;

while (SPI_I2S_GetFlagStatus(SPI2, SPI_I2S_FLAG_RXNE) == RESET)//检查指定的SPI标志位设置与否:接受缓存非空标志位
{
retry++;
if(retry>200)return 0;
}      
return SPI_I2S_ReceiveData(SPI2); //返回通过SPIx最近接收的数据    
}


24l01.c
#include "24l01.h"
#include "delay.h"
#include "spi.h"
#include "usart.h"
//////////////////////////////////////////////////////////////////////////////////  
//本程序只供学习使用,未经作者许可,不得用于其它任何用途
//ALIENTEK战舰STM32开发板
//NRF24L01驱动代码   
//正点原子@ALIENTEK
//技术论坛:www.openedv.com
//修改日期:2012/9/13
//版本:V1.0
//版权所有,盗版必究。
//Copyright(C) 广州市星翼电子科技有限公司 2009-2019
//All rights reserved  
//////////////////////////////////////////////////////////////////////////////////
    
const u8 TX_ADDRESS[TX_ADR_WIDTH]={0xE7,0xE7,0xE7,0xE7,0xE7}; //发送地址
const u8 RX_ADDRESS[RX_ADR_WIDTH]={0xE7,0xE7,0xE7,0xE7,0xE7}; //发送地址

//初始化24L01的IO口
void NRF24L01_Init(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
  SPI_InitTypeDef  SPI_InitStructure;

// RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB|RCC_APB2Periph_GPIOD|RCC_APB2Periph_GPIOG, ENABLE); //使能PB,D,G端口时钟
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE); //使能PB端口时钟
// GPIO_InitStructure.GPIO_Pin = GPIO_Pin_12; //PB12上拉 防止W25X的干扰
// GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; //推挽输出
// GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
// GPIO_Init(GPIOB, &GPIO_InitStructure); //初始化指定IO
// GPIO_SetBits(GPIOB,GPIO_Pin_12);//上拉
 
// GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2; //PD2推挽输出上拉   禁止SD卡的干扰
// GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; //推挽输出
// GPIO_SetBits(GPIOD,GPIO_Pin_2);//初始化指定IO

GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10|GPIO_Pin_11; //PB10 11 推挽  
  GPIO_Init(GPIOB, &GPIO_InitStructure);//初始化指定IO
  
GPIO_InitStructure.GPIO_Pin  = GPIO_Pin_12;   
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPD; //PB12 输入  
GPIO_Init(GPIOB, &GPIO_InitStructure);

GPIO_ResetBits(GPIOB,GPIO_Pin_10|GPIO_Pin_11|GPIO_Pin_12);//PG6,7,8上拉  
 
    SPI2_Init();     //初始化SPI  
 
SPI_Cmd(SPI2, DISABLE); // SPI外设不使能

SPI_InitStructure.SPI_Direction = SPI_Direction_1Line_Rx;  //SPI设置为双线双向全双工
SPI_InitStructure.SPI_Mode = SPI_Mode_Slave ; //SPI主机
    SPI_InitStructure.SPI_DataSize = SPI_DataSize_8b; //发送接收8位帧结构
SPI_InitStructure.SPI_CPOL = SPI_CPOL_Low; //时钟悬空低
SPI_InitStructure.SPI_CPHA = SPI_CPHA_1Edge; //数据捕获于第1个时钟沿
SPI_InitStructure.SPI_NSS = SPI_NSS_Soft; //NSS信号由软件控制
SPI_InitStructure.SPI_BaudRatePrescaler = SPI_BaudRatePrescaler_16; //定义波特率预分频的值:波特率预分频值为16
SPI_InitStructure.SPI_FirstBit = SPI_FirstBit_MSB; //数据传输从MSB位开始
SPI_InitStructure.SPI_CRCPolynomial = 7; //CRC值计算的多项式
SPI_Init(SPI2, &SPI_InitStructure);  //根据SPI_InitStruct中指定的参数初始化外设SPIx寄存器
 
SPI_Cmd(SPI2, ENABLE); //使能SPI外设
 
NRF24L01_CE=0; //使能24L01
NRF24L01_CSN=1; //SPI片选取消  
 
}
//检测24L01是否存在
//返回值:0,成功;1,失败
u8 NRF24L01_Check(void)
{
u8 buf[5]={0XA5,0XA5,0XA5,0XA5,0XA5};
u8 i;
SPI2_SetSpeed(SPI_BaudRatePrescaler_4); //spi速度为9Mhz(24L01的最大SPI时钟为10Mhz)    
NRF24L01_Write_Buf(WRITE_REG_NRF+TX_ADDR,buf,5);//写入5个字节的地址.
NRF24L01_Read_Buf(TX_ADDR,buf,5); //读出写入的地址  
for(i=0;i<5;i++)if(buf!=0XA5)break;   
if(i!=5)return 1;//检测24L01错误
return 0; //检测到24L01
}  
//SPI写寄存器
//reg:指定寄存器地址
//value:写入的值
u8 NRF24L01_Write_Reg(u8 reg,u8 value)
{
u8 status;
    NRF24L01_CSN=0;                 //使能SPI传输
  status =SPI2_ReadWriteByte(reg);//发送寄存器号 
  SPI2_ReadWriteByte(value);      //写入寄存器的值
  NRF24L01_CSN=1;                 //禁止SPI传输   
  return(status);       //返回状态值
}
//读取SPI寄存器值
//reg:要读的寄存器
u8 NRF24L01_Read_Reg(u8 reg)
{
u8 reg_val;    
  NRF24L01_CSN = 0;          //使能SPI传输
  SPI2_ReadWriteByte(reg);   //发送寄存器号
  reg_val=SPI2_ReadWriteByte(0XFF);//读取寄存器内容
  NRF24L01_CSN = 1;          //禁止SPI传输    
  return(reg_val);           //返回状态值
}
//在指定位置读出指定长度的数据
//reg:寄存器(位置)
//*pBuf:数据指针
//len:数据长度
//返回值,此次读到的状态寄存器值 
u8 NRF24L01_Read_Buf(u8 reg,u8 *pBuf,u8 len)
{
u8 status,u8_ctr;       
  NRF24L01_CSN = 0;           //使能SPI传输
  status=SPI2_ReadWriteByte(reg);//发送寄存器值(位置),并读取状态值     
  for(u8_ctr=0;u8_ctr<len;u8_ctr++)pBuf[u8_ctr]=SPI2_ReadWriteByte(0XFF);//读出数据
  NRF24L01_CSN=1;       //关闭SPI传输
  return status;        //返回读到的状态值
}
//在指定位置写指定长度的数据
//reg:寄存器(位置)
//*pBuf:数据指针
//len:数据长度
//返回值,此次读到的状态寄存器值
u8 NRF24L01_Write_Buf(u8 reg, u8 *pBuf, u8 len)
{
u8 status,u8_ctr;    
  NRF24L01_CSN = 0;          //使能SPI传输
  status = SPI2_ReadWriteByte(reg);//发送寄存器值(位置),并读取状态值
  for(u8_ctr=0; u8_ctr<len; u8_ctr++)SPI2_ReadWriteByte(*pBuf++); //写入数据  
  NRF24L01_CSN = 1;       //关闭SPI传输
  return status;          //返回读到的状态值
}   
//启动NRF24L01发送一次数据
//txbuf:待发送数据首地址
//返回值:发送完成状况
u8 NRF24L01_TxPacket(u8 *txbuf)
{
u8 sta;
  SPI2_SetSpeed(SPI_BaudRatePrescaler_8);//spi速度为9Mhz(24L01的最大SPI时钟为10Mhz)   
NRF24L01_CE=0;
  NRF24L01_Write_Buf(WR_TX_PLOAD,txbuf,TX_PLOAD_WIDTH);//写数据到TX BUF  32个字节
  NRF24L01_CE=1;//启动发送   
while(NRF24L01_IRQ!=0);//等待发送完成
sta=NRF24L01_Read_Reg(STATUS);  //读取状态寄存器的值   
NRF24L01_Write_Reg(WRITE_REG_NRF+STATUS,sta); //清除TX_DS或MAX_RT中断标志
if(sta&MAX_TX)//达到最大重发次数
{
NRF24L01_Write_Reg(FLUSH_TX,0xff);//清除TX FIFO寄存器 
return MAX_TX; 
}
if(sta&TX_OK)//发送完成
{
return TX_OK;
}
return 0xff;//其他原因发送失败
}
//启动NRF24L01发送一次数据
//txbuf:待发送数据首地址
//返回值:0,接收完成;其他,错误代码
u8 NRF24L01_RxPacket(u8 *rxbuf)
{
u8 sta;       
SPI2_SetSpeed(SPI_BaudRatePrescaler_8); //spi速度为9Mhz(24L01的最大SPI时钟为10Mhz)   
sta=NRF24L01_Read_Reg(STATUS);  //读取状态寄存器的值      
NRF24L01_Write_Reg(WRITE_REG_NRF+STATUS,sta); //清除TX_DS或MAX_RT中断标志
if(sta&RX_OK)//接收到数据
{
NRF24L01_Read_Buf(RD_RX_PLOAD,rxbuf,RX_PLOAD_WIDTH);//读取数据
NRF24L01_Write_Reg(FLUSH_RX,0xff);//清除RX FIFO寄存器 
return 0; 
}   
return 1;//没收到任何数据
}    
//该函数初始化NRF24L01到RX模式
//设置RX地址,写RX数据宽度,选择RF频道,波特率和LNA HCURR
//当CE变高后,即进入RX模式,并可以接收数据了   
void NRF24L01_RX_Mode(void)
{
NRF24L01_CE=0;  
  NRF24L01_Write_Buf(WRITE_REG_NRF+RX_ADDR_P0,(u8*)RX_ADDRESS,RX_ADR_WIDTH);//写RX节点地址
 
  NRF24L01_Write_Reg(WRITE_REG_NRF+EN_AA,0x01);    //使能通道0的自动应答    
  NRF24L01_Write_Reg(WRITE_REG_NRF+EN_RXADDR,0x01);//使能通道0的接收地址    
  NRF24L01_Write_Reg(WRITE_REG_NRF+RF_CH,40);     //设置RF通信频率  
  NRF24L01_Write_Reg(WRITE_REG_NRF+RX_PW_P0,RX_PLOAD_WIDTH);//选择通道0的有效数据宽度    
  NRF24L01_Write_Reg(WRITE_REG_NRF+RF_SETUP,0x0f);//设置TX发射参数,0db增益,2Mbps,低噪声增益开启   
  NRF24L01_Write_Reg(WRITE_REG_NRF+CONFIG, 0x0f);//配置基本工作模式的参数;PWR_UP,EN_CRC,16BIT_CRC,接收模式 
  NRF24L01_CE = 1; //CE为高,进入接收模式 
}  
//该函数初始化NRF24L01到TX模式
//设置TX地址,写TX数据宽度,设置RX自动应答的地址,填充TX发送数据,选择RF频道,波特率和LNA HCURR
//PWR_UP,CRC使能
//当CE变高后,即进入RX模式,并可以接收数据了   
//CE为高大于10us,则启动发送.  
void NRF24L01_TX_Mode(void)
{  
NRF24L01_CE=0;    
  NRF24L01_Write_Buf(WRITE_REG_NRF+TX_ADDR,(u8*)TX_ADDRESS,TX_ADR_WIDTH);//写TX节点地址 
  NRF24L01_Write_Buf(WRITE_REG_NRF+RX_ADDR_P0,(u8*)RX_ADDRESS,RX_ADR_WIDTH); //设置TX节点地址,主要为了使能ACK  

  NRF24L01_Write_Reg(WRITE_REG_NRF+EN_AA,0x01);     //使能通道0的自动应答    
  NRF24L01_Write_Reg(WRITE_REG_NRF+EN_RXADDR,0x01); //使能通道0的接收地址  
  NRF24L01_Write_Reg(WRITE_REG_NRF+SETUP_RETR,0x1a);//设置自动重发间隔时间:500us + 86us;最大自动重发次数:10次
  NRF24L01_Write_Reg(WRITE_REG_NRF+RF_CH,40);       //设置RF通道为40
  NRF24L01_Write_Reg(WRITE_REG_NRF+RF_SETUP,0x0f);  //设置TX发射参数,0db增益,2Mbps,低噪声增益开启   
  NRF24L01_Write_Reg(WRITE_REG_NRF+CONFIG,0x0e);    //配置基本工作模式的参数;PWR_UP,EN_CRC,16BIT_CRC,接收模式,开启所有中断
NRF24L01_CE=1;//CE为高,10us后启动发送
}  



































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

使用道具 举报

39

主题

2026

帖子

1

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
2020
金钱
2020
注册时间
2013-5-1
在线时间
87 小时
发表于 2014-3-20 17:17:11 | 显示全部楼层
能识别说明SPI硬件没问题,一个发送一个接收,查查哪边设置的不对了
博观而约取,厚积而薄发。
回复 支持 反对

使用道具 举报

12

主题

25

帖子

0

精华

初级会员

Rank: 2

积分
93
金钱
93
注册时间
2013-12-30
在线时间
0 小时
 楼主| 发表于 2014-3-20 17:24:06 | 显示全部楼层
发送用的是战舰开发板程序也是用的例程没有问题,是接收的问题,不过找了半天真不知道哪里不对啊,程序在上边,哪位大神帮我看看啊,万分感谢啊
回复 支持 反对

使用道具 举报

69

主题

475

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1334
金钱
1334
注册时间
2013-12-28
在线时间
197 小时
发表于 2014-3-20 17:43:51 | 显示全部楼层
我跟你的情况类似,我也是用的STM32F103C8的最小系统板弄的,但还没弄成功,个人感觉中文版的数据手册问题太多,所以现在正在研究英文版的,正在研究中。。。。。。。。。。。。。
个人感觉你现在还没必要把Flash这块添加进来,从简到难,一步步来,先把无线搞通
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165536
金钱
165536
注册时间
2010-12-1
在线时间
2117 小时
发表于 2014-3-20 18:24:32 | 显示全部楼层
不要屏蔽NRF24L01检测的代码,试试NRF24L01自检是否好使。再 分析问题。
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

12

主题

25

帖子

0

精华

初级会员

Rank: 2

积分
93
金钱
93
注册时间
2013-12-30
在线时间
0 小时
 楼主| 发表于 2014-3-20 20:06:30 | 显示全部楼层
原子哥,我一开始NRF24L01检测的代码没有屏蔽,自检是好使的,然后调试程序时候屏蔽的,进行硬件仿真的时候,发现程序可以一步步的执行,一点比较蹊跷是   while(1)
  {
     if(NRF24L01_RxPacket(tmp_buf)==0)//一旦接收到信息,则显示出来
     { 
    tmp_buf[32]=0;//加入字符串结束符
    C1_H;
    C3_H;

        }
  } 
在这里执行完      if(NRF24L01_RxPacket(tmp_buf)==0)//一旦接收到信息,则显示出来
就执行     C3_H;
循环执行,不明白为什么,跟论坛里的几个例程也比较了,没什么问题啊程序,望指点啊。
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165536
金钱
165536
注册时间
2010-12-1
在线时间
2117 小时
发表于 2014-3-20 21:28:47 | 显示全部楼层
回复【6楼】小梦:
---------------------------------
说明收到数据,执行到PC1_H里面去了。
能自检通过,说明基本通信是没问题,应该可以排除SPI配置的问题了。
剩下就是看看发送数据长度,两边是不是相等?
都是32字节?还是都是多少字节?
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

12

主题

25

帖子

0

精华

初级会员

Rank: 2

积分
93
金钱
93
注册时间
2013-12-30
在线时间
0 小时
 楼主| 发表于 2014-3-21 10:56:16 | 显示全部楼层
都是32字节,发射接收函数都是 u8 tmp_buf[33];     
发射接收地址也都改成了
const u8 TX_ADDRESS[TX_ADR_WIDTH]={0x34,0x43,0x10,0x10,0x01}; //发送地址
const u8 RX_ADDRESS[RX_ADR_WIDTH]={0x34,0x43,0x10,0x10,0x01}; //发送地址
至今未检查到错误,既然仿真的时候可以运行到  C3_H;
为什么发射板用的是战舰开发板就显示Send Failed呢,求帮助啊
回复 支持 反对

使用道具 举报

11

主题

71

帖子

0

精华

初级会员

Rank: 2

积分
135
金钱
135
注册时间
2014-1-3
在线时间
0 小时
发表于 2014-3-21 12:03:39 | 显示全部楼层
回复【7楼】正点原子:
---------------------------------
原子哥,我现在自检,硬件仿真,返回为4个0XA5,1个0XA1,这能说明SPI设置成功么?
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165536
金钱
165536
注册时间
2010-12-1
在线时间
2117 小时
发表于 2014-3-21 13:58:16 | 显示全部楼层
回复【9楼】jidian0177:
---------------------------------
自检不成功哦。。。
你的SPI配置,直接抄我们的例程就可以的,RC和RB一样的用。
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

11

主题

71

帖子

0

精华

初级会员

Rank: 2

积分
135
金钱
135
注册时间
2014-1-3
在线时间
0 小时
发表于 2014-3-21 16:56:29 | 显示全部楼层
回复【10楼】正点原子:
---------------------------------
配置就是按你们的来的,你说的RC. RB是什么呢?
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165536
金钱
165536
注册时间
2010-12-1
在线时间
2117 小时
发表于 2014-3-21 18:19:52 | 显示全部楼层
回复【11楼】jidian0177:
---------------------------------
RC=STM32F103RCT6
RB=STM32F103RBT6
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

11

主题

71

帖子

0

精华

初级会员

Rank: 2

积分
135
金钱
135
注册时间
2014-1-3
在线时间
0 小时
发表于 2014-3-22 10:12:55 | 显示全部楼层
回复【12楼】正点原子:
---------------------------------
原子大哥,我现在检测函数,读出来的值怎么都是0XFF呢?
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165536
金钱
165536
注册时间
2010-12-1
在线时间
2117 小时
发表于 2014-3-22 14:54:57 | 显示全部楼层
回复【13楼】jidian0177:
---------------------------------
1,可能SPI没配置好。
2,可能硬件连接有问题。
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-6-9 13:48

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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