搜索
bottom↓
回复: 5

帮分析NRF24L01时序图,不知道哪里出问题了,通信不了

[复制链接]

出0入0汤圆

发表于 2013-5-22 13:31:12 | 显示全部楼层 |阅读模式
本帖最后由 CCALM 于 2013-5-22 17:15 编辑

下面是发送时序图:
1

2

3


接收时序图:
1

2

3


下面是发送程序主函数:
  1. int main()
  2. {
  3.         char a,b;
  4.        
  5.         GPIO_INIT();           //GPIO初始化               
  6.         SPI1_INIT();                //SPI初始化
  7.         NRF24L01_INIT();        //NRF初始化
  8.                        
  9.         while(1)
  10.         {
  11.                 GPIO_SetBits(GPIOC ,GPIO_Pin_8);                         ////LED
  12.                 SetTX_Mode();   //设置为发送模式
  13.                 NRF_TxPacket(TxBuf,32);
  14.                 a=NRF_Read_Reg(STATUS);
  15. //                b=NRF_Read_Reg(FIFO_STATUS);
  16.                 if(a==0x2e)                         
  17.                 GPIO_WriteBit(GPIOC,GPIO_Pin_6,0);                //检查并发送数据,发送完LED亮
  18.                 else GPIO_WriteBit(GPIOC,GPIO_Pin_6,1);
  19.                 if(!(GPIOC->IDR & GPIO_Pin_11))  NRF_IRQ();                                  //

  20.                 GPIO_WriteBit(GPIOC,GPIO_Pin_7,NRF24L01_Check());                 //LED显示NRF存在
  21.                 d();
  22.                 GPIO_ResetBits(GPIOC,GPIO_Pin_8);
  23.                 d();       
  24.         }       
  25. }
复制代码
接收程序主函数:
  1. int main()
  2. {
  3.         int i;
  4.         char a,b;
  5.         GPIO_INIT();
  6.         USART_Config();
  7.         SPI1_INIT();
  8.         NRF_INIT();       

  9.         GPIO_WriteBit(GPIOD,GPIO_Pin_6,0);

  10.         while(1)
  11.         {
  12.                
  13.                 GPIO_SetBits(GPIOD,GPIO_Pin_5);
  14.                 SetRX_Mode();
  15.                                
  16.                 if(NRF_RxPacket(RxBuf,32))       
  17.                 {                                 
  18.                         GPIO_WriteBit(GPIOD,GPIO_Pin_6,1);                               
  19.                    for(i=0;i<32;i++)
  20.                         USART1_Putc(RxBuf[i]);
  21.                 }               
  22.                 else
  23.                 {        a=NRF_Read_Reg(STATUS);
  24.                         b=NRF_Read_Reg(FIFO_STATUS);
  25.                         GPIO_WriteBit(GPIOD,GPIO_Pin_6,0);
  26.                         USART1_Putc(a);
  27.                         USART1_Putc(b);
  28.                 }               

  29.                 if(!(GPIOC->IDR & GPIO_Pin_11))  NRF_IRQ();
  30.                
  31.                 GPIO_WriteBit(GPIOD,GPIO_Pin_7,NRF_Check());               
  32.                 d();
  33.                 GPIO_ResetBits(GPIOD,GPIO_Pin_5);
  34.                 d();                                       
  35.         }       
  36. }
复制代码
SPI设置:
  1. void SPI1_INIT(void)
  2. {         
  3.         GPIO_InitTypeDef GPIO_InitStructure;
  4.         SPI_InitTypeDef SPI_InitStructure;

  5.         RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
  6.         RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC, ENABLE);
  7.         RCC_APB2PeriphClockCmd(RCC_APB2Periph_SPI1|RCC_APB2Periph_AFIO, ENABLE);
  8.        


  9.         /*配置 SPI_NRF_SPI的 SCK,MISO,MOSI引脚,GPIOA^5,GPIOA^6,GPIOA^7 */
  10.         GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5|GPIO_Pin_6|GPIO_Pin_7;
  11.         GPIO_InitStructure.GPIO_Speed = GPIO_Speed_10MHz;
  12.         GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; //复用功能
  13.         GPIO_Init(GPIOA, &GPIO_InitStructure);
  14.         /*配置SPI_NRF_SPI的CE引脚,和SPI_NRF_SPI的 CSN 引脚:*/
  15.         GPIO_InitStructure.GPIO_Pin = GPIO_Pin_12;                  //CE
  16.         GPIO_InitStructure.GPIO_Speed = GPIO_Speed_10MHz;
  17.         GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
  18.         GPIO_Init(GPIOC, &GPIO_InitStructure);

  19.         GPIO_InitStructure.GPIO_Pin = GPIO_Pin_4;                  //CSN
  20.         GPIO_InitStructure.GPIO_Speed = GPIO_Speed_10MHz;
  21.         GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
  22.         GPIO_Init(GPIOA, &GPIO_InitStructure);       
  23.         /*配置SPI_NRF_SPI的IRQ引脚,*/
  24.         GPIO_InitStructure.GPIO_Pin = GPIO_Pin_11;
  25.         GPIO_InitStructure.GPIO_Speed = GPIO_Speed_10MHz;
  26.         GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU ; //上拉输入
  27.         GPIO_Init(GPIOC, &GPIO_InitStructure);
  28.        
  29. //        CSN_H();
  30.         SPI_I2S_DeInit(SPI1);                          
  31.     SPI_Cmd(SPI1, DISABLE); //必须先禁用,才能改变MODE
  32.         SPI_InitStructure.SPI_Direction = SPI_Direction_2Lines_FullDuplex; //双线全双工
  33.         SPI_InitStructure.SPI_Mode = SPI_Mode_Master; //主模式
  34.         SPI_InitStructure.SPI_DataSize = SPI_DataSize_8b; //数据大小8位
  35.         SPI_InitStructure.SPI_CPOL = SPI_CPOL_Low; //时钟极性,空闲时为低
  36.         SPI_InitStructure.SPI_CPHA = SPI_CPHA_1Edge; //第1个边沿有效,上升沿为采样时刻
  37.         SPI_InitStructure.SPI_NSS = SPI_NSS_Soft; //NSS信号由软件产生
  38.         SPI_InitStructure.SPI_BaudRatePrescaler = SPI_BaudRatePrescaler_64; //8分频,9MHz
  39.         SPI_InitStructure.SPI_FirstBit = SPI_FirstBit_MSB; //高位在前
  40.         SPI_InitStructure.SPI_CRCPolynomial = 7;

  41.         SPI_Init(SPI1, &SPI_InitStructure);
  42.         /* Enable SPI1 */
  43.         SPI_Cmd(SPI1, ENABLE);

  44. //  SPI_ReadWriteByte(0xff);   //启动传输
  45. }
复制代码
NRF初始化配置:

  1. uint8_t  TX_ADDRESS[TX_ADR_WIDTH]= {0xA1,0xA1,0xA1,0xA1,0xA0};        //本地地址
  2. uint8_t  RX_ADDRESS[RX_ADR_WIDTH]= {0xA1,0xA1,0xA1,0xA1,0xA0};        //接收地址
  3. void NRF_INIT(void)
  4. {

  5.         CE_L();
  6.         NRF_Write_Buf(NRF_WRITE_REG+RX_ADDR_P0,RX_ADDRESS,RX_ADR_WIDTH);//写RX节点地址
  7.         NRF_Write_Buf(NRF_WRITE_REG+TX_ADDR,TX_ADDRESS,TX_ADR_WIDTH); //写TX节点地址  
  8.         NRF_Write_Reg(NRF_WRITE_REG+EN_AA,0x01); //使能通道0的自动应答
  9.         NRF_Write_Reg(NRF_WRITE_REG+EN_RXADDR,0x01);//使能通道0的接收地址
  10.         NRF_Write_Reg(NRF_WRITE_REG+SETUP_RETR,0x1a);//设置自动重发间隔时间:500us + 86us;最大自动重发次数:10次
  11.         NRF_Write_Reg(NRF_WRITE_REG+RF_CH,40); //设置RF通道为CHANAL
  12.         NRF_Write_Reg(NRF_WRITE_REG+RX_PW_P0,RX_PLOAD_WIDTH);//选择通道0的有效数据宽度
  13.         NRF_Write_Reg(NRF_WRITE_REG+RF_SETUP,0x07); //设置TX发射参数,0db增益,2Mbps,低噪声增益开启

  14.         NRF_Write_Reg(NRF_WRITE_REG + CONFIG, 0x0f);                    // IRQ收发完成中断响应,16位CRC,主发送
  15.        
  16.         CE_H();
  17. }
复制代码
单片机能检测带NRF24L01的存在.
接收程序读取STATUS的值是0X0E,FIFOSTATUS的值是0X11; 接收数据全是0.
发送程序读取STATUS的值有时是0x2e,有时不是.

结果通信不了,不知道是发送问题还是接收问题,还是硬件问题.
纠缠了数天,前途一片黑暗.最近崩溃了.

附上我的程序.







本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x

阿莫论坛20周年了!感谢大家的支持与爱护!!

月入3000的是反美的。收入3万是亲美的。收入30万是移民美国的。收入300万是取得绿卡后回国,教唆那些3000来反美的!

出0入8汤圆

发表于 2013-5-23 09:18:25 | 显示全部楼层
发送设置:
        //3 使能AUTO ACK
        nrf24_Writer_REG(WRITE_REG + EN_AA, 0);                                                                      // Enable Auto.Ack:Pipe0
        //4 使能PIPE0
        nrf24_Writer_REG(WRITE_REG + EN_RXADDR, 0);                                                                  // Enable Pipe0
        //5 配置自动重发次数
        nrf24_Writer_REG(WRITE_REG + SETUP_RETR, 0);                                                                 // 500us + 86us, 10 retrans...1a(0xff发射超时最大70MS,发射最小只要1MS)
并确认每次都可以发送成功,发送间隔时间1s一次就可以了。OK后通电让发送端一直工作,下面就可以调试接收端了:


接收设置:
        //3 使能AUTO ACK
        nrf24_Writer_REG(WRITE_REG + EN_AA, 0);                                                                      // Enable Auto.Ack:Pipe0
        //4 使能PIPE0
        nrf24_Writer_REG(WRITE_REG + EN_RXADDR, 0x01);                                                                  // Enable Pipe0

这样就可以了,接收方就可以进入接收模式去接收数据了,你可以先读出REG 0x07 / REG 0x17的值后再处理。


int8_t Get_RF_Status(void)
{
        uint8_t status;
        int8_t ret;
        status = nrf24_Read_REG(STATUS);
        if (status & 0x10)
        {//数据多次重发,无ACK
                nrf24_Writer_REG(FLUSH_TX, 0);
                nrf24_Writer_REG(FLUSH_RX, 0);
                ret = -1;
        }
        else if (status & 0x20)
        {//发送成功
                ret = 0;
        }
        else if (status & 0x40)
        {//收到数据
                ret = 1;
        }
        status = nrf24_Read_REG(STATUS);
        nrf24_Writer_REG(WRITE_REG + STATUS, status);  
        return ret;
}

后面的就不用和说了吧!

出0入0汤圆

 楼主| 发表于 2013-5-25 23:37:48 | 显示全部楼层
skype 发表于 2013-5-23 09:18
发送设置:
        //3 使能AUTO ACK
        nrf24_Writer_REG(WRITE_REG + EN_AA, 0);                                                                      // Enable Auto.Ack ...

我都试过了,但是都接收不了

出0入0汤圆

发表于 2013-5-28 11:21:11 | 显示全部楼层
先把接收关掉,只开发送,用示波器看看IRQ引脚是否会出现低电平,如果有低电平出现说明发送没有问题,否则就是根本没往外发数据。个人调试理解,仅供参考

出0入0汤圆

 楼主| 发表于 2013-5-28 18:51:19 | 显示全部楼层
woshisangao 发表于 2013-5-28 11:21
先把接收关掉,只开发送,用示波器看看IRQ引脚是否会出现低电平,如果有低电平出现说明发送没有问题,否则 ...

谢谢,现在可能怀疑是硬件问题,因为板子是我自己画的,可以下程序,可以流水灯,不知道是芯片问题还是电路问题了.

出0入0汤圆

发表于 2013-5-31 19:41:34 | 显示全部楼层
学习中..................
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-4-27 07:13

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

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