OpenEdv-开源电子网

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

NRF24L01无线通信的问题

[复制链接]

1

主题

13

帖子

0

精华

新手上路

积分
37
金钱
37
注册时间
2013-8-23
在线时间
0 小时
发表于 2013-8-23 11:32:21 | 显示全部楼层 |阅读模式
想问下哪位大哥之前用MINI32移植过原子老师的战舰开发板的无线通信库函数的代码,这几天一直在研究,但总是检测不到24L01,CHECK()函数那边一直检测不到,之前也看过该网上关于无线的帖子,能改进的都改进了(比如SPI时钟极性及相位等),但是始终出不来结果,所以想问问大家有谁之前有做过的没,指导下刚入门的吧,谢咯~
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

1

主题

4

帖子

0

精华

新手入门

积分
28
金钱
28
注册时间
2013-8-8
在线时间
0 小时
发表于 2013-8-23 13:06:56 | 显示全部楼层
把你的程序贴出来看看!
回复 支持 反对

使用道具 举报

230

主题

1950

帖子

10

精华

论坛元老

Rank: 8Rank: 8

积分
4562
金钱
4562
注册时间
2010-12-14
在线时间
32 小时
发表于 2013-8-23 13:52:01 | 显示全部楼层
回复【2楼】拽拽小恶魔:
<br>---------------------------------
<br>没有程序很难给建议啊。。。
我是开源电子网?网站管理员,对网站有任何问题,请与我联系!QQ:389063473Email:389063473@qq.com
回复 支持 反对

使用道具 举报

39

主题

2026

帖子

1

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
2020
金钱
2020
注册时间
2013-5-1
在线时间
87 小时
发表于 2013-8-23 14:14:02 | 显示全部楼层
仿真一下看看~看程序死在哪了
博观而约取,厚积而薄发。
回复 支持 反对

使用道具 举报

1

主题

13

帖子

0

精华

新手上路

积分
37
金钱
37
注册时间
2013-8-23
在线时间
0 小时
 楼主| 发表于 2013-8-23 14:27:39 | 显示全部楼层
<p>                                             #include&nbsp;"spi.h"<br />
<br />
&nbsp;<br />
//以下是SPI模块的初始化代码,配置成主机模式,访问SD&nbsp;Card/W25Q64/NRF24L01                                                &nbsp;&nbsp;<br />
//SPI口初始化<br />
//这里针是对SPI1的初始化<br />
<br />
<br />
<br />
void&nbsp;SPI1_Init(void)<br />
{        <br />
&nbsp;        GPIO_InitTypeDef&nbsp;GPIO_InitStructure;<br />
&nbsp;&nbsp;        SPI_InitTypeDef&nbsp;&nbsp;SPI_InitStructure;<br />
<br />
        RCC_APB2PeriphClockCmd(        RCC_APB2Periph_GPIOA,&nbsp;ENABLE&nbsp;);//PORTa时钟使能&nbsp;<br />
        RCC_APB2PeriphClockCmd(        RCC_APB2Periph_SPI1,&nbsp;&nbsp;ENABLE&nbsp;);//SPI1时钟使能&nbsp;        <br />
&nbsp;<br />
        GPIO_InitStructure.GPIO_Pin&nbsp;=&nbsp;(GPIO_Pin_5&nbsp;|&nbsp;GPIO_Pin_6&nbsp;|&nbsp;GPIO_Pin_7);<br />
        GPIO_InitStructure.GPIO_Mode&nbsp;=&nbsp;GPIO_Mode_AF_PP;&nbsp;&nbsp;//PA5/6/7复用推挽输出&nbsp;<br />
        GPIO_InitStructure.GPIO_Speed&nbsp;=&nbsp;GPIO_Speed_50MHz;<br />
        GPIO_Init(GPIOA,&nbsp;&amp;GPIO_InitStructure);//初始化GPIOa<br />
<br />
&nbsp;        GPIO_SetBits(GPIOA,GPIO_Pin_5|GPIO_Pin_6|GPIO_Pin_7);&nbsp;&nbsp;//PA5/6/7上拉<br />
<br />
        SPI_InitStructure.SPI_Direction&nbsp;=&nbsp;SPI_Direction_2Lines_FullDuplex;&nbsp;&nbsp;//设置SPI单向或者双向的数据模式:SPI设置为双线双向全双工<br />
        SPI_InitStructure.SPI_Mode&nbsp;=&nbsp;SPI_Mode_Master;                //设置SPI工作模式:设置为主SPI<br />
        SPI_InitStructure.SPI_DataSize&nbsp;=&nbsp;SPI_DataSize_8b;                //设置SPI的数据大小:SPI发送接收8位帧结构<br />
        SPI_InitStructure.SPI_CPOL&nbsp;=&nbsp;SPI_CPOL_High;                //串行同步时钟的空闲状态为高电平<br />
        SPI_InitStructure.SPI_CPHA&nbsp;=&nbsp;SPI_CPHA_2Edge;        //串行同步时钟的第二个跳变沿(上升或下降)数据被采样<br />
        SPI_InitStructure.SPI_NSS&nbsp;=&nbsp;SPI_NSS_Soft;                //NSS信号由硬件(NSS管脚)还是软件(使用SSI位)管理:内部NSS信号有SSI位控制<br />
        SPI_InitStructure.SPI_BaudRatePrescaler&nbsp;=&nbsp;SPI_BaudRatePrescaler_256;                //定义波特率预分频的值:波特率预分频值为256<br />
        SPI_InitStructure.SPI_FirstBit&nbsp;=&nbsp;SPI_FirstBit_MSB;        //指定数据传输从MSB位还是LSB位开始:数据传输从MSB位开始<br />
        SPI_InitStructure.SPI_CRCPolynomial&nbsp;=&nbsp;7;        //CRC值计算的多项式<br />
        SPI_Init(SPI1,&nbsp;&amp;SPI_InitStructure);&nbsp;&nbsp;//根据SPI_InitStruct中指定的参数初始化外设SPIx寄存器<br />
&nbsp;<br />
        SPI_Cmd(SPI1,&nbsp;ENABLE);&nbsp;//使能SPI外设<br />
        <br />
        SPI1_ReadWriteByte(0xff);//启动传输                &nbsp;<br />
}&nbsp;&nbsp;&nbsp;<br />
//SPI&nbsp;速度设置函数<br />
//SpeedSet:<br />
//SPI_BaudRatePrescaler_2&nbsp;&nbsp;&nbsp;2分频&nbsp;&nbsp;&nbsp;<br />
//SPI_BaudRatePrescaler_8&nbsp;&nbsp;&nbsp;8分频&nbsp;&nbsp;&nbsp;<br />
//SPI_BaudRatePrescaler_16&nbsp;&nbsp;16分频&nbsp;&nbsp;<br />
//SPI_BaudRatePrescaler_256&nbsp;256分频&nbsp;<br />
&nbsp;&nbsp;<br />
void&nbsp;SPI1_SetSpeed(u8&nbsp;SPI_BaudRatePrescaler)<br />
{<br />
&nbsp;&nbsp;        assert_param(IS_SPI_BAUDRATE_PRESCALER(SPI_BaudRatePrescaler));<br />
        SPI1-&gt;CR1&amp;=0XFFC7;<br />
        SPI1-&gt;CR1|=SPI_BaudRatePrescaler;        //设置SPI1速度&nbsp;<br />
        SPI_Cmd(SPI1,ENABLE);&nbsp;<br />
}&nbsp;<br />
//SPIx&nbsp;读写一个字节<br />
//TxData:要写入的字节<br />
//返回值:读取到的字节<br />
u8&nbsp;SPI1_ReadWriteByte(u8&nbsp;TxData)<br />
{                <br />
        u8&nbsp;retry=0;                                &nbsp;        <br />
        while&nbsp;(SPI_I2S_GetFlagStatus(SPI1,&nbsp;SPI_I2S_FLAG_TXE)&nbsp;==&nbsp;RESET)&nbsp;//检查指定的SPI标志位设置与否:发送缓存空标志位<br />
                {<br />
                retry++;<br />
                if(retry&gt;200)return&nbsp;0;<br />
                }                        &nbsp;&nbsp;<br />
        SPI_I2S_SendData(SPI1,&nbsp;TxData);&nbsp;//通过外设SPIx发送一个数据<br />
        retry=0;<br />
<br />
        while&nbsp;(SPI_I2S_GetFlagStatus(SPI1,&nbsp;SPI_I2S_FLAG_RXNE)&nbsp;==&nbsp;RESET)//检查指定的SPI标志位设置与否:接受缓存非空标志位<br />
                {<br />
                retry++;<br />
                if(retry&gt;200)return&nbsp;0;<br />
                }        &nbsp;&nbsp;                                                &nbsp;&nbsp;&nbsp;&nbsp;<br />
        return&nbsp;SPI_I2S_ReceiveData(SPI1);&nbsp;//返回通过SPIx最近接收的数据                                        &nbsp;&nbsp;&nbsp;&nbsp;<br />
}<br />
<br />
<br />
<br />
<br />
<br />
#include&nbsp;"24l01.h"<br />
#include&nbsp;"lcd12864.h"<br />
#include&nbsp;"delay.h"<br />
#include&nbsp;"spi.h"<br />
#include&nbsp;"usart.h"<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;<br />
const&nbsp;u8&nbsp;TX_ADDRESS[TX_ADR_WIDTH]={0x34,0x43,0x10,0x10,0x01};&nbsp;//发送地址<br />
const&nbsp;u8&nbsp;RX_ADDRESS[RX_ADR_WIDTH]={0x34,0x43,0x10,0x10,0x01};&nbsp;//发送地址<br />
<br />
//初始化24L01的IO口<br />
void&nbsp;NRF24L01_Init(void)<br />
{&nbsp;        <br />
        GPIO_InitTypeDef&nbsp;GPIO_InitStructure;<br />
&nbsp;&nbsp;        SPI_InitTypeDef&nbsp;&nbsp;SPI_InitStructure;<br />
<br />
        RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_GPIOC,&nbsp;ENABLE);        &nbsp;//使能PA,C端口时钟<br />
&nbsp;&nbsp;&nbsp;&nbsp;        <br />
        <br />
        GPIO_InitStructure.GPIO_Pin&nbsp;=&nbsp;GPIO_Pin_2;                                &nbsp;//PA2上拉&nbsp;防止W25X的干扰<br />
&nbsp;        GPIO_InitStructure.GPIO_Mode&nbsp;=&nbsp;GPIO_Mode_Out_PP;&nbsp;                &nbsp;//推挽输出<br />
&nbsp;        GPIO_InitStructure.GPIO_Speed&nbsp;=&nbsp;GPIO_Speed_50MHz;<br />
&nbsp;        GPIO_Init(GPIOA,&nbsp;&amp;GPIO_InitStructure);        //初始化指定IO<br />
&nbsp;        GPIO_SetBits(GPIOA,GPIO_Pin_2);//上拉                                <br />
&nbsp;        <br />
        GPIO_InitStructure.GPIO_Pin&nbsp;=&nbsp;GPIO_Pin_3;                                &nbsp;//Pa3推挽输出上拉&nbsp;&nbsp;&nbsp;禁止SD卡的干扰<br />
&nbsp;        GPIO_InitStructure.GPIO_Mode&nbsp;=&nbsp;GPIO_Mode_Out_PP;&nbsp;                &nbsp;//推挽输出<br />
        GPIO_Init(GPIOA,&nbsp;&amp;GPIO_InitStructure);        //初始化指定IO<br />
&nbsp;        GPIO_SetBits(GPIOA,GPIO_Pin_3);//初始化指定IO<br />
<br />
        GPIO_InitStructure.GPIO_Pin&nbsp;=&nbsp;GPIO_Pin_4;        //PA4&nbsp;推挽&nbsp;        &nbsp;&nbsp;<br />
&nbsp;        GPIO_Init(GPIOA,&nbsp;&amp;GPIO_InitStructure);//初始化指定IO<br />
<br />
        GPIO_InitStructure.GPIO_Pin&nbsp;=&nbsp;GPIO_Pin_4;        //PC4&nbsp;推挽&nbsp;        &nbsp;&nbsp;<br />
&nbsp;        GPIO_Init(GPIOC,&nbsp;&amp;GPIO_InitStructure);//初始化指定IO<br />
&nbsp;&nbsp;<br />
        GPIO_InitStructure.GPIO_Pin&nbsp;&nbsp;=&nbsp;GPIO_Pin_5;&nbsp;&nbsp;&nbsp;<br />
        GPIO_InitStructure.GPIO_Mode&nbsp;=&nbsp;GPIO_Mode_IPD;&nbsp;//PC5&nbsp;输入&nbsp;&nbsp;<br />
        GPIO_Init(GPIOC,&nbsp;&amp;GPIO_InitStructure);<br />
<br />
        GPIO_ResetBits(GPIOC,GPIO_Pin_4|GPIO_Pin_5);//Pc4,5上拉        <br />
        <br />
        GPIO_ResetBits(GPIOA,GPIO_Pin_4);//PA4上拉        <br />
                                        &nbsp;<br />
                &nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;SPI1_Init();&nbsp;&nbsp;&nbsp;&nbsp;                //初始化SPI        &nbsp;<br />
&nbsp;<br />
        SPI_Cmd(SPI1,&nbsp;DISABLE);&nbsp;//&nbsp;SPI外设不使能<br />
<br />
        SPI_InitStructure.SPI_Direction&nbsp;=&nbsp;SPI_Direction_2Lines_FullDuplex;&nbsp;&nbsp;//SPI设置为双线双向全双工<br />
        SPI_InitStructure.SPI_Mode&nbsp;=&nbsp;SPI_Mode_Master;                //SPI主机<br />
&nbsp;&nbsp;&nbsp;&nbsp;SPI_InitStructure.SPI_DataSize&nbsp;=&nbsp;SPI_DataSize_8b;                //发送接收8位帧结构<br />
        SPI_InitStructure.SPI_CPOL&nbsp;=&nbsp;SPI_CPOL_Low;                //时钟悬空低<br />
        SPI_InitStructure.SPI_CPHA&nbsp;=&nbsp;SPI_CPHA_1Edge;        //数据捕获于第1个时钟沿<br />
        SPI_InitStructure.SPI_NSS&nbsp;=&nbsp;SPI_NSS_Soft;                //NSS信号由软件控制<br />
        SPI_InitStructure.SPI_BaudRatePrescaler&nbsp;=&nbsp;SPI_BaudRatePrescaler_16;                //定义波特率预分频的值:波特率预分频值为16<br />
        SPI_InitStructure.SPI_FirstBit&nbsp;=&nbsp;SPI_FirstBit_MSB;        //数据传输从MSB位开始<br />
        SPI_InitStructure.SPI_CRCPolynomial&nbsp;=&nbsp;7;        //CRC值计算的多项式<br />
        SPI_Init(SPI1,&nbsp;&amp;SPI_InitStructure);&nbsp;&nbsp;//根据SPI_InitStruct中指定的参数初始化外设SPIx寄存器<br />
&nbsp;<br />
        SPI_Cmd(SPI1,&nbsp;ENABLE);&nbsp;//使能SPI外设<br />
                        &nbsp;<br />
        NRF24L01_CE=0;&nbsp;                        //使能24L01<br />
        NRF24L01_CSN=1;                        //SPI片选取消&nbsp;&nbsp;<br />
        &nbsp;                &nbsp;        &nbsp;<br />
}<br />
//检测24L01是否存在<br />
//返回值:0,成功;1,失败        <br />
u8&nbsp;NRF24L01_Check(void)<br />
{<br />
        u8&nbsp;buf[5]={0XA5,0XA5,0XA5,0XA5,0XA5};<br />
        u8&nbsp;i;<br />
        SPI1_SetSpeed(SPI_BaudRatePrescaler_4);&nbsp;//spi速度为9Mhz(24L01的最大SPI时钟为10Mhz)&nbsp;&nbsp;&nbsp;        &nbsp;<br />
        NRF24L01_Write_Buf(WRITE_REG_NRF+TX_ADDR,buf,5);//写入5个字节的地址.        <br />
        NRF24L01_Read_Buf(TX_ADDR,buf,5);&nbsp;//读出写入的地址&nbsp;&nbsp;<br />
        for(i=0;i&lt;5;i++)if(buf!=0XA5)break;        &nbsp;                                                        &nbsp;&nbsp;&nbsp;<br />
        if(i!=5)return&nbsp;1;//检测24L01错误        <br />
        return&nbsp;0;                &nbsp;//检测到24L01<br />
}        &nbsp;        &nbsp;<br />
//SPI写寄存器<br />
//reg:指定寄存器地址<br />
//value:写入的值<br />
u8&nbsp;NRF24L01_Write_Reg(u8&nbsp;reg,u8&nbsp;value)<br />
{<br />
        u8&nbsp;status;        <br />
&nbsp;&nbsp;&nbsp;        NRF24L01_CSN=0;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//使能SPI传输<br />
&nbsp;&nbsp;        status&nbsp;=SPI1_ReadWriteByte(reg);//发送寄存器号&nbsp;<br />
&nbsp;&nbsp;        SPI1_ReadWriteByte(value);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//写入寄存器的值<br />
&nbsp;&nbsp;        NRF24L01_CSN=1;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//禁止SPI传输        &nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;        return(status);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;                        //返回状态值<br />
}<br />
//读取SPI寄存器值<br />
//reg:要读的寄存器<br />
u8&nbsp;NRF24L01_Read_Reg(u8&nbsp;reg)<br />
{<br />
        u8&nbsp;reg_val;        &nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;        NRF24L01_CSN&nbsp;=&nbsp;0;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//使能SPI传输                <br />
&nbsp;&nbsp;        SPI1_ReadWriteByte(reg);&nbsp;&nbsp;&nbsp;//发送寄存器号<br />
&nbsp;&nbsp;        reg_val=SPI1_ReadWriteByte(0XFF);//读取寄存器内容<br />
&nbsp;&nbsp;        NRF24L01_CSN&nbsp;=&nbsp;1;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//禁止SPI传输                &nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;        return(reg_val);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//返回状态值<br />
}        <br />
//在指定位置读出指定长度的数据<br />
//reg:寄存器(位置)<br />
//*pBuf:数据指针<br />
//len:数据长度<br />
//返回值,此次读到的状态寄存器值&nbsp;<br />
u8&nbsp;NRF24L01_Read_Buf(u8&nbsp;reg,u8&nbsp;*pBuf,u8&nbsp;len)<br />
{<br />
        u8&nbsp;status,u8_ctr;        &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;        NRF24L01_CSN&nbsp;=&nbsp;0;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//使能SPI传输<br />
&nbsp;&nbsp;        status=SPI1_ReadWriteByte(reg);//发送寄存器值(位置),并读取状态值&nbsp;&nbsp;&nbsp;        &nbsp;&nbsp;&nbsp;<br />
&nbsp;        for(u8_ctr=0;u8_ctr&lt;len;u8_ctr++)pBuf[u8_ctr]=SPI1_ReadWriteByte(0XFF);//读出数据<br />
&nbsp;&nbsp;        NRF24L01_CSN=1;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//关闭SPI传输<br />
&nbsp;&nbsp;        return&nbsp;status;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//返回读到的状态值<br />
}<br />
//在指定位置写指定长度的数据<br />
//reg:寄存器(位置)<br />
//*pBuf:数据指针<br />
//len:数据长度<br />
//返回值,此次读到的状态寄存器值<br />
u8&nbsp;NRF24L01_Write_Buf(u8&nbsp;reg,&nbsp;u8&nbsp;*pBuf,&nbsp;u8&nbsp;len)<br />
{<br />
        u8&nbsp;status,u8_ctr;        &nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;        NRF24L01_CSN&nbsp;=&nbsp;0;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//使能SPI传输<br />
&nbsp;&nbsp;        status&nbsp;=&nbsp;SPI1_ReadWriteByte(reg);//发送寄存器值(位置),并读取状态值<br />
&nbsp;&nbsp;        for(u8_ctr=0;&nbsp;u8_ctr&gt;&lt;len;&nbsp;u8_ctr++)SPI1_ReadWriteByte(*pBuf++);&nbsp;//写入数据        &nbsp;<br />
&nbsp;&nbsp;        NRF24L01_CSN&nbsp;=&nbsp;1;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//关闭SPI传输<br />
&nbsp;&nbsp;        return&nbsp;status;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//返回读到的状态值<br />
}                                &nbsp;&nbsp;&nbsp;<br />
//启动NRF24L01发送一次数据<br />
//txbuf:待发送数据首地址<br />
//返回值:发送完成状况<br />
u8&nbsp;NRF24L01_TxPacket(u8&nbsp;*txbuf)<br />
{<br />
        u8&nbsp;sta;<br />
&nbsp;        SPI1_SetSpeed(SPI_BaudRatePrescaler_8);//spi速度为9Mhz(24L01的最大SPI时钟为10Mhz)&nbsp;&nbsp;&nbsp;<br />
        NRF24L01_CE=0;<br />
&nbsp;&nbsp;        NRF24L01_Write_Buf(WR_TX_PLOAD,txbuf,TX_PLOAD_WIDTH);//写数据到TX&nbsp;BUF&nbsp;&nbsp;32个字节<br />
&nbsp;        NRF24L01_CE=1;//启动发送        &nbsp;&nbsp;&nbsp;<br />
        while(NRF24L01_IRQ!=0);//等待发送完成<br />
        sta=NRF24L01_Read_Reg(STATUS);&nbsp;&nbsp;//读取状态寄存器的值        &nbsp;&nbsp;&nbsp;<br />
        NRF24L01_Write_Reg(WRITE_REG_NRF+STATUS,sta);&nbsp;//清除TX_DS或MAX_RT中断标志<br />
        if(sta&amp;MAX_TX)//达到最大重发次数<br />
        {<br />
                NRF24L01_Write_Reg(FLUSH_TX,0xff);//清除TX&nbsp;FIFO寄存器&nbsp;<br />
                return&nbsp;MAX_TX;&nbsp;<br />
        }<br />
        if(sta&amp;TX_OK)//发送完成<br />
        {<br />
                return&nbsp;TX_OK;<br />
        }<br />
        return&nbsp;0xff;//其他原因发送失败<br />
}<br />
//启动NRF24L01发送一次数据<br />
//txbuf:待发送数据首地址<br />
//返回值:0,接收完成;其他,错误代码<br />
u8&nbsp;NRF24L01_RxPacket(u8&nbsp;*rxbuf)<br />
{<br />
        u8&nbsp;sta;                &nbsp;&nbsp;&nbsp;&nbsp;                                                        &nbsp;&nbsp;&nbsp;<br />
        SPI1_SetSpeed(SPI_BaudRatePrescaler_8);&nbsp;//spi速度为9Mhz(24L01的最大SPI时钟为10Mhz)&nbsp;&nbsp;&nbsp;<br />
        sta=NRF24L01_Read_Reg(STATUS);&nbsp;&nbsp;//读取状态寄存器的值&nbsp;&nbsp;&nbsp;&nbsp;        &nbsp;<br />
        NRF24L01_Write_Reg(WRITE_REG_NRF+STATUS,sta);&nbsp;//清除TX_DS或MAX_RT中断标志<br />
        if(sta&amp;RX_OK)//接收到数据<br />
        {<br />
                NRF24L01_Read_Buf(RD_RX_PLOAD,rxbuf,RX_PLOAD_WIDTH);//读取数据<br />
                NRF24L01_Write_Reg(FLUSH_RX,0xff);//清除RX&nbsp;FIFO寄存器&nbsp;<br />
                return&nbsp;0;&nbsp;<br />
        }        &nbsp;&nbsp;&nbsp;<br />
        return&nbsp;1;//没收到任何数据<br />
}                                        &nbsp;&nbsp;&nbsp;&nbsp;<br />
//该函数初始化NRF24L01到RX模式<br />
//设置RX地址,写RX数据宽度,选择RF频道,波特率和LNA&nbsp;HCURR<br />
//当CE变高后,即进入RX模式,并可以接收数据了                &nbsp;&nbsp;&nbsp;<br />
void&nbsp;NRF24L01_RX_Mode(void)<br />
{<br />
        NRF24L01_CE=0;        &nbsp;&nbsp;<br />
&nbsp;&nbsp;        NRF24L01_Write_Buf(WRITE_REG_NRF+RX_ADDR_P0,(u8*)RX_ADDRESS,RX_ADR_WIDTH);//写RX节点地址<br />
        &nbsp;&nbsp;<br />
&nbsp;&nbsp;        NRF24L01_Write_Reg(WRITE_REG_NRF+EN_AA,0x01);&nbsp;&nbsp;&nbsp;&nbsp;//使能通道0的自动应答&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;        NRF24L01_Write_Reg(WRITE_REG_NRF+EN_RXADDR,0x01);//使能通道0的接收地址&nbsp;&nbsp;        &nbsp;<br />
&nbsp;&nbsp;        NRF24L01_Write_Reg(WRITE_REG_NRF+RF_CH,40);        &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//设置RF通信频率                &nbsp;&nbsp;<br />
&nbsp;&nbsp;        NRF24L01_Write_Reg(WRITE_REG_NRF+RX_PW_P0,RX_PLOAD_WIDTH);//选择通道0的有效数据宽度&nbsp;        &nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;        NRF24L01_Write_Reg(WRITE_REG_NRF+RF_SETUP,0x0f);//设置TX发射参数,0db增益,2Mbps,低噪声增益开启&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;        NRF24L01_Write_Reg(WRITE_REG_NRF+CONFIG,&nbsp;0x0f);//配置基本工作模式的参数WR_UP,EN_CRC,16BIT_CRC,接收模式&nbsp;<br />
&nbsp;&nbsp;        NRF24L01_CE&nbsp;=&nbsp;1;&nbsp;//CE为高,进入接收模式&nbsp;<br />
}                                                &nbsp;<br />
//该函数初始化NRF24L01到TX模式<br />
//设置TX地址,写TX数据宽度,设置RX自动应答的地址,填充TX发送数据,选择RF频道,波特率和LNA&nbsp;HCURR<br />
//PWR_UP,CRC使能<br />
//当CE变高后,即进入RX模式,并可以接收数据了                &nbsp;&nbsp;&nbsp;<br />
//CE为高大于10us,则启动发送.        &nbsp;<br />
void&nbsp;NRF24L01_TX_Mode(void)<br />
{                                                                                                                &nbsp;<br />
        NRF24L01_CE=0;        &nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;        NRF24L01_Write_Buf(WRITE_REG_NRF+TX_ADDR,(u8*)TX_ADDRESS,TX_ADR_WIDTH);//写TX节点地址&nbsp;<br />
&nbsp;&nbsp;        NRF24L01_Write_Buf(WRITE_REG_NRF+RX_ADDR_P0,(u8*)RX_ADDRESS,RX_ADR_WIDTH);&nbsp;//设置TX节点地址,主要为了使能ACK        &nbsp;&nbsp;<br />
<br />
&nbsp;&nbsp;        NRF24L01_Write_Reg(WRITE_REG_NRF+EN_AA,0x01);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//使能通道0的自动应答&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;        NRF24L01_Write_Reg(WRITE_REG_NRF+EN_RXADDR,0x01);&nbsp;//使能通道0的接收地址&nbsp;&nbsp;<br />
&nbsp;&nbsp;        NRF24L01_Write_Reg(WRITE_REG_NRF+SETUP_RETR,0x1a);//设置自动重发间隔时间:500us&nbsp;+&nbsp;86us;最大自动重发次数:10次<br />
&nbsp;&nbsp;        NRF24L01_Write_Reg(WRITE_REG_NRF+RF_CH,40);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//设置RF通道为40<br />
&nbsp;&nbsp;        NRF24L01_Write_Reg(WRITE_REG_NRF+RF_SETUP,0x0f);&nbsp;&nbsp;//设置TX发射参数,0db增益,2Mbps,低噪声增益开启&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;        NRF24L01_Write_Reg(WRITE_REG_NRF+CONFIG,0x0e);&nbsp;&nbsp;&nbsp;&nbsp;//配置基本工作模式的参数WR_UP,EN_CRC,16BIT_CRC,接收模式,开启所有中断<br />
        NRF24L01_CE=1;//CE为高,10us后启动发送<br />
}                &nbsp;&nbsp;<br />
<br />
</p>
<p><br />
&nbsp;</p>
<p><br />
&nbsp;</p>
<p>主函数<br />
&nbsp;int&nbsp;main(void)<br />
&nbsp;{        &nbsp;<br />
        u8&nbsp;key,mode;<br />
        u16&nbsp;t=0;                        &nbsp;<br />
        u8&nbsp;tmp_buf[33];                &nbsp;&nbsp;&nbsp;&nbsp;<br />
        delay_init();        &nbsp;&nbsp;&nbsp;&nbsp;        &nbsp;//延时函数初始化        &nbsp;&nbsp;<br />
        NVIC_Configuration();&nbsp;        &nbsp;//设置NVIC中断分组2:2位抢占优先级,2位响应优先级<br />
        uart_init(9600);        &nbsp;        //串口初始化为9600<br />
&nbsp;        LED_Init();                        &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//LED端口初始化<br />
        LCD_Config();<br />
        LCD_Init();<br />
        LCD_Clear();<br />
        KEY_Init();        &nbsp;//按键初始化        <br />
&nbsp;<br />
&nbsp;        NRF24L01_Init();&nbsp;&nbsp;&nbsp;&nbsp;        //初始化NRF24L01&nbsp;<br />
<br />
        <br />
        LCD_ShowStr(10,0,(unsigned&nbsp;char*)"NRF24L01&nbsp;TEST",0);        <br />
        LCD_ShowStr(10,1,(unsigned&nbsp;char*)"2013/8/22",0);                &nbsp;&nbsp;<br />
&nbsp;        while(NRF24L01_Check())        //检查NRF24L01是否在位.        <br />
        {<br />
                LCD_ShowStr(10,2,(unsigned&nbsp;char*)"NRF24L01&nbsp;Error",0);<br />
<br />
                LED0=!LED0;<br />
                delay_ms(200);<br />
        }                                                                &nbsp;&nbsp;&nbsp;<br />
        LCD_ShowStr(10,2,(unsigned&nbsp;char*)"NRF24L01&nbsp;OK",0);<br />
&nbsp;        while(1)//在该部分确定进入哪个模式!<br />
        {<br />
                key=KEY_Scan(0);<br />
                if(key==1)<br />
                {<br />
                        mode=0;&nbsp;&nbsp;&nbsp;<br />
                        break;<br />
                }else&nbsp;if(key==2)<br />
                {<br />
                        mode=1;<br />
                        break;<br />
                }<br />
                t++;<br />
                if(t==100)LCD_ShowStr(10,3,(unsigned&nbsp;char*)"KEY0:RX_Mode&nbsp;&nbsp;KEY1:TX_Mode",0);&nbsp;//闪烁显示提示信息<br />
//&nbsp;                if(t==200)<br />
//                {        <br />
//                        LCD_Fill(10,150,230,150+16,WHITE);<br />
//                        t=0;&nbsp;<br />
//                }<br />
                delay_ms(5);        &nbsp;&nbsp;<br />
        }&nbsp;&nbsp;&nbsp;<br />
//&nbsp;        LCD_Fill(10,150,240,166,WHITE);//清空上面的显示                &nbsp;&nbsp;<br />
//&nbsp;        POINT_COLOR=BLUE;//设置字体为蓝色        &nbsp;&nbsp;&nbsp;<br />
        if(mode==0)//RX模式<br />
        {<br />
                LCD_ShowStr(10,4,(unsigned&nbsp;char*)"NRF24L01&nbsp;RX_Mode",0);        <br />
                LCD_ShowStr(10,5,(unsigned&nbsp;char*)"Received&nbsp;DATA:",0);        <br />
                NRF24L01_RX_Mode();                &nbsp;&nbsp;<br />
                while(1)<br />
                {        &nbsp;&nbsp;                &nbsp;&nbsp;&nbsp;&nbsp;                &nbsp;&nbsp;&nbsp;&nbsp;                                &nbsp;<br />
                        if(NRF24L01_RxPacket(tmp_buf)==0)//一旦接收到信息,则显示出来.<br />
                        {<br />
                                tmp_buf[32]=0;//加入字符串结束符<br />
                                LCD_ShowStr(50,5,(unsigned&nbsp;char*)tmp_buf,0);&nbsp;&nbsp;&nbsp;&nbsp;<br />
                        }else&nbsp;delay_us(100);        &nbsp;&nbsp;&nbsp;<br />
                        t++;<br />
                        if(t==10000)//大约1s钟改变一次状态<br />
                        {<br />
                                t=0;<br />
                                LED0=!LED0;<br />
                        }&nbsp;                                &nbsp;&nbsp;&nbsp;&nbsp;<br />
                };        <br />
        }else//TX模式<br />
        {                                                        &nbsp;&nbsp;&nbsp;&nbsp;<br />
                LCD_ShowStr(10,4,(unsigned&nbsp;char*)"NRF24L01&nbsp;TX_Mode",0);        <br />
                NRF24L01_TX_Mode();<br />
                mode='&nbsp;';//从空格键开始&nbsp;&nbsp;<br />
                while(1)<br />
                {        &nbsp;&nbsp;                &nbsp;&nbsp;&nbsp;                                &nbsp;<br />
                        if(NRF24L01_TxPacket(tmp_buf)==TX_OK)<br />
                        {<br />
                                LCD_ShowStr(10,5,(unsigned&nbsp;char*)"Sended&nbsp;DATA:",0);        <br />
                                LCD_ShowStr(50,5,(unsigned&nbsp;char*)tmp_buf,0);&nbsp;<br />
                                key=mode;<br />
                                for(t=0;t&lt;32;t++)<br />
                                {<br />
                                        key++;<br />
                                        if(key&gt;('~'))key='&nbsp;';<br />
                                        tmp_buf[t]=key;        <br />
                                }<br />
                                mode++;&nbsp;<br />
                                if(mode&gt;'~')mode='&nbsp;';&nbsp;&nbsp;        &nbsp;&nbsp;<br />
                                tmp_buf[32]=0;//加入结束符                &nbsp;&nbsp;&nbsp;<br />
                        }else<br />
                        {                                                                                &nbsp;&nbsp;&nbsp;        <br />
&nbsp;                                LCD_ShowStr(10,5,(unsigned&nbsp;char*)"Send&nbsp;Failed&nbsp;",0);&nbsp;                        &nbsp;&nbsp;&nbsp;<br />
                        };<br />
                        LED0=!LED0;<br />
                        delay_ms(1500);                                &nbsp;&nbsp;&nbsp;&nbsp;<br />
                };<br />
        }&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
}<br />
<br />
<br />
JTAG仿真过得,但是一直徘徊在这个函数里NRF24L01_Check()),就是检测不到24L01,麻烦大家帮忙看看哈,谢谢
                                         
                                                                            </p>
回复 支持 反对

使用道具 举报

1

主题

13

帖子

0

精华

新手上路

积分
37
金钱
37
注册时间
2013-8-23
在线时间
0 小时
 楼主| 发表于 2013-8-23 14:30:52 | 显示全部楼层
回复【3楼】Admin:
<br>---------------------------------
<br>贴出来啦,麻烦看下哈
回复 支持 反对

使用道具 举报

1

主题

13

帖子

0

精华

新手上路

积分
37
金钱
37
注册时间
2013-8-23
在线时间
0 小时
 楼主| 发表于 2013-8-23 15:44:27 | 显示全部楼层
希望知道解决方案的大哥们积极帮小弟解答呀
回复 支持 反对

使用道具 举报

1

主题

13

帖子

0

精华

新手上路

积分
37
金钱
37
注册时间
2013-8-23
在线时间
0 小时
 楼主| 发表于 2013-8-23 15:44:49 | 显示全部楼层
自己顶一个~!
回复 支持 反对

使用道具 举报

1

主题

13

帖子

0

精华

新手上路

积分
37
金钱
37
注册时间
2013-8-23
在线时间
0 小时
 楼主| 发表于 2013-8-24 10:02:52 | 显示全部楼层
求高手们指导&nbsp;啊
回复 支持 反对

使用道具 举报

1

主题

13

帖子

0

精华

新手上路

积分
37
金钱
37
注册时间
2013-8-23
在线时间
0 小时
 楼主| 发表于 2013-8-24 10:45:24 | 显示全部楼层
大伙们,这和我使用的是NRF24L01+有关吗?我查了下手册好像NRF24L01和NRF24L01+是一样的
回复 支持 反对

使用道具 举报

1

主题

13

帖子

0

精华

新手上路

积分
37
金钱
37
注册时间
2013-8-23
在线时间
0 小时
 楼主| 发表于 2013-8-27 13:57:29 | 显示全部楼层
今天终于把东西调好了,可能是模块的问题
回复 支持 反对

使用道具 举报

12

主题

41

帖子

0

精华

初级会员

Rank: 2

积分
120
金钱
120
注册时间
2013-10-24
在线时间
4 小时
发表于 2015-3-18 11:31:48 | 显示全部楼层
回复【11楼】长寿:
<br>---------------------------------
<br>我也调了两天了,还是检测不到。。。请问是怎么调出来的,是修改了程序还是换了模块,不过我的无线模块好像是正常的,因为原子的程序下进去可以检测到
回复 支持 反对

使用道具 举报

13

主题

60

帖子

0

精华

初级会员

Rank: 2

积分
172
金钱
172
注册时间
2015-3-4
在线时间
14 小时
发表于 2015-5-30 19:02:16 | 显示全部楼层
我和你的问题一模一样,长须也是一样!!!!!!!!!!!!!
回复 支持 反对

使用道具 举报

13

主题

60

帖子

0

精华

初级会员

Rank: 2

积分
172
金钱
172
注册时间
2015-3-4
在线时间
14 小时
发表于 2015-5-30 19:02:32 | 显示全部楼层
程序都一样!!!!!!!!!!!!!!!!!!!!!!!
回复 支持 反对

使用道具 举报

12

主题

32

帖子

0

精华

初级会员

Rank: 2

积分
112
金钱
112
注册时间
2014-10-24
在线时间
4 小时
发表于 2015-6-11 14:13:53 | 显示全部楼层
回复【14楼】lwhqbd:
<br>---------------------------------
<br>是不是用自己的板子,跳线连接的模块?
回复 支持 反对

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2024-11-23 12:43

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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