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.

请教CC1101——包处理的问题

Other Parts Discussed in Thread: CC1101

    CC1101在快速接收两个数据包的处理方式?当接受到一个数据包之后,来一个中断,在中断处继续来着接受或者寄存器配置RX完会后继续保持为接受状态,当在读取第一个数据包的时候,还未读完数据,又来了一个数据包,假设两个包的长度不超过64字节,第二数据包会接着放在第一个数据之后存储,还是接在丢失?如果接在第一个数据包之后,那怎么保证完整的两个数据包读取出来,而不丢失报文。


  • 所以最好是在读取完数据之后在触发进入RX状态, 参考例子

    static uint8 rxRecvPacket(uint8* data, uint8* length)
    {
    uint8 packet_status[2];
    uint8 status;
    uint16 key;

    packetReceived = FALSE;
    status = RX_OK;

    // Set radio in RX mode
    halRfStrobe(CC1101_SRX);

    // Wait for incoming packet
    key = halIntLock();
    while(!packetReceived)
    {
    halMcuSetLowPowerMode(HAL_MCU_LPM_3);
    key = halIntLock();
    }
    halIntUnlock(key);

    // Read first element of packet from the RX FIFO
    status = halRfReadFifo(length, 1);

    if ((status & CC1101_STATUS_STATE_BM) == CC1101_STATE_RX_OVERFLOW)
    {
    halRfStrobe(CC1101_SIDLE);
    halRfStrobe(CC1101_SFRX);
    status = RX_FIFO_OVERFLOW;
    }
    else if (*length == 0 || *length > 61)
    {
    halRfStrobe(CC1101_SIDLE);
    halRfStrobe(CC1101_SFRX);
    status = RX_LENGTH_VIOLATION;
    }
    else
    {
    // Get payload
    halRfReadFifo(data, *length);

    // Get the packet status bytes [RSSI, LQI]
    halRfReadFifo(packet_status, 2);

    // Check CRC
    if ((packet_status[1] & CC1101_LQI_CRC_OK_BM) != CC1101_LQI_CRC_OK_BM)
    {
    status = RX_CRC_MISMATCH;
    }
    else
    {
    status = RX_OK;
    }
    }
    return(status);
    }

  • 当一个数据就在你一个数据包的时候,发过来,不就丢包了?怎么才能避免,只能读完再置为RX?

  • 其实可以通过发包的数据长度和data rate算出来一个包接收的时间,如果datarate够快,其实接收需要占用的时间实际上是很短的。

    从发送端来说,即使是连续发送,也是有时间间隔的,原理和接收端一样,发射一定长度的数据本来就会占用一段时间。

    从理论上来说,如果直接放到RX状态再去读FIFO,应该是读不出来的,因为触发SFRX状态会重新刷新RXFIFO。导致你的数据会直接被冲刷掉。

  • 已经在收一个包的时候,是不会去收第二个空中包的,收完一个包给GDOx脚中断,触发MCU来读,然后MCU再发命令控制

    你是要问如何防碰撞问题?