[其他] CC1100E程序卡在中断里了,求大神帮忙,搞掂私人发红包

[复制链接]
4647|34
 楼主| 加油吧威基基 发表于 2020-1-24 13:50 来自手机 | 显示全部楼层
gaoyang9992006 发表于 2020-1-24 13:35
现象描述】:在单机发送中,要求该机发送完成后转入接收状态,等待接收。不管有没有接收到语音数据,若发送 ...

好的,谢谢哥指点,我晚上再试试,今天过节回一下老家,晚上回去搞搞试试看,祝您新春快乐。
gaoyang9992006 发表于 2020-1-24 15:12 | 显示全部楼层
加油吧威基基 发表于 2020-1-24 13:50
好的,谢谢哥指点,我晚上再试试,今天过节回一下老家,晚上回去搞搞试试看,祝您新春快乐。 ...

嗯嗯,不要串门走亲戚,最近周边都封村了。
 楼主| 加油吧威基基 发表于 2020-1-24 19:41 | 显示全部楼层
gaoyang9992006 发表于 2020-1-24 15:12
嗯嗯,不要串门走亲戚,最近周边都封村了。

好的哥
 楼主| 加油吧威基基 发表于 2020-1-24 21:51 | 显示全部楼层
gaoyang9992006 发表于 2020-1-24 13:35
现象描述】:在单机发送中,要求该机发送完成后转入接收状态,等待接收。不管有没有接收到语音数据,若发送 ...

大哥,这个问题还是没有解决到,我发一下代码你看看。

下面的代码不往FIFO里面写数据直接进入发射模式是没有问题的,是有发射的。
void CC1100E_Init()
{
    Spi_Init();           //数据线初始化
    Delay_nmss(5);
   //SI=0;
    CSIN=0;
   SCLK11=0;
   CSIN=1;
   
    Delay_nmss(10);               
    CC1100E_POWER_UP_RESET();//上电复位CC1100
        Delay_nmss(10);
    CC1100E_WriteRfSettings();//配置CC1100的寄存器
        Delay_nmss(10);
        Spi_Strobe(CCxxx0_SIDLE);
        Delay_nmss(10);
        Spi_WriteBurstReg(CCxxx0_PATABLE,PaTabel,8);  //SPI写寄存器功率配置
        Delay_nmss(10);
         Spi_Strobe(CCxxx0_SRX);
         Delay_nmss(10);
         Spi_Strobe(CCxxx0_SIDLE);//退出接收和TX和睡眠状态,只有晶体运作
         Spi_Strobe(CCxxx0_STX);//进入发射模式
}


下面这个代码是往FIFO里面写数据的.是没有发射,但while (GDO0);这个确通过了。就是没有发射。
void CC1100E_SendPacket(uchar *txBuffer, uchar size)
{
    Spi_Strobe(CCxxx0_SIDLE);           //退出RX/TX模式关闭频率合成器并退出无线唤醒模式
        Delay_nmss(1);
    Spi_WriteBurstReg(CCxxx0_TXFIFO, txBuffer, size);
        Delay_nmss(1);
    Spi_Strobe(CCxxx0_STX); //进入发送模式发送数据
        Delay_nmss(1);
    // Wait for GDO0 to be set -> sync transmitted        等待GDO0设置->同步传输
    while (!GDO0);
    // Wait for GDO0 to be cleared -> end of packet           等待GDO0设置->同步发送等待GDO0清除->数据包结束
     while (GDO0);
   //  Spi_Strobe(CCxxx0_SFTX);
        Delay_nmss(1);
}

void CC1100E_Init()
{
    Spi_Init();           //数据线初始化
    Delay_nmss(5);
   //SI=0;
    CSIN=0;
   SCLK11=0;
   CSIN=1;
   
    Delay_nmss(10);               
    CC1100E_POWER_UP_RESET();//上电复位CC1100
        Delay_nmss(10);
    CC1100E_WriteRfSettings();//配置CC1100的寄存器
        Delay_nmss(10);
        Spi_Strobe(CCxxx0_SIDLE);
        Delay_nmss(10);
        Spi_WriteBurstReg(CCxxx0_PATABLE,PaTabel,8);  //SPI写寄存器
        Delay_nmss(10);
         Spi_Strobe(CCxxx0_SRX);
         Delay_nmss(10);
         Spi_Strobe(CCxxx0_SIDLE);//退出接收和TX和睡眠状态,只有晶体运作
         CC1100E_SendPacket(SendBuff,8);//往FIFO写数据加发送

}       
gaoyang9992006 发表于 2020-1-25 12:44 | 显示全部楼层
  1. void halRfSendPacket(uint8 *txBuffer, uint8 size)

  2. {
  3. halSpiStrobe(CCxxx0_SIDLE);
  4. //首先执行SIDLE滤波命令强制芯片进入空闲状态,
  5. //wwt delayms_rf(2);
  6. //发送数据后延迟一会,等待数据全部发送出去
  7. halSpiStrobe(CCxxx0_SFTX); //清空TX FIFO缓冲区内容。
  8. halSpiWriteReg(CCxxx0_TXFIFO, size); //写入缓冲地址、发送的数据个数
  9. halSpiWriteBurstReg(CCxxx0_TXFIFO, txBuffer, size); //写入缓冲地址、发送的数据
  10. //MARCSTATE_Flag=halSpiReadReg(CCxxx0_MARCSTA TE);//测试,读状态机状态
  11. //while(MARCSTA TE_Flag==0x01);//=0x01(IDLE模式),判断是否退出IDLE模式,附加P2IE &= ~BIT6; //_DINT();//禁止中断//P2.3禁止中断
  12. halSpiStrobe(CCxxx0_STX); //进入发送模式,发送数据
  13. //由于模式寄存器已配置,发送结束后会继续保持在接收模式下
  14. //发送不使用中断信号GDO0,接收使用中断信号GDO0
  15. while (!GDO0);// Wait for GDO0 to be set -> sync transmitted
  16. while (GDO0); // Wait for GDO0 to be cleared -> end of packet
  17. P2IFG&=~BIT6;//软件清零GDO0,发送数据不产生中断
  18. P2IE |= BIT6;//使能总中断_EINT(); //P2.3允许中断
  19. delayms_rf(2);//发送数据后延迟一会,等待数据全部发送出去
  20. halSpiStrobe(CCxxx0_SIDLE);//首先执行SIDLE滤波命令强制芯片进入空闲状态,//wwt halSpiStrobe(CCxxx0_SRX); //再次进入接收状态

  21. }

  22. //***************************************************************************** ************

  23. //函数名:uint8 halRfReceivePacket(uint8 *rxBuffer, uint8 *length)

  24. //输入:

  25. //输出:0:错误

  26. // 1:正确

  27. // 功能描述:接收数据包

  28. // 当需要接收数据时, 首先将CC1100配置成接收状态,

  29. // 一旦收到符合要求的数据, CC1100就会把收到的数据存入接收FIFO ,

  30. // 同时引脚GDO0 会有一个脉冲出现, 这个脉冲可以用来通知

  31. // MCU 有一个数据包已被CC1100 收到, MCU 就可以通过SPI口将CC1100 收到的数据取出来。

  32. // GDO0_____|-----|______

  33. //***************************************************************************** ************

  34. uint8 halRfReceivePacket(uint8 *rxBuffer, uint8 length)

  35. {

  36. uint8 status[2];

  37. uint8 packetLength = 0;

  38. delayms_rf(2);//发送数据后延迟一会,等待数据全部发送出去

  39. if((halSpiReadStatus(CCxxx0_RXBYTES) & BYTES_IN_RXFIFO)) //如果接的字节数不为0(先读RXBYTES状态寄存器,再&0x7F)

  40. {

  41. packetLength = halSpiReadReg(CCxxx0_RXFIFO);//读出第一个字节,此字节为该帧数据长度

  42. if (packetLength <= length) //如果帧数据长度小于等于用户设置的长度

  43. {

  44. halSpiReadBurstReg(CCxxx0_RXFIFO, rxBuffer, packetLength); //读出所有接收到的数据

  45. length = packetLength; //把接收数据长度的修改为当前数据的长度

  46. // Read the 2 appended status bytes (status[0] = RSSI, status[1] = LQI)

  47. halSpiReadBurstReg(CCxxx0_RXFIFO, status, 2);//读出CRC校验位

  48. //RSSI_dec1=status[0];

  49. halSpiStrobe(CCxxx0_SFRX); //清洗接收缓冲区

  50. halSpiStrobe(CCxxx0_SRX); //再次进入接收状态

  51. RF_Length=length;//wwt

  52. return (status[1] & CRC_OK);//如果校验成功返回接收成功

  53. }

  54. else

  55. {

  56. length = packetLength;

  57. halSpiStrobe(CCxxx0_SFRX); //清洗接收缓冲区

  58. halSpiStrobe(CCxxx0_SRX); //再次进入接收状态

  59. return 0;

  60. }

  61. }

  62. else

  63. {

  64. halSpiStrobe(CCxxx0_SFRX); //清洗接收缓冲区

  65. halSpiStrobe(CCxxx0_SRX); //再次进入接收状态

  66. return 0;

  67. }

  68. }
gaoyang9992006 发表于 2020-1-25 12:44 | 显示全部楼层
给你参考一下代码。
IDLE后紧接着用STX试试看。
 楼主| 加油吧威基基 发表于 2020-1-25 18:33 来自手机 | 显示全部楼层
gaoyang9992006 发表于 2020-1-25 12:44
给你参考一下代码。
IDLE后紧接着用STX试试看。

好的,谢谢哥,一会我测试一下,看看结果怎样。
cooldog123pp 发表于 2020-1-26 12:05 | 显示全部楼层
打个断点,看看停在哪里,没有开中断,你停在中断,那你把中断入口函数注释掉,看看是不是正常。
forrest11 发表于 2020-2-1 16:54 | 显示全部楼层
加油吧威基基 发表于 2020-1-24 21:51
大哥,这个问题还是没有解决到,我发一下代码你看看。

下面的代码不往FIFO里面写数据直接进入发射模式是 ...

volatile GDO0;
wushiye54 发表于 2020-4-17 13:18 | 显示全部楼层
加油吧威基基 发表于 2020-1-21 23:26
论坛回复太慢,能否留个联系方式?现在也放假了,我也不想打扰你愉快的假期,你有空旧回复一下,最好留个 ...

解决了没?没解决的话可以加我QQ2417976350我帮你看一下
 楼主| 加油吧威基基 发表于 2020-4-28 17:48 | 显示全部楼层
wushiye54 发表于 2020-4-17 13:18
解决了没?没解决的话可以加我QQ2417976350我帮你看一下

没有尼,哥,我直接换另外一只IC了,已经量产,哥,谢谢您。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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