请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
器件型号: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。 我不明白为什么。 有人能帮我吗? 我可以在这里获取更多信息。