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

[复制链接]
 楼主| libre01 发表于 2016-8-17 08:31 | 显示全部楼层 |阅读模式
本帖最后由 libre01 于 2016-8-17 08:33 编辑


为什么从STATUS返回的状态值为0x06,代表没有发射成功吗?大侠指导

本帖子中包含更多资源

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

×
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传输应该没有什么问题,还望不吝指导

本帖子中包含更多资源

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

×
ningling_21 发表于 2016-8-17 11:05 | 显示全部楼层
libre01 发表于 2016-8-17 10:43
用的是硬件SPI,单从时序图上看,SPI传输应该没有什么问题,还望不吝指导
...

要实现什么功能?
 楼主| libre01 发表于 2016-8-17 11:11 | 显示全部楼层
ningling_21 发表于 2016-8-17 11:05
要实现什么功能?

循环发送数据出去,
主函数中用while(1)循环不停地将TX_Buf数组中的数据不停地通过NRF24L01发送出去,NRF24L01不开启自动应答和自动重复发送功能
 楼主| libre01 发表于 2016-8-17 14:09 | 显示全部楼层
帖子不能沉啊,大神们,帮忙指导指导
ningling_21 发表于 2016-8-17 17:24 | 显示全部楼层
libre01 发表于 2016-8-17 11:11
循环发送数据出去,
主函数中用while(1)循环不停地将TX_Buf数组中的数据不停地通过NRF24L01发送出去,NRF ...

接收状态下的状态寄存器应该是0X0E才对
 楼主| libre01 发表于 2016-8-17 20:51 来自手机 | 显示全部楼层
我这个是发送程序,按道理说STATUS寄存器第六位在发送成功后会置1
 楼主| libre01 发表于 2016-8-17 21:39 来自手机 | 显示全部楼层
ningling_21 发表于 2016-8-17 17:24
接收状态下的状态寄存器应该是0X0E才对

如果接受不到应该是0e,可是是06,所以很奇怪,会不会是硬件SPI读的时候有问题?还有第一个1C应该是没有意义的吧!硬件SPI就是个数据寄存器既然写正常,读应该就不会有问题
 楼主| libre01 发表于 2016-8-18 08:25 | 显示全部楼层
程序

本帖子中包含更多资源

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

×
 楼主| libre01 发表于 2016-8-18 08:27 | 显示全部楼层
程序

本帖子中包含更多资源

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

×
ningling_21 发表于 2016-8-18 08:51 | 显示全部楼层
  1. void receive_mode_init(void)
  2. {
  3.         CE=0;
  4.           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

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


这个代码可以参考一下
初始化为接收模式?
ningling_21 发表于 2016-8-18 08:52 | 显示全部楼层
  1. uchar SPI_RW(uchar byte)
  2. {
  3.         uchar bit_ctr;
  4.            for(bit_ctr=0;bit_ctr<8;bit_ctr++)   // output 8-bit
  5.            {
  6.                    MOSI = (byte & 0x80);         // output 'byte', MSB to MOSI
  7.                    byte = (byte << 1);           // shift next bit into MSB..
  8.                    SCK = 1;                      // Set SCK high..
  9.                 MISO=1;
  10.                    byte |= MISO;                         // capture current MISO bit
  11.                    SCK = 0;                              // ..then set SCK low again
  12.            }
  13.     return(byte);                             // return read byte
  14. }
  15. /**************************************************/

  16. /**************************************************
  17. Function: SPI_RW_Reg();

  18. Description:
  19.   Writes value 'value' to register 'reg'
  20. /**************************************************/
  21. uchar SPI_RW_Reg(BYTE reg, BYTE value)
  22. {
  23.         uchar status;
  24.           CSN = 0;                   // CSN low, init SPI transaction
  25.           status = SPI_RW(reg);      // select register
  26.           SPI_RW(value);             // ..and write value to it..
  27.           CSN = 1;                   // CSN high again
  28.           return(status);            // return nRF24L01 status byte
  29. }
  30. /**************************************************/

  31. /**************************************************
  32. Function: SPI_Read();

  33. Description:
  34.   Read one byte from nRF24L01 register, 'reg'
  35. /**************************************************/
  36. BYTE SPI_Read(BYTE reg)
  37. {
  38.         BYTE reg_val;
  39.           CSN = 0;                // CSN low, initialize SPI communication...
  40.           SPI_RW(reg);            // Select register to read from..
  41.           reg_val = SPI_RW(0);    // ..then read registervalue
  42.           CSN = 1;                // CSN high, terminate SPI communication
  43.           return(reg_val);        // return register value
  44. }

  45. 参考一下
 楼主| libre01 发表于 2016-8-18 10:11 | 显示全部楼层
ningling_21 发表于 2016-8-18 08:51
这个代码可以参考一下
初始化为接收模式?

STATUS还是返回值还是0x06
 楼主| libre01 发表于 2016-8-18 10:12 | 显示全部楼层

检测IRQ也没有低电平产生
ningling_21 发表于 2016-8-18 10:33 | 显示全部楼层
libre01 发表于 2016-8-18 10:11
STATUS还是返回值还是0x06

模块初始化为接收还是发送模式?
看看你初始化的模式和读出的数据是否一致
 楼主| libre01 发表于 2016-8-18 10:48 | 显示全部楼层
ningling_21 发表于 2016-8-18 10:33
模块初始化为接收还是发送模式?
看看你初始化的模式和读出的数据是否一致
...

我是初始化的是发送,写进去的和读出来的不一致
ningling_21 发表于 2016-8-18 10:50 | 显示全部楼层
libre01 发表于 2016-8-18 10:48
我是初始化的是发送,写进去的和读出来的不一致

那是SPI通信的问题,先解决这个问题
 楼主| libre01 发表于 2016-8-18 10:58 | 显示全部楼层
ningling_21 发表于 2016-8-18 10:50
那是SPI通信的问题,先解决这个问题

我先用模拟SPI的试下,现在用的是硬件SPI
 楼主| libre01 发表于 2016-8-18 11:55 | 显示全部楼层
ningling_21 发表于 2016-8-18 10:50
那是SPI通信的问题,先解决这个问题

模拟SPI可以正常读到MISO数据,为什么硬件SPI不可以呢
您需要登录后才可以回帖 登录 | 注册

本版积分规则

28

主题

179

帖子

4

粉丝
快速回复 在线客服 返回列表 返回顶部