📄 fesc_5554_spicomm.c
字号:
/******************************************/
/* @1 */
/* */
/******************************************/
void init_SBP_Buf(uint8_t brd_no)
{ SBP_Buf[brd_no].ssSPIStat = spistIdle;
SBP_Buf[brd_no].iInstrBufPos = 0;
SBP_Buf[brd_no].iTxBufPos = 0;
SBP_Buf[brd_no].isCurrentESC = 0;
SBP_Buf[brd_no].cTx = ESC;
SBP_Buf[brd_no].cRx = ESC;
SBP_Buf[brd_no].SBP_RTSTUS_OverTimeCnt = SPI_COMM_DEFAULT_SBP_RTSTUS_OverTime;
SBP_Buf[brd_no].iRxBufferLen = 0;
SBP_Buf[brd_no].isFinished = 1;
SBP_Buf[brd_no].returnStat = SBP_RTSTUS_UNKNOWN;
SBP_Buf[brd_no].feedback_verify = 0;
}
/**************************************************/
/* @1 */
/* outchar = SBP_Master_Parser(inchar); */
/* inchar = SPI_Swap(outchar); */
/**************************************************/
uint8_t SBP_Master_Parser(uint8_t brd_no,uint8_t cRx)
{
//SBP_RTSTUS_OverTime handle
SBP_Buf[brd_no].SBP_RTSTUS_OverTimeCnt--;
if(SBP_Buf[brd_no].SBP_RTSTUS_OverTimeCnt<4)
{ if(SBP_Buf[brd_no].SBP_RTSTUS_OverTimeCnt==0)
{
SBP_Buf[brd_no].returnStat = SBP_RTSTUS_OverTime;
SBP_Buf[brd_no].isFinished = 1;
}
return(ESC);
}
//feedback verification
if( (SBP_Buf[brd_no].feedback_verify == 1)
&&(cRx != SBP_Buf[brd_no].cTxLast))
{ SBP_Buf[brd_no].ssSPIStat = spistIdle;
SBP_Buf[brd_no].cTx = ESC;
SBP_Buf[brd_no].returnStat = SBP_RTSTUS_FEEDBACK_ERROR;
SBP_Buf[brd_no].isFinished = 1;
return(ESC);
}
SBP_Buf[brd_no].cTxLast = SBP_Buf[brd_no].cTx;
SBP_Buf[brd_no].isLastESC = SBP_Buf[brd_no].isCurrentESC;
if(cRx == ESC) SBP_Buf[brd_no].isCurrentESC = 1;
else SBP_Buf[brd_no].isCurrentESC = 0;
/////continueus ECS
if( (SBP_Buf[brd_no].ssSPIStat != spistInsTx)
&& (SBP_Buf[brd_no].isCurrentESC == 1)
&& (SBP_Buf[brd_no].isLastESC == 1) )
{ SBP_Buf[brd_no].ssSPIStat = spistIdle;
SBP_Buf[brd_no].returnStat = SBP_RTSTUS_DUAL_ESC;
SBP_Buf[brd_no].isFinished = 1;
return(ESC);
}
/* SPI-Tx */
switch (SBP_Buf[brd_no].ssSPIStat)
{
case spistIdle: //the first input byte is ignored
SBP_Buf[brd_no].cTx = ESC;
SBP_Buf[brd_no].ssSPIStat = spistInsTx;
SBP_Buf[brd_no].feedback_verify = 0;
break;
case spistInsTx:
if(SBP_Buf[brd_no].iInstrBufPos < 8)
{ SBP_Buf[brd_no].cTx = SBP_Buf[brd_no].InstrBuffer[SBP_Buf[brd_no].iInstrBufPos];
SBP_Buf[brd_no].iInstrBufPos++;
if(SBP_Buf[brd_no].iInstrBufPos==8)
SBP_Buf[brd_no].ssSPIStat = spistWtBusy;
}
SBP_Buf[brd_no].feedback_verify = 1;
break;
case spistWtBusy:
if(SBP_Buf[brd_no].amIWriteData == 1) //master write to slave
{
if(cRx == CHAR_READY)
{
SBP_Buf[brd_no].ssSPIStat = spistDataTX;
SBP_Buf[brd_no].cTx = END;
}
else SBP_Buf[brd_no].cTx = CHAR_NULL;
}
else //master read from slave
{
if(cRx == END)
{
SBP_Buf[brd_no].ssSPIStat = spistDataRX;
SBP_Buf[brd_no].cTx = END;
}
else SBP_Buf[brd_no].cTx = CHAR_NULL;
}
SBP_Buf[brd_no].feedback_verify = 0;
break;
case spistDataTX:
if(SBP_Buf[brd_no].iTxBufPos < SBP_Buf[brd_no].iTxBufferLen)
{
SBP_Buf[brd_no].cTx = SBP_Buf[brd_no].TxBuffer[SBP_Buf[brd_no].iTxBufPos];
switch (SBP_Buf[brd_no].cTx)
{
case ESC:
if (SBP_Buf[brd_no].cTxLast == ESC)
{ SBP_Buf[brd_no].cTx = ESC_ESC;
SBP_Buf[brd_no].iTxBufPos++;
}
else
{ SBP_Buf[brd_no].cTx = ESC;
}
break;
case END:
if (SBP_Buf[brd_no].cTxLast == ESC)
{ SBP_Buf[brd_no].cTx = ESC_END;
SBP_Buf[brd_no].iTxBufPos++;
}
else
{ SBP_Buf[brd_no].cTx = ESC;
}
break;
default:
SBP_Buf[brd_no].iTxBufPos++;
break;
}
} // payload
if(SBP_Buf[brd_no].iTxBufPos == SBP_Buf[brd_no].iTxBufferLen)
SBP_Buf[brd_no].ssSPIStat = spistDataTXTailESC;
SBP_Buf[brd_no].feedback_verify = 1;
break;
case spistDataTXTailESC:
SBP_Buf[brd_no].cTx = ESC;
SBP_Buf[brd_no].ssSPIStat = spistDataTXTailIDLE;
SBP_Buf[brd_no].feedback_verify = 1;
break;
case spistDataTXTailIDLE:
SBP_Buf[brd_no].cTx = ESC_IDLE;
SBP_Buf[brd_no].ssSPIStat = spistDataTXTailESC2;
SBP_Buf[brd_no].feedback_verify = 1;
break;
case spistDataTXTailESC2:
SBP_Buf[brd_no].cTx = ESC;
SBP_Buf[brd_no].ssSPIStat = spistDone;
SBP_Buf[brd_no].feedback_verify = 1;
break;
case spistDataRX:
SBP_Buf[brd_no].cTx = cRx;
if (SBP_Buf[brd_no].isLastESC)
{
switch(cRx)
{ case ESC_IDLE: SBP_Buf[brd_no].ssSPIStat = spistDone;
break;
case ESC_ESC: SBP_Buf[brd_no].RxBuffer[SBP_Buf[brd_no].iRxBufferLen] = ESC;
SBP_Buf[brd_no].iRxBufferLen++;
break;
case ESC_END: SBP_Buf[brd_no].RxBuffer[SBP_Buf[brd_no].iRxBufferLen] = END;
SBP_Buf[brd_no].iRxBufferLen++;
break;
default: SBP_Buf[brd_no].returnStat = SBP_RTSTUS_ESC_ILLEGAL_BYTE;
SBP_Buf[brd_no].isFinished = 1;
break;
}
}
else if(SBP_Buf[brd_no].isCurrentESC)
{
//do nothing
}
else
{ SBP_Buf[brd_no].RxBuffer[SBP_Buf[brd_no].iRxBufferLen] = cRx;
SBP_Buf[brd_no].iRxBufferLen++;
}
SBP_Buf[brd_no].feedback_verify = 0;
break;
case spistDone:
SBP_Buf[brd_no].cTx = ESC; //the last byte
SBP_Buf[brd_no].returnStat = SBP_RTSTUS_OK;
SBP_Buf[brd_no].isFinished = 1;
SBP_Buf[brd_no].ssSPIStat = spistIdle;
break;
default:
//reset to default status
SBP_Buf[brd_no].ssSPIStat = spistIdle;
break;
}
return(SBP_Buf[brd_no].cTx);
}
uint8_t SBP_Slave_Parser(SBPBuffer* SBPbufPt,uint8_t cRx)
{
//SBP_RTSTUS_OverTime handle
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -