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