你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

STM32f103c8t6 NRF24L01驱动

[复制链接]
KEJIWUXIAN 提问时间:2017-1-29 10:29 /
驱动代码如下:
#ifndef NRF24L01_H
#define NRF24L01_H
#include"stm32f10x.h"
#include"stdio.h"
#define NRF_CE1() GPIOA->BSRR|=1<<2
#define NRF_CE0() GPIOA->BRR|=1<<2
#define NRF_CS1() GPIOA->BSRR|=1<<4
#define NRF_CS0() GPIOA->BRR|=1<<4
/****************************************************************************************************/
//NRF24L01寄存器操作
#define READ_REG_NRF    0x00  //读配置寄存器,低5位为寄存器地址
#define WRITE_REG_NRF   0x20  //写配置寄存器,低5位为寄存器地址
#define RD_RX_PLOAD     0x61  //读RX有效数据,1~32字节
#define WR_TX_PLOAD     0xA0  //写TX有效数据,1~32字节
#define FLUSH_TX        0xE1  //清除TX FIFO寄存器.发射模式下用
#define FLUSH_RX        0xE2  //清除RX FIFO寄存器.接收模式下用
#define REUSE_TX_PL     0xE3  //重新使用上一包数据,CE为高,数据包被不断发送.
#define NOP             0xFF  //空操作,可以用来读状态寄存器         
//NRF24L01寄存器地址
#define CONFIG          0x00  //配置寄存器地址;bit0:1接收模式,0发射模式;bit1:电选择;bit2:CRC模式;bit3:CRC使能;
                              //bit4:中断MAX_RT(达到最大重发次数中断)使能;bit5:中断TX_DS使能;bit6:中断RX_DR使能
#define EN_AA           0x01  //使能自动应答功能  bit0~5,对应通道0~5
#define EN_RXADDR       0x02  //接收地址允许,bit0~5,对应通道0~5
#define SETUP_AW        0x03  //设置地址宽度(所有数据通道):bit1,0:00,3字节;01,4字节;02,5字节;
#define SETUP_RETR      0x04  //建立自动重发;bit3:0,自动重发计数器;bit7:4,自动重发延时 250*x+86us
#define RF_CH           0x05  //RF通道,bit6:0,工作通道频率;
#define RF_SETUP        0x06  //RF寄存器;bit3:传输速率(0:1Mbps,1:2Mbps);bit2:1,发射功率;bit0:低噪声放大器增益
#define STATUS          0x07  //状态寄存器;bit0:TX FIFO满标志;bit3:1,接收数据通道号(最大:6);bit4,达到最多次重发
                              //bit5:数据发送完成中断;bit6:接收数据中断;
#define MAX_TX                  0x10  //达到最大发送次数中断
#define TX_OK                   0x20  //TX发送完成中断
#define RX_OK                   0x40  //接收到数据中断
#define OBSERVE_TX      0x08  //发送检测寄存器,bit7:4,数据包丢失计数器;bit3:0,重发计数器
#define CD              0x09  //载波检测寄存器,bit0,载波检测;
#define RX_ADDR_P0      0x0A  //数据通道0接收地址,最大长度5个字节,低字节在前
#define RX_ADDR_P1      0x0B  //数据通道1接收地址,最大长度5个字节,低字节在前
#define RX_ADDR_P2      0x0C  //数据通道2接收地址,最低字节可设置,高字节,必须同RX_ADDR_P1[39:8]相等;
#define RX_ADDR_P3      0x0D  //数据通道3接收地址,最低字节可设置,高字节,必须同RX_ADDR_P1[39:8]相等;
#define RX_ADDR_P4      0x0E  //数据通道4接收地址,最低字节可设置,高字节,必须同RX_ADDR_P1[39:8]相等;
#define RX_ADDR_P5      0x0F  //数据通道5接收地址,最低字节可设置,高字节,必须同RX_ADDR_P1[39:8]相等;
#define TX_ADDR         0x10  //发送地址(低字节在前),ShockBurstTM模式下,RX_ADDR_P0与此地址相等
#define RX_PW_P0        0x11  //接收数据通道0有效数据宽度(1~32字节),设置为0则非法
#define RX_PW_P1        0x12  //接收数据通道1有效数据宽度(1~32字节),设置为0则非法
#define RX_PW_P2        0x13  //接收数据通道2有效数据宽度(1~32字节),设置为0则非法
#define RX_PW_P3        0x14  //接收数据通道3有效数据宽度(1~32字节),设置为0则非法
#define RX_PW_P4        0x15  //接收数据通道4有效数据宽度(1~32字节),设置为0则非法
#define RX_PW_P5        0x16  //接收数据通道5有效数据宽度(1~32字节),设置为0则非法
#define NRF_FIFO_STATUS 0x17  //FIFO状态寄存器;bit0,RX FIFO寄存器空标志;bit1,RX FIFO满标志;bit2,3,保留
                              //bit4,TX FIFO空标志;bit5,TX FIFO满标志;bit6,1,循环发送上一数据包.0,不循环;
/****************************************************************************************************/
void NRF24L01_INIT()
{
        RCC->APB2ENR|=1|(1<<2)|(1<<12);//AFIO|GPIOA|SPI1
        //IO
        GPIOA->CRL&=0x000000FF;
        GPIOA->CRL|=0xBBB38300;
        GPIOA->BSRR|=(1<<2)|(1<<3);
        //SPI
        SPI1->CR1|=0x0314;
        SPI1->CR1|=1<<6;
        //IRQ
        EXTI->IMR|=1<<3;
        EXTI->FTSR|=1<<3;
        NVIC->ISER[EXTI3_IRQn/32]|=1<<(EXTI3_IRQn%32);
}
u8 SPI1_Char(u8 c)
{
        while((SPI1->SR&1<<1)==0);
        SPI1->DR=c;
        while((SPI1->SR&1)==0);
        return SPI1->DR;
}
u8 NRF_Write(u8 cmd,u8 value)
{
           NRF_CS0();
          u8 status=SPI1_Char(cmd);
          SPI1_Char(value);
          NRF_CS1();
          return(status);
}
u8 NRF_Read(u8 cmd)
{   
                NRF_CS0();
          SPI1_Char(cmd);
          u8 value=SPI1_Char(0XFF);
          NRF_CS1();
          return(value);
}
u8 NRF_Read_Data(u8 cmd,u8*data,u8 size)
{               
          NRF_CS0();
          u8 status=SPI1_Char(cmd);
                for(u8 i=0;i<size;i++)data[i]=SPI1_Char(0XFF);
          NRF_CS1();
          return status;
}
u8 NRF_Write_Data(u8 cmd,u8*data,u8 size)
{               
          NRF_CS0();
          u8 status=SPI1_Char(cmd);           
                for(u8 i=0;i<size;i++)SPI1_Char(data[i]);
          NRF_CS1();
          return status;
}
u8 NRF_Check()
{
        u8 buf[5]={0xA5,0xA5,0xA5,0xA5,0xA5},i;
        NRF_Write_Data(WRITE_REG_NRF+TX_ADDR,buf,5);
        NRF_Read_Data(READ_REG_NRF+TX_ADDR,buf,5);
        for(i=0;i<5;i++)printf("%X ",buf[i]);
        putchar('\n');
        for(i=0;i<5;i++)if(buf[i]!=0xA5)break;
        if(i!=5)return 1;
        return 0;
}
#ifdef __cplusplus
extern "C"
{
#endif
        void EXTI3_IRQHandler()
        {
                puts("IRQ");
                EXTI->PR|=1<<2;
        }
#ifdef __cplusplus
}
#endif
#endif
初始化后调用NRF_Chack()收到的都是0 0 0 0 0或FF FF FF FF FF求解
收藏 3 评论2 发布时间:2017-1-29 10:29

举报

2个回答
KEJIWUXIAN 回答时间:2017-1-29 10:31:19
硬件接口:CE->PA2,CSN->PA4,IRQ->PA3
SPI->SPI1(PA5,6,7)
KEJIWUXIAN 回答时间:2017-1-29 19:39:51
求助啊!!!!!!

所属标签

相似问题

关于意法半导体
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
招聘信息
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
关注我们
st-img 微信公众号
st-img 手机版