⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 fesc_5554_spicomm.c

📁 MPC5554处理器的初始化例程
💻 C
📖 第 1 页 / 共 2 页
字号:



/******************************************/
/* @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 + -