This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

[参考译文] CC2500:使用 CC2500 在 MSP430F5529 和 Arduino Mega2560 之间进行通信 — 同步问题

Guru**** 2502205 points
Other Parts Discussed in Thread: CC2500

请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/wireless-connectivity/other-wireless-group/other-wireless/f/other-wireless-technologies-forum/1540532/cc2500-communication-between-msp430f5529-and-arduino-mega2560-using-cc2500---synchronization-problem

部件号:CC2500


工具/软件:

大家好、我目前正在开发一个程序、以便在 MSP430 和 Arduino 之间进行通信。现在、我面临同步问题、我需要同步 Arduino 和 MSP 之间的通信。

当我尝试在 Arduino 中从 TX 模式切换到 Rx 模式、并在 MSP430 中从 Rx 切换到 TX 时、我似乎无法通信、我认为这是由于同步问题、因为当我尝试仅执行其中一种模式 (RX 或 TX) 而不是在 Arduino 和 mps430 可以通信的模式之间切换我认为这是由于 Arduino 正在与池使用的事实,所以如果同步字失败它将重复任何一种方式,并触发 GDO 中断和 MSP 最终将读取缓冲区(在 Arduino (TX) 和 MSP (RX) 的情况下)。

在这里我有两个代码,以缩短代码我将只包括更重要的部分:

Arduino

  /* ARDUINO CODE - NOTE: the wakeUp routine dosent do nothing */
 while (1)
 { 
  digitalWrite(4, HIGH);
  sendPacketINT(buffer_tx, 5);
  delay(500);

  attachInterrupt(2, wakeUp, FALLING);

  LowPower.powerDown(SLEEP_FOREVER, ADC_OFF, BOD_OFF); 
  detachInterrupt(2);

  digitalWrite(4, LOW);

  SendStrobe(CC2500_SIDLE);
  SendStrobe(CC2500_SFTX);
  SendStrobe(CC2500_SFRX);
  
  // RX
  SendStrobe(CC2500_SRX);
  delay(500);

  attachInterrupt(2, wakeUp, FALLING);

  LowPower.powerDown(SLEEP_FOREVER, ADC_OFF, BOD_OFF); 
  detachInterrupt(2);

  //while(digitalRead(GDO0));

  listenForPacket(buffer_rx, 5);

  if (buffer_rx[4] == length)
  {
    digitalWrite(4, HIGH);
  }
}


MSP

// GDO init: P2.0 - reg 0x02 | val 0x06
  P2DIR &= ~BIT0;       // input
  P2REN |= BIT0;        // enable pull up/pull down resistor
  P2OUT |= BIT0;        // use as pull up resistor
  P2IES |= BIT0;        // interrupt edge (H -> L)
  P2IFG &= ~BIT0;
  P2IE &= ~BIT0;

  while (1)
  {
    // LER
    
    P2IFG &= ~BIT0;
    P2IE |= BIT0;

    sendStrobe(CC2500_SRX);

    __bis_SR_register(GIE + LPM0_bits);

    for (int i = 0; i < 5; i++)
    {
      buffer_rx[i] = CC2500_read_register(CC2500_RXFIFO);
    }
    
    if (length == buffer_rx[4])
    {
      P1OUT |= BIT0;
      received = 1;
    }
    
    sendStrobe(CC2500_SIDLE);

    // Flush RX FIFO
    sendStrobe(CC2500_SFRX);
    
    for (int i = 0; i < 5; i++)
    {
      write(*(point_tx + i),CC2500_TXFIFO);
    }
    
    // Transmitter mode
    sendStrobe(CC2500_STX);
    __delay_cycles(500000); // 500 ms

    // reativar interrupt gdo e escrever tudo no TXFIFO
    P2IFG &= ~BIT0;
    P2IE |= BIT0;

    __bis_SR_register(GIE + LPM0_bits);

    // go back to rx mode and flush TX FIFO

    sendStrobe(CC2500_SIDLE);
    //__delay_cycles(100);


    sendStrobe(CC2500_SFTX);

    P1OUT &= ~BIT0;


系统方框图:


目标是让 Arduino 发送一条消息、然后由 MSP430 发送另一条消息。

我已经尝试使用延迟的 Arduino,但发现相当快,它不高效,也许使用计时器的两个?

非常感谢您的帮助、感谢您抽出宝贵的时间!

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好:

    您能提供您系统的方框图吗?

    如果我理解正确、您有两个系统、每个系统都有一个 控制器+ CC2500、如下所示:

    1. MSP + CC2500(为简单起见,我将其称为 MSP)
    2. Arduino + CC2500(为了简化,我将其称为 Ard)

    我建议您测试从 RX 转换到 TX 时的延迟、并确保另一个器件的 RX 时间在更长的时间内保持开启状态。
    例如、序列可能如下所示:

    1. MSP 在时间 t_rxStart 从 TX 切换到 RX、并在 t_rxStay 内保持此方式
    2. ARD 在时间 t_txStart 时从 RX 切换到 TX、其中 t_rxStart + txDelta < t_txStart < t_rxStart + t_rxStay

    我建议在 MSP 和 Ard 上添加 GPIO 切换以指示每个 TX 和 RX 的开始位置(即每个控制器上有 2 个 GPIO、一个用于 TX 活动、一个用于 RX 活动)。

    谢谢、
    Toby

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好、Toby、

    我更新了带有方框图的帖子、使其在视觉上更 易于理解!

    根据您的建议、我有一个问题、现在 模块之间的距离很短、但如果 距离会增加、这些延迟很可能必须调整正确?

    Im 将尝试您的建议、 尝试找出 TX 和 RX 模式何时开始并从那里开始。

    我会 回到你,非常感谢你的帮助和时间!

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    你好 Toby 我现在能够接收和发送两个微控制器之间,但由于某种原因 MSP 被卡在接收器中,无法再接收,我需要重置 Arduino 为它开始再次接收任何线索?

    以下是更新的代码:

    Arduino

    void loop() 
    {
      delay(500);
      
      digitalWrite(5, HIGH);
    
      digitalWrite(4, HIGH);
      sendPacketINT(buffer_tx, 5);
    
      attachInterrupt(2, wakeUp, FALLING);
    
      LowPower.powerDown(SLEEP_FOREVER, ADC_OFF, BOD_OFF); 
      detachInterrupt(2);
    
      digitalWrite(4, LOW);
    
      SendStrobe(CC2500_SIDLE);
      SendStrobe(CC2500_SFTX);
      
    
      // RX
      SendStrobe(CC2500_SRX);
      digitalWrite(5, LOW);
    
      attachInterrupt(2, wakeUp, FALLING);
    
      LowPower.powerDown(SLEEP_FOREVER, ADC_OFF, BOD_OFF); 
      detachInterrupt(2);
    
      while(digitalRead(GDO0));
    
      listenForPacket(buffer_rx, 5);
    
      if (buffer_rx[4] == length)
      {
        digitalWrite(4, HIGH);
      }
      
      SendStrobe(CC2500_SFRX);
      delay(2000); // consegui 5 mensagens seguidas
    }


    MSP:

      while (1)
      {
        // LER
        P2IFG &= ~BIT0;
        P2IE |= BIT0;
        
        sendStrobe(CC2500_SRX);
        __delay_cycles(1000);
        P1OUT &= ~BIT5;
    
        __bis_SR_register(GIE + LPM0_bits);
    
        P1OUT |= BIT5;
    
        for (int i = 0; i < 5; i++)
        {
          buffer_rx[i] = CC2500_read_register(CC2500_RXFIFO);
        }
    
        if (length == buffer_rx[4])
        {
          P1OUT |= BIT0;
          received = 1;
        }
    
        sendStrobe(CC2500_SIDLE);
    
        // Flush RX FIFO
        sendStrobe(CC2500_SFRX);
        
        for (int i = 0; i < 5; i++)
        {
          write(*(point_tx + i),CC2500_TXFIFO);
        }
        
        __delay_cycles(500000); // 500 ms
        // Transmitter mode
        sendStrobe(CC2500_STX);
        P1OUT &= ~BIT5;
    
        // reativar interrupt gdo e escrever tudo no TXFIFO
        P2IFG &= ~BIT0;
        P2IE |= BIT0;
    
        __bis_SR_register(GIE + LPM0_bits);
    
        // go back to rx mode and flush TX FIFO
    
        sendStrobe(CC2500_SIDLE);
    
        sendStrobe(CC2500_SFTX);
        __delay_cycles(1000);
    
        P1OUT &= ~BIT0;


    感谢您的时间和帮助!

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好 Jos é、

    很高兴听到您系统上的事情正在进展! 感谢您分享方框图。

    对于您观察到的新问题、是否在已知的时间间隔内发生? 例如、它是否总是在 X 个数据包之后发生? 或 X 时间?

    MSP 卡在接收器中、无法再接收、我需要重置 Arduino、以便它重新开始接收

    这是一个很好的线索。 似乎可能发生的情况是 MSP 卡在接收状态、因为它启动了特定的 RX 而不是及时接收 Ard TX。 然后、当您重置 Ard TX 时、MSP 再次开始接收数据包、因为 MSP 现在可以确定处于 RX 中及时接收 Ard TX。

    我建议改用时序间隔、因为可能还需要考虑一些额外的时序变化。

    按照您的建议、我有一个问题、现在 模块之间的距离很短、但如果 距离会增加、这些延迟很可能必须正确调整?

    是的,这是很好的直觉。 由于 TX 功率降低(平方反比)、该距离通常对时序有影响。 距离越远、还可能引入更多的噪声源、从而影响无线信号。 通常建议进行范围测试以验证工作距离。

    谢谢、
    Toby

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    你好、Toby、我最终在 MSP 端切换了 CC2500、它开始工作... MSP 侧的 GDO 针脚损坏了 、这确实是一个硬件问题!

    感谢您发送编修。