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.

[参考译文] CC1110-CC1111:从 RX 到 TX、传输完成标志未激活

Guru**** 2482225 points


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

https://e2e.ti.com/support/wireless-connectivity/sub-1-ghz-group/sub-1-ghz/f/sub-1-ghz-forum/1222353/cc1110-cc1111-from-rx-to-tx-transmission-done-flag-not-activated

器件型号:CC1110-CC1111

您好、专家!

向您寻求  有关客户的此 CC1110问题的帮助:

他们使用两个 CC1110来处理一个项目、并且需要一些帮助。 根据报告、当它们在未接收到数据包的情况下将射频从 RX 模式更改为 TX 模式时、传输完成标志不会激活(如果无线电接收到数据包、则不会发生这种情况)。

我们如何在不使用计时器的情况下解决该问题?

感谢您的支持。

此致、
阿奇·A·阿奇

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

    您好、Archie。

    客户是否仔细查看了数据表的图55 (无线电的状态机)?

    https://www.ti.com/lit/ds/symlink/cc1110-cc1111.pdf

    根据数据表的第219页、看起来他们必须配置附加参数才能控制状态机(MCSMx)的行为

    此致、

    Arthur

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

    谢谢、Arthur。

    但是 、这并没有解决问题。 它会显示"选择在接收到数据包时应该发生什么(下一个状态)"、问题是在没有接收到数据包时将状态从 RX 更改为 TX。

    我们相信、 如果收到数据包、我们能够从 TX 切换到 RX 或空闲、或者从 RX 切换到 TX 或空闲。

    客户确认问题是在没有接收到数据包时退出 RX 模式。

    此致、
    阿奇·A·阿奇

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

    Archie、

    发生这种情况时、客户是否可以再次检查对讲机在使用 MARCSTATE 寄存器时处于哪种状态?

    我们只需要确保它实际上处于 RX 中、而不是空闲等。

    此致、

    Arthur

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

    您好 Arthur、

    客户回应:

    我进行了检查、很显然、它进入 TX 状态、但标记未激活。 为了确保我没有完全错、下面是代码的一些部分:
    void sendFrame (uint8长度、uint8数据[]){  //长度是调用函数的代码的 sizeof (data)
     pktSentFlag = false;
     RadioPktBuffer[0]=长度;
     for (int i= 1;i< length;i++){
      RadioPtBuffer[i]= data[i];
     }
     dmaTX(); // TX 特定 DMA 配置
     
     //发送数据包
     DMAARM = DMAARM0;        // Arm DMA 通道0
     RFST = RFST_STX;         //将无线电切换到 TX
     while (((MARCSTATE 和 MARCSTATE_MARK_STATE)!= MARK_STATE_TX);
     while (!pktSentFlag);      //等待数据包的发送(RF_IRQ 中的标志置1)
     //P1_3 ^= 1;
     pktSentFlag = false;
     // printf ("已发送\n");
     MCSM1= MCSM1_TXOFF_MODE;
     //RFST= RFST_sidle;
    }
    Uint8 _xdata * getFrame (void){
     pktRcvdFlag = false;
     waitingPkt = true;
     dmaRx(); // RX 特定 DMA 配置
     DMAARM = DMAARM0;          // Arm DMA 通道0
     RFST = RFST_SRX;         //将无线电切换到 RX
     //MCSM1= MCSM1_RXOFF_MODE;
     
     while (!pktRcvdFlag 和 waitingPkt); //等待接收数据包(在 DMA_IRQ 中设置标志)
     if (!waitingPkt){
      //MCSM1= MCSM1_RXOFF_MODE;
      RFST= RFST_SIDLE;
      返回0;
     }
     if (pktRcvdFlag){
      pktRcvdFlag = false;
      //printf ("got\n");
      //RFST= RFST_sidle;
      MCSM1= MCSM1_RXOFF_MODE;
      返回 radioPktBuffer;
     }
     RFST= RFST_SIDLE;
     //MCSM1= MCSM1_RXOFF_MODE;
     //printf ("end\n");
     返回0;
    }
    此致、
    阿奇·A·阿奇
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    我不知道有关您如何配置 DMA 或如何配置无线电的任何信息、因此无法知道您的代码为什么不起作用。

    我制作了一个小示例、其中我在 RX 中等待接收到数据包、或者按下按钮以取消 RX。

    在接收到数据包或发生按钮按下操作后、我将发送一个数据包。

    代码按预期运行。

    我不确定是否所有清除中断标志、启用/禁用中断都是必要的、但至少你可以把一些有用的东西用作起点。

    BYTE __xdata rxBuffer[N + 3];
    BYTE __xdata txBuffer[N + 1];
    static UINT8  packetReceived = FALSE;
    static UINT8  packetSent = FALSE;UINT8  dummyFlag = FALSE;
    
    __xdata DMA_DESC dmaConfigRX;  // Struct for the DMA configuration
    __xdata DMA_DESC dmaConfigTX;  // Struct for the DMA configuration
    
    void main(void)
    {
        UINT16 i;
        
        // Choose the crystal oscillator as the system clock and set 
        // system clock speed = fRef (fxosc)
        CLKCON &= ~OSC_BIT;           // request switch to crystal oscillator
        while (CLKCON & OSC_BIT);     // wait until the clock switch has occured (=stable)
        SLEEP |= OSC_PD_BIT;          // power down unused oscillator
      
        P1DIR |= 0x02;
      
        /* Address Config = No address check */
        /* Base Frequency = 868.299866 */
        /* CRC Enable = true */
        /* Carrier Frequency = 868.299866 */
        /* Channel Number = 0 */
        /* Channel Spacing = 199.951172 */
        /* Data Rate = 38.3835 */
        /* Deviation = 20.629883 */
        /* Device Address = 0 */
        /* Manchester Enable = false */
        /* Modulated = true */
        /* Modulation Format = GFSK */
        /* PA Ramping = false */
        /* Packet Length = 255 */
        /* Packet Length Mode = Variable packet length mode. Packet length configured by the first byte after sync word */
        /* Preamble Count = 4 */
        /* RX Filter BW = 101.562500 */
        /* Sync Word Qualifier Mode = 30/32 sync word bits detected */
        /* TX Power = 0 */
        /* Whitening = false */
        PKTCTRL0   = 0x05;
        FSCTRL1    = 0x06;
        FREQ2      = 0x21;
        FREQ1      = 0x65;
        FREQ0      = 0x6A;
        MDMCFG4    = 0xCA;
        MDMCFG3    = 0x83;
        MDMCFG2    = 0x13;
        DEVIATN    = 0x35;
        MCSM0      = 0x18;
        FOCCFG     = 0x16;
        AGCCTRL2   = 0x43;
        FSCAL3     = 0xE9;
        FSCAL2     = 0x2A;
        FSCAL1     = 0x00;
        FSCAL0     = 0x1F;
        TEST1      = 0x31;
        TEST0      = 0x09;
        PA_TABLE0  = 0x50;
        IOCFG0     = 0x06;
        PKTLEN     = N;
      
        // Setup the DMA for RX
        SET_WORD(dmaConfigRX.SRCADDRH, dmaConfigRX.SRCADDRL, &X_RFD);
        SET_WORD(dmaConfigRX.DESTADDRH, dmaConfigRX.DESTADDRL, rxBuffer);
        dmaConfigRX.VLEN      = DMA_VLEN_FIRST_BYTE_P_3;
        SET_WORD(dmaConfigRX.LENH, dmaConfigRX.LENL, N + 1);
        dmaConfigRX.WORDSIZE  = DMA_WORDSIZE_BYTE;
        dmaConfigRX.TRIG      = DMA_TRIG_RADIO;
        dmaConfigRX.TMODE     = DMA_TMODE_SINGLE;
        dmaConfigRX.SRCINC    = DMA_SRCINC_0;
        dmaConfigRX.DESTINC   = DMA_DESTINC_1;
        dmaConfigRX.IRQMASK   = DMA_IRQMASK_ENABLE;
        dmaConfigRX.M8        = DMA_M8_USE_8_BITS;
        dmaConfigRX.PRIORITY  = DMA_PRI_HIGH;
        SET_WORD(DMA0CFGH, DMA0CFGL, &dmaConfigRX);
      
        // Setup the DMA for TX
        SET_WORD(dmaConfigTX.SRCADDRH, dmaConfigTX.SRCADDRL, txBuffer);
        SET_WORD(dmaConfigTX.DESTADDRH, dmaConfigTX.DESTADDRL, &X_RFD);
        dmaConfigTX.VLEN      = DMA_VLEN_FIRST_BYTE_P_1; 
        SET_WORD(dmaConfigTX.LENH, dmaConfigTX.LENL, N + 1);
        dmaConfigTX.WORDSIZE  = DMA_WORDSIZE_BYTE;
        dmaConfigTX.TRIG      = DMA_TRIG_RADIO;
        dmaConfigTX.TMODE     = DMA_TMODE_SINGLE;
        dmaConfigTX.SRCINC    = DMA_SRCINC_1;
        dmaConfigTX.DESTINC   = DMA_DESTINC_0;
        dmaConfigTX.IRQMASK   = DMA_IRQMASK_DISABLE;
        dmaConfigTX.M8        = DMA_M8_USE_8_BITS;
        dmaConfigTX.PRIORITY  = DMA_PRI_HIGH;
        SET_WORD(DMA1CFGH, DMA1CFGL, &dmaConfigTX);
      
        DMAIF = 0; 
        DMAIRQ &= ~DMAIF_0;
        S1CON &= ~RFIF_1_0;
        RFIF &= ~IRQ_DONE; 
        RFIM = IM_DONE;                                  
        INT_GLOBAL_ENABLE(INT_ON);
      
        txBuffer[0] = N;
        for (i = 1; i <= N; i++)
        {
            txBuffer[i] = i;
        }
    
        while (TRUE)
        {
            HAL_INT_ENABLE(INUM_DMA, INT_ON);
            DMAARM = DMAARM_CHANNEL0;     // Arm DMA channel 0
            RFST = STROBE_RX;             // Switch radio to RX
            
            while ((!packetReceived) & (P0_1 == 1));        // Wait for packet to be received (flag set in dma_IRQ) or button pushed
        
            if (packetReceived)
            {
                packetReceived = FALSE;  
            
                // Check CRC (check CRC bit in appended status byte)
                if ((rxBuffer[rxBuffer[0] + 2]) & 0x80)
                {
                    P1_1 = ~P1_1; // Toggle LED
                }
            }
            else
            {
                DMAARM = 0x81;              // Abort channel 0 
                RFST = STROBE_IDLE;         // Switch radio to RX
                halWait(250);               // button "debounce"
            }
            HAL_INT_ENABLE(INUM_DMA, INT_OFF);
        
            S1CON &= ~RFIF_1_0;     // Clear the CPU RFIF interrupt flag
            RFIF &= ~IRQ_DONE;      // Tx completed, clear the module interrupt flag
            HAL_INT_ENABLE(INUM_RF, INT_ON);
        
            DMAARM = DMAARM_CHANNEL1;   // Arm DMA channel 0
            RFST = STROBE_TX;           // Switch radio to TX
                    
            while (!packetSent);        // Wait for packet to be transmitted (flag set in rf_IRQ)
            packetSent = FALSE;
        
            HAL_INT_ENABLE(INUM_RF, INT_OFF);
        }
    }
    
    #pragma vector=DMA_VECTOR
    __interrupt void dma_IRQ(void) {
        DMAIF = 0;              // Clear the CPU DMA interrupt flag
        DMAIRQ &= ~DMAIF_0;     // DMA channel 0 module interrupt flag
        packetReceived = TRUE;
    }
    
    #pragma vector=RF_VECTOR
    __interrupt void rf_IRQ(void) {
      S1CON &= ~RFIF_1_0;     // Clear the CPU RFIF interrupt flag
      RFIF &= ~IRQ_DONE;      // Tx completed, clear the module interrupt flag
      packetSent = TRUE;
    }

    Siri.

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

    尊敬的 Siri:

    非常感谢! 这有所帮助。 问题主要是 DMA 配置。

    此致、
    阿奇·A·阿奇