打印
[STC单片机]

关于NRF24L01与STC12A5C单片机通讯(发射)问题

[复制链接]
1697|21
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
libre01|  楼主 | 2016-8-17 08:31 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
沙发
ningling_21| | 2016-8-17 08:44 | 只看该作者
初始化是怎么配置的?

使用特权

评论回复
评分
参与人数 1威望 +1 收起 理由
libre01 + 1 很给力!
板凳
libre01|  楼主 | 2016-8-17 10:43 | 只看该作者
ningling_21 发表于 2016-8-17 08:44
初始化是怎么配置的?

用的是硬件SPI,单从时序图上看,SPI传输应该没有什么问题,还望不吝指导

IMG_20160817_103007.jpg (386.92 KB )

IMG_20160817_103007.jpg

使用特权

评论回复
地板
ningling_21| | 2016-8-17 11:05 | 只看该作者
libre01 发表于 2016-8-17 10:43
用的是硬件SPI,单从时序图上看,SPI传输应该没有什么问题,还望不吝指导
...

要实现什么功能?

使用特权

评论回复
5
libre01|  楼主 | 2016-8-17 11:11 | 只看该作者
ningling_21 发表于 2016-8-17 11:05
要实现什么功能?

循环发送数据出去,
主函数中用while(1)循环不停地将TX_Buf数组中的数据不停地通过NRF24L01发送出去,NRF24L01不开启自动应答和自动重复发送功能

使用特权

评论回复
6
libre01|  楼主 | 2016-8-17 14:09 | 只看该作者
帖子不能沉啊,大神们,帮忙指导指导

使用特权

评论回复
7
ningling_21| | 2016-8-17 17:24 | 只看该作者
libre01 发表于 2016-8-17 11:11
循环发送数据出去,
主函数中用while(1)循环不停地将TX_Buf数组中的数据不停地通过NRF24L01发送出去,NRF ...

接收状态下的状态寄存器应该是0X0E才对

使用特权

评论回复
8
libre01|  楼主 | 2016-8-17 20:51 | 只看该作者
我这个是发送程序,按道理说STATUS寄存器第六位在发送成功后会置1

使用特权

评论回复
9
libre01|  楼主 | 2016-8-17 21:39 | 只看该作者
ningling_21 发表于 2016-8-17 17:24
接收状态下的状态寄存器应该是0X0E才对

如果接受不到应该是0e,可是是06,所以很奇怪,会不会是硬件SPI读的时候有问题?还有第一个1C应该是没有意义的吧!硬件SPI就是个数据寄存器既然写正常,读应该就不会有问题

使用特权

评论回复
10
libre01|  楼主 | 2016-8-18 08:25 | 只看该作者
程序

IMG_20160817_103034.jpg (426.34 KB )

IMG_20160817_103034.jpg

IMG_20160817_103107.jpg (342.87 KB )

IMG_20160817_103107.jpg

使用特权

评论回复
11
libre01|  楼主 | 2016-8-18 08:27 | 只看该作者
程序

IMG_20160817_103147.jpg (349.86 KB )

IMG_20160817_103147.jpg

IMG_20160817_103315.jpg (418.04 KB )

IMG_20160817_103315.jpg

使用特权

评论回复
12
ningling_21| | 2016-8-18 08:51 | 只看该作者
void receive_mode_init(void) 
{
        CE=0;
          SPI_Write_Buf(WRITE_REG + RX_ADDR_P0, RX_ADDRESS, TX_ADR_WIDTH); // Use the same address on the RX device as the TX device

          SPI_RW_Reg(WRITE_REG + EN_AA, 0x01);      // Enable Auto.Ack:Pipe0
          SPI_RW_Reg(WRITE_REG + EN_RXADDR, 0x01);  // Enable Pipe0
          SPI_RW_Reg(WRITE_REG + RF_CH, 40);        // Select RF channel 40
          SPI_RW_Reg(WRITE_REG + RX_PW_P0, TX_PLOAD_WIDTH); // Select same RX payload width as TX Payload width
          SPI_RW_Reg(WRITE_REG + RF_SETUP, 0x27);   // TX_PWR:0dBm, Datarate:2Mbps, LNA:HCURR
          SPI_RW_Reg(WRITE_REG + CONFIG, 0x0f);     // Set PWR_UP bit, enable CRC(2 bytes) & Prim:RX. RX_DR enabled..
    SPI_RW_Reg(WRITE_REG+STATUS,0xff); // 清除所有中断标志
          CE = 1; // Set CE pin high to enable RX device
}


这个代码可以参考一下
初始化为接收模式?

使用特权

评论回复
13
ningling_21| | 2016-8-18 08:52 | 只看该作者
uchar SPI_RW(uchar byte)
{
        uchar bit_ctr;
           for(bit_ctr=0;bit_ctr<8;bit_ctr++)   // output 8-bit
           {
                   MOSI = (byte & 0x80);         // output 'byte', MSB to MOSI
                   byte = (byte << 1);           // shift next bit into MSB..
                   SCK = 1;                      // Set SCK high..
                MISO=1;
                   byte |= MISO;                         // capture current MISO bit
                   SCK = 0;                              // ..then set SCK low again
           }
    return(byte);                             // return read byte
}
/**************************************************/

/**************************************************
Function: SPI_RW_Reg();

Description:
  Writes value 'value' to register 'reg'
/**************************************************/
uchar SPI_RW_Reg(BYTE reg, BYTE value)
{
        uchar status;
          CSN = 0;                   // CSN low, init SPI transaction
          status = SPI_RW(reg);      // select register
          SPI_RW(value);             // ..and write value to it..
          CSN = 1;                   // CSN high again
          return(status);            // return nRF24L01 status byte
}
/**************************************************/

/**************************************************
Function: SPI_Read();

Description:
  Read one byte from nRF24L01 register, 'reg'
/**************************************************/
BYTE SPI_Read(BYTE reg)
{
        BYTE reg_val;
          CSN = 0;                // CSN low, initialize SPI communication...
          SPI_RW(reg);            // Select register to read from..
          reg_val = SPI_RW(0);    // ..then read registervalue
          CSN = 1;                // CSN high, terminate SPI communication
          return(reg_val);        // return register value
}

参考一下

使用特权

评论回复
14
libre01|  楼主 | 2016-8-18 10:11 | 只看该作者
ningling_21 发表于 2016-8-18 08:51
这个代码可以参考一下
初始化为接收模式?

STATUS还是返回值还是0x06

使用特权

评论回复
15
libre01|  楼主 | 2016-8-18 10:12 | 只看该作者

检测IRQ也没有低电平产生

使用特权

评论回复
16
ningling_21| | 2016-8-18 10:33 | 只看该作者
libre01 发表于 2016-8-18 10:11
STATUS还是返回值还是0x06

模块初始化为接收还是发送模式?
看看你初始化的模式和读出的数据是否一致

使用特权

评论回复
17
libre01|  楼主 | 2016-8-18 10:48 | 只看该作者
ningling_21 发表于 2016-8-18 10:33
模块初始化为接收还是发送模式?
看看你初始化的模式和读出的数据是否一致
...

我是初始化的是发送,写进去的和读出来的不一致

使用特权

评论回复
18
ningling_21| | 2016-8-18 10:50 | 只看该作者
libre01 发表于 2016-8-18 10:48
我是初始化的是发送,写进去的和读出来的不一致

那是SPI通信的问题,先解决这个问题

使用特权

评论回复
19
libre01|  楼主 | 2016-8-18 10:58 | 只看该作者
ningling_21 发表于 2016-8-18 10:50
那是SPI通信的问题,先解决这个问题

我先用模拟SPI的试下,现在用的是硬件SPI

使用特权

评论回复
20
libre01|  楼主 | 2016-8-18 11:55 | 只看该作者
ningling_21 发表于 2016-8-18 10:50
那是SPI通信的问题,先解决这个问题

模拟SPI可以正常读到MISO数据,为什么硬件SPI不可以呢

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

28

主题

179

帖子

4

粉丝