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.

[参考译文] TMS320F28388D:什么可能会导致 FSI 通信中引线侧的 Ping 帧标签读取不正确?

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

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/1518883/tms320f28388d-what-could-cause-an-incorrect-reading-of-the-ping-frame-tag-on-the-lead-side-in-an-fsi-communication

器件型号:TMS320F28388D

工具/软件:

static void FSI_handshakeLead()
{
//        static HandshakeState state = HANDSHAKE_PHASE_INIT;
        static uint16_t retryCount = 0;

        switch(state)
        {
            case HANDSHAKE_PHASE_INIT:
                h[0]++;
                retryCount = 0;
                fsiComDesc.fsiRxTimeOutCntr = fsiRxTimeOutCntrVal1;
                state = HANDSHAKE_PHASE_PING0_SEND;
                break;

            case HANDSHAKE_PHASE_PING0_SEND:
                h[1]++;
                FSI_executeTxFlushSequence((uint32_t)FSI_TXA_ADDR, fsiComDesc.fsiBitRate);
                FSI_setTxFrameTag((uint32_t)FSI_TXA_ADDR, FSI_FRAME_TAG0);
                FSI_setTxFrameType((uint32_t)FSI_TXA_ADDR, FSI_FRAME_TYPE_PING);
                FSI_startTxTransmit((uint32_t)FSI_TXA_ADDR);
                state = HANDSHAKE_PHASE_PING0_WAIT;
                break;

            case HANDSHAKE_PHASE_PING0_WAIT:
                if (fsiComDesc.fsiRxInt1Received == FSI_TRx_DONE) {
                    h[2]++;
                    checkReceivedFrameTypeTag(FSI_FRAME_TYPE_PING, FSI_FRAME_TAG0);
                    if (fsiComDesc.fsiError == 0) {
                        h[3]++;
                        fsiComDesc.fsiRxTimeOutCntr = fsiRxTimeOutCntrVal2;
                        fsiComDesc.fsiRxInt1Received = FSI_TRx_IDLE;
                        state = HANDSHAKE_PHASE_PING1_SEND;
                        break;
                    }
                    fsiComDesc.fsiError = 0;
                } else if (fsiComDesc.fsiRxTimeOutCntr-- == 0) {
                    if (++retryCount >= FSI_HANDSHAKE_REPETITION) {
//                        fsiComDesc.fsiHandShakeState = FSI_HANDSHAKE_FAILURE;
                        state = HANDSHAKE_FAIL;
                    } else {
                        fsiComDesc.fsiRxTimeOutCntr = fsiRxTimeOutCntrVal1;
                        state = HANDSHAKE_PHASE_PING0_SEND;
                    }
                }
                break;
            case HANDSHAKE_PHASE_PING1_SEND:
                h[4]++;

                FSI_setTxFrameTag((uint32_t)FSI_TXA_ADDR, FSI_FRAME_TAG1);
                FSI_setTxFrameType((uint32_t)FSI_TXA_ADDR, FSI_FRAME_TYPE_PING);
                FSI_startTxTransmit((uint32_t)FSI_TXA_ADDR);
                state = HANDSHAKE_PHASE_PING1_WAIT;
                break;

            case HANDSHAKE_PHASE_PING1_WAIT:
                if (fsiComDesc.fsiRxInt1Received == FSI_TRx_DONE) {
                    h[5]++;
                    checkReceivedFrameTypeTag(FSI_FRAME_TYPE_PING, FSI_FRAME_TAG1);
                    if (fsiComDesc.fsiError == 0) {
                        h[6]++;
                        fsiComDesc.fsiHandShakeState = FSI_HANDSHAKE_DONE;
                        state = HANDSHAKE_DONE;
                    } else {
                        fsiComDesc.fsiError = 0;
                        h[7]++;
                    }
                    fsiComDesc.fsiRxInt1Received = FSI_TRx_IDLE;
                } else if (fsiComDesc.fsiRxTimeOutCntr-- == 0) {
                    if (++retryCount >= FSI_HANDSHAKE_REPETITION) {
//                        fsiComDesc.fsiHandShakeState = FSI_HANDSHAKE_FAILURE;
                        state = HANDSHAKE_FAIL;
                    } else {
                        fsiComDesc.fsiRxTimeOutCntr = fsiRxTimeOutCntrVal1;
                        state = HANDSHAKE_PHASE_PING1_SEND;
                    }
                }
                break;

            case HANDSHAKE_DONE:
                h[8]++;
                break;
            case HANDSHAKE_FAIL:
                EALLOW;
                AdcaRegs.ADCINTSEL1N2.bit.INT1E = 1;
                EDIS;
                fsiComDesc.fsiFsmState = FSI_COMMUNICATION_ERROR;
                DIAG_SetAlarm(ALR_FSI_HANDSHAKE_FAILURE);
                fsiComDesc.fsiHandShakeState = FSI_HANDSHAKE_FAILURE;
                state = HANDSHAKE_PHASE_INIT;  // reset and try again next time
                break;
        }
    }

/* Slave side handshake routine for synchronization */
static void FSI_handshakeNode()
{
//        static HandshakeState state = HANDSHAKE_PHASE_INIT;
        static uint16_t retryCount = 0;

        switch(state)
        {
            case HANDSHAKE_PHASE_INIT:
                h[0]++;
                retryCount = 0;
                fsiComDesc.fsiRxTimeOutCntr = fsiRxTimeOutCntrVal1;
                state = HANDSHAKE_PHASE_PING0_WAIT;
                break;

            case HANDSHAKE_PHASE_PING0_WAIT:
                if (fsiComDesc.fsiRxInt1Received == FSI_TRx_DONE) {
                    h[1]++;
                    checkReceivedFrameTypeTag(FSI_FRAME_TYPE_PING, FSI_FRAME_TAG0);
                    if (fsiComDesc.fsiError == 0) {
                        h[2]++;
                        fsiComDesc.fsiRxTimeOutCntr = fsiRxTimeOutCntrVal2;
                        fsiComDesc.fsiRxInt1Received = FSI_TRx_IDLE;
                        state = HANDSHAKE_PHASE_PING0_SEND;
                        break;
                    }
                    fsiComDesc.fsiError = 0;
                    fsiComDesc.fsiRxInt1Received = FSI_TRx_IDLE;
                } else if (fsiComDesc.fsiRxTimeOutCntr-- == 0) {
                    if (++retryCount >= FSI_HANDSHAKE_REPETITION) {
//                        fsiComDesc.fsiHandShakeState = FSI_HANDSHAKE_FAILURE;
                        state = HANDSHAKE_FAIL;
                    } else {
                        fsiComDesc.fsiRxTimeOutCntr = fsiRxTimeOutCntrVal1;
                    }
                }
                break;

            case HANDSHAKE_PHASE_PING0_SEND:
                h[3]++;
                FSI_executeTxFlushSequence((uint32_t)FSI_TXA_ADDR, fsiComDesc.fsiBitRate);
                FSI_setTxFrameTag((uint32_t)FSI_TXA_ADDR, FSI_FRAME_TAG0);
                FSI_setTxFrameType((uint32_t)FSI_TXA_ADDR, FSI_FRAME_TYPE_PING);

                FSI_startTxTransmit((uint32_t)FSI_TXA_ADDR);
                state = HANDSHAKE_PHASE_PING1_WAIT;
                break;

            case HANDSHAKE_PHASE_PING1_WAIT:
                if (fsiComDesc.fsiRxInt1Received == FSI_TRx_DONE) {
                    h[4]++;
                    checkReceivedFrameTypeTag(FSI_FRAME_TYPE_PING, FSI_FRAME_TAG1);
                    if (fsiComDesc.fsiError == 0) {
                        h[5]++;
                        fsiComDesc.fsiRxInt1Received = FSI_TRx_IDLE;
                        state = HANDSHAKE_PHASE_PING1_SEND;
                        break;
                    }
                    fsiComDesc.fsiError = 0;
                    fsiComDesc.fsiRxInt1Received = FSI_TRx_IDLE;
                } else if (fsiComDesc.fsiRxTimeOutCntr-- == 0) {
                    if (++retryCount >= FSI_HANDSHAKE_REPETITION) {
//                        fsiComDesc.fsiHandShakeState = FSI_HANDSHAKE_FAILURE;
                        state = HANDSHAKE_FAIL;
                    } else {
                        fsiComDesc.fsiRxTimeOutCntr = fsiRxTimeOutCntrVal1;
                    }
                }
                break;

            case HANDSHAKE_PHASE_PING1_SEND:
                h[6]++;
//                FSI_executeTxFlushSequence((uint32_t)FSI_TXA_ADDR, fsiComDesc.fsiBitRate);
                FSI_setTxFrameTag((uint32_t)FSI_TXA_ADDR, FSI_FRAME_TAG1);
                FSI_setTxFrameType((uint32_t)FSI_TXA_ADDR, FSI_FRAME_TYPE_PING);

                FSI_startTxTransmit((uint32_t)FSI_TXA_ADDR);
                fsiComDesc.fsiHandShakeState = FSI_HANDSHAKE_DONE;
                break;
            case HANDSHAKE_FAIL:
                EALLOW;
                AdcaRegs.ADCINTSEL1N2.bit.INT1E = 1;
                EDIS;
                fsiComDesc.fsiFsmState = FSI_COMMUNICATION_ERROR;
                DIAG_SetAlarm(ALR_FSI_HANDSHAKE_FAILURE);
                fsiComDesc.fsiHandShakeState = FSI_HANDSHAKE_FAILURE;
                state = HANDSHAKE_PHASE_INIT;  // reset and try again next time
                break;
        }
}

我的系统包含两块板、这两块板通过 FSI 进行通信。 每一个系统都有一个实时系统、每1ms 执行一次任务。 我已经基于两个单独的状态机组织了握手过程。 我发现、从器件通过读取 Tag1完成该过程、而主器件读取 TAG15。 我不明白为什么。 有人能帮我吗?  我可以在这里获取更多信息。

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

    尊敬的 Davide:

    为了进行澄清、您说主器件的 TX_FRAME_TAG_UDATA 是 TAG15、但从器件在接收的传输中看到了一个 Tag1?

    谢谢您、

    Luke

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

    您可以检查 TAG_MASK 位字段吗? 这可能会影响接收到的标签值。

    谢谢您、

    Luke