OpenEdv-开源电子网

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

STM8S+24L01,一对一通讯不了

[复制链接]

6

主题

11

帖子

0

精华

初级会员

Rank: 2

积分
119
金钱
119
注册时间
2015-9-21
在线时间
19 小时
发表于 2016-8-29 10:41:14 | 显示全部楼层 |阅读模式
1金钱
本帖最后由 tangzhaowei 于 2016-8-29 14:48 编辑

//发送程序
void NRFSetTxMode(u8*TxDate)
{
        CE=0;
           NRFWriteTxDate(WRITE_REG+TX_ADDR,TxAddr,5);        //发送地址设置
        NRFWriteTxDate(WRITE_REG+RX_ADDR_P0,TxAddr,5);
        NRFWriteTxDate(W_TX_PAYLOAD,TxDate,4);  //写入数据
        
          NRFWriteReg(WRITE_REG+EN_AA,0x01);  //设置为0X00就能发送成功,返回0X2E
          NRFWriteReg(WRITE_REG+EN_RXADDR,0x01);  //使能接受通道0应答
          NRFWriteReg(WRITE_REG+SETUP_RETR,0x0a);  //自动重发设置
          NRFWriteReg(WRITE_REG+RF_CH,0x40);       //射频通道设置
          NRFWriteReg(WRITE_REG+RF_SETUP,0x07);   //传输设置速率
        NRFWriteReg(WRITE_REG+CONFIG,0x0e);      //上电,发射模式
        CE=1;
        delay_ms(100);        
}


u8 CheckACK()
{
        sta=NRFReadReg(STATUS);  
        UART1_sendchar(sta);        //打印状态值
        if(sta&0x30)            // STATUS寄存器的4、5位置1
        {
           NRFWriteReg(WRITE_REG+STATUS,0xff);  // 清除TX_DS或MAX_TR中断标志
           CSN=0;
           NRFSPI(FLUSH_TX);//清空FIFO
          CSN=1;
           return(0);
        }
        else
           return(1);
}
void main()
{
       unsigned char i=0;   
       gpio_init();
       Init_UART1();
        delay_ms(100);
        NRF24L01Int();  //初始化引脚
        delay_ms(10);   
       NRF24L01Int();

        while (1)
        {  

          NRFSetTxMode(TxDate);//发送数据
          while(CheckACK());        //检测是否发送完毕
        }
}

//接受程序

void NRFSetRXMode()
{
        CE=0;
          NRFWriteTxDate(WRITE_REG+RX_ADDR_P0,TxAddr,5);  //接受通道0使用
          NRFWriteReg(WRITE_REG+EN_AA,0x01);                    //使能通道0应答
          NRFWriteReg(WRITE_REG+EN_RXADDR,0x01);           //使能接受通道0
          NRFWriteReg(WRITE_REG+RF_CH,0x40);                  //选择射频通道
          NRFWriteReg(WRITE_REG+RX_PW_P0,4);                //通道的有效数据宽度
          NRFWriteReg(WRITE_REG+RF_SETUP,0x07);            //数据传输数率
        NRFWriteReg(WRITE_REG+CONFIG,0x0f);               //上电、接受模式
          CE = 1;
        delay_ms(10);   
}


void GetDate()                                 
{
     u8 i;
    sta=NRFReadReg(STATUS);
    if(sta%0x40)  //是否接受到数据               
     {
           CE=0;
           NRFReadRxDate(R_RX_PAYLOAD,rx_buf,4);  //读数据
           for(i=0;i<4;i++)
              UART1_sendchar(rx_buf);        //打印给串口
           NRFWriteReg(WRITE_REG+STATUS,0xff);  //清状态寄存器
           CSN=0;
           NRFSPI(FLUSH_RX);                    //清空FIFO
           CSN=1;                 
     }
}
void main()
{
        u8 i=0;  
        gpio_init();
        Init_UART1();
        delay_ms(100);
        NRF24L01Int();
        delay_ms(100);
        while (1)
        {     
          NRFSetRXMode();//设为接收模式
          GetDate();//接收数据
        }
}  
现象:1:2个模块写在某一寄存器写数据,再读出来是一样的(说明读写时序和24L01模块是好的,对吧?)
          2:2个模块都烧写发射程序,改这句 "NRFWriteReg(WRITE_REG+EN_AA,0x00); //不使能通道0应答”,改为0x00,取消自动应答后都能发射出去,状态值为0x2e.

问题:
        烧写上面的发射程序和接受程序“NRFWriteReg(WRITE_REG+EN_AA,0x01);”都使能自动应答,发射端:发射状态值1E,接受端:接受不到数据。请问我的代码有问题么?该怎么调试?我的方法没错吧?


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

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165309
金钱
165309
注册时间
2010-12-1
在线时间
2108 小时
发表于 2016-8-29 10:41:15 | 显示全部楼层
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2024-11-23 08:33

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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