CCALM 发表于 2013-5-22 13:31:12

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

本帖最后由 CCALM 于 2013-5-22 17:15 编辑

下面是发送时序图:
1

2

3


接收时序图:
1

2

3


下面是发送程序主函数:int main()
{
        char a,b;
       
        GPIO_INIT();           //GPIO初始化               
        SPI1_INIT();                //SPI初始化
        NRF24L01_INIT();        //NRF初始化
                       
        while(1)
        {
                GPIO_SetBits(GPIOC ,GPIO_Pin_8);                       ////LED
                SetTX_Mode();   //设置为发送模式
                NRF_TxPacket(TxBuf,32);
                a=NRF_Read_Reg(STATUS);
//                b=NRF_Read_Reg(FIFO_STATUS);
                if(a==0x2e)                       
                GPIO_WriteBit(GPIOC,GPIO_Pin_6,0);                //检查并发送数据,发送完LED亮
                else GPIO_WriteBit(GPIOC,GPIO_Pin_6,1);
                if(!(GPIOC->IDR & GPIO_Pin_11))NRF_IRQ();                                  //

                GPIO_WriteBit(GPIOC,GPIO_Pin_7,NRF24L01_Check());               //LED显示NRF存在
                d();
                GPIO_ResetBits(GPIOC,GPIO_Pin_8);
                d();       
        }       
}接收程序主函数:int main()
{
        int i;
        char a,b;
        GPIO_INIT();
        USART_Config();
        SPI1_INIT();
        NRF_INIT();       

        GPIO_WriteBit(GPIOD,GPIO_Pin_6,0);

        while(1)
        {
               
                GPIO_SetBits(GPIOD,GPIO_Pin_5);
                SetRX_Mode();
                               
                if(NRF_RxPacket(RxBuf,32))       
                {                               
                        GPIO_WriteBit(GPIOD,GPIO_Pin_6,1);                               
                   for(i=0;i<32;i++)
                        USART1_Putc(RxBuf);
                }               
                else
                {        a=NRF_Read_Reg(STATUS);
                        b=NRF_Read_Reg(FIFO_STATUS);
                        GPIO_WriteBit(GPIOD,GPIO_Pin_6,0);
                        USART1_Putc(a);
                        USART1_Putc(b);
                }               

                if(!(GPIOC->IDR & GPIO_Pin_11))NRF_IRQ();
               
                GPIO_WriteBit(GPIOD,GPIO_Pin_7,NRF_Check());               
                d();
                GPIO_ResetBits(GPIOD,GPIO_Pin_5);
                d();                                       
        }       
}SPI设置:void SPI1_INIT(void)
{       
        GPIO_InitTypeDef GPIO_InitStructure;
        SPI_InitTypeDef SPI_InitStructure;

        RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
        RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC, ENABLE);
        RCC_APB2PeriphClockCmd(RCC_APB2Periph_SPI1|RCC_APB2Periph_AFIO, ENABLE);
       


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

        GPIO_InitStructure.GPIO_Pin = GPIO_Pin_4;                //CSN
        GPIO_InitStructure.GPIO_Speed = GPIO_Speed_10MHz;
        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
        GPIO_Init(GPIOA, &GPIO_InitStructure);       
        /*配置SPI_NRF_SPI的IRQ引脚,*/
        GPIO_InitStructure.GPIO_Pin = GPIO_Pin_11;
        GPIO_InitStructure.GPIO_Speed = GPIO_Speed_10MHz;
        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU ; //上拉输入
        GPIO_Init(GPIOC, &GPIO_InitStructure);
       
//        CSN_H();
        SPI_I2S_DeInit(SPI1);                        
    SPI_Cmd(SPI1, DISABLE); //必须先禁用,才能改变MODE
        SPI_InitStructure.SPI_Direction = SPI_Direction_2Lines_FullDuplex; //双线全双工
        SPI_InitStructure.SPI_Mode = SPI_Mode_Master; //主模式
        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_64; //8分频,9MHz
        SPI_InitStructure.SPI_FirstBit = SPI_FirstBit_MSB; //高位在前
        SPI_InitStructure.SPI_CRCPolynomial = 7;

        SPI_Init(SPI1, &SPI_InitStructure);
        /* Enable SPI1 */
        SPI_Cmd(SPI1, ENABLE);

//SPI_ReadWriteByte(0xff);   //启动传输
}NRF初始化配置:
uint8_tTX_ADDRESS= {0xA1,0xA1,0xA1,0xA1,0xA0};        //本地地址
uint8_tRX_ADDRESS= {0xA1,0xA1,0xA1,0xA1,0xA0};        //接收地址
void NRF_INIT(void)
{

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

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

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

附上我的程序.







skype 发表于 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;
}

后面的就不用和说了吧!

CCALM 发表于 2013-5-25 23:37:48

skype 发表于 2013-5-23 09:18 static/image/common/back.gif
发送设置:
        //3 使能AUTO ACK
        nrf24_Writer_REG(WRITE_REG + EN_AA, 0);                                                                      // Enable Auto.Ack ...

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

woshisangao 发表于 2013-5-28 11:21:11

先把接收关掉,只开发送,用示波器看看IRQ引脚是否会出现低电平,如果有低电平出现说明发送没有问题,否则就是根本没往外发数据。个人调试理解,仅供参考

CCALM 发表于 2013-5-28 18:51:19

woshisangao 发表于 2013-5-28 11:21 static/image/common/back.gif
先把接收关掉,只开发送,用示波器看看IRQ引脚是否会出现低电平,如果有低电平出现说明发送没有问题,否则 ...

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

hongsuogui 发表于 2013-5-31 19:41:34

学习中..................
页: [1]
查看完整版本: 帮分析NRF24L01时序图,不知道哪里出问题了,通信不了