| | |
| | | #include "string.h" |
| | | #include "stm32f0xx.h" |
| | | |
| | | unsigned char bKBusMaster=0,bKBusSlave=0,bKBusRepeater=0;; |
| | | //unsigned char bKBusMaster=0,bKBusSlave=0,bKBusRepeater=0;; |
| | | |
| | | unsigned char PacketBuf1[128]; |
| | | unsigned char PacketBuf2[128]; |
| | | stKBusMem KBusMem; |
| | | |
| | | unsigned char BufferIn[16]={0}; |
| | | unsigned char BufferOut[16]={0}; |
| | | |
| | | unsigned char KBusDiagnosis =1; |
| | | unsigned char KBusSnapPos = 0; |
| | | |
| | | stChnStat KBusChnStats[8]; |
| | | unsigned char nStationID=0; |
| | | unsigned char nChilds; |
| | | int ChildStat[16]; |
| | | unsigned char nCurPollId=0; |
| | | unsigned char nSeq=0; |
| | | |
| | | volatile unsigned char KBusMasterRecved=1; |
| | | volatile unsigned char KBusMasterRecvOK=1; |
| | | |
| | | volatile unsigned char KBusSlaveRecved=1; |
| | | unsigned int KBusSendTimeuS=0; |
| | | volatile int KBusRecvTimeuS=0; |
| | | |
| | | int KBusDelayuS=0; |
| | | int KBusMaxDelayuS=0; |
| | | int ThisuS; |
| | | volatile unsigned int nSlaveTick=0; |
| | | |
| | | int Clk3=0; |
| | | int SendTime,Latancy,LatancyClk,SendClk; |
| | | |
| | | volatile int nCount2=0; |
| | | int TimeOutCount=0; |
| | | int LastCircleStartTime=0; |
| | | int CircleTime=0; |
| | | |
| | | unsigned char Datas[128]; |
| | | volatile int PacketLength = 0; |
| | | |
| | | stClientInfo ClientInfo[16]; |
| | | |
| | | |
| | | unsigned char KBusBCC(void * pData, int nSize) |
| | | int KBusLoadSavedConfig(stKBusDef * pKBus) |
| | | { |
| | | unsigned char k; |
| | | k=0; |
| | | for (int i=0;i<nSize;i++) |
| | | { |
| | | k^=((unsigned char *)pData)[i]; |
| | | } |
| | | return k; |
| | | int iRet=0; |
| | | |
| | | |
| | | return iRet; |
| | | } |
| | | |
| | | int KBusMakePacket(pKBPacket p1,unsigned char src, uchar dst, uchar nType,unsigned char nStatus, unsigned char DataLen,void * pData ) |
| | | int KBusSaveConfig(int nChn) |
| | | { |
| | | p1->Sign=StartSign; |
| | | p1->DstHost=dst; |
| | | p1->SrcAddr=src; |
| | | p1->nCMD=nType; |
| | | p1->nStatus=nStatus; |
| | | int PacketLenth=0; |
| | | switch (nType) |
| | | int iRet=0; |
| | | |
| | | return iRet; |
| | | |
| | | } |
| | | |
| | | int KBusInitMaster(stKBusDef * pKBus,KBusSendPktFuncDef KBusSendPacket, int nChildCount) |
| | | { |
| | | int iRet =0; |
| | | pKBus->MyStat = KBusStatInited; |
| | | pKBus->bMaster = 1; |
| | | pKBus->bSlave = 0; |
| | | pKBus->bRepeater =0; |
| | | pKBus->nChildCount = nChildCount; |
| | | pKBus->nStationId = 0; |
| | | pKBus->KBusEvCBFunc=0; |
| | | memset(pKBus->KBusChnStats,0,sizeof(pKBus->KBusChnStats)); |
| | | pKBus->KBusEvCBFunc=NULL; |
| | | pKBus->KBusSvCBFunc=NULL; |
| | | pKBus->KBusSendPacket = KBusSendPacket; |
| | | pKBus->nCurPollId = 1; |
| | | |
| | | for (int i=0;i<MAX_CLIENT;i++) |
| | | { |
| | | case cmdNone: |
| | | memset(&pKBus->KBusChnStats[i],0,sizeof(stChnStat)); |
| | | } |
| | | for (int i=0;i<MAX_CLIENT;i++) |
| | | { |
| | | KBusMakeDefaultClildInfo(pKBus, i); |
| | | } |
| | | /* |
| | | stDeviceInfo * pDeviceInfo = &pKBus->DeviceInfos[1]; |
| | | |
| | | pDeviceInfo->DeviceType = 0; |
| | | pDeviceInfo->DeviceVer = 0; |
| | | pDeviceInfo->InBitCount = 16; |
| | | pDeviceInfo->OutBitCount = 16; |
| | | pDeviceInfo->AIWCount = 0; |
| | | pDeviceInfo->AQWCount = 0; |
| | | pDeviceInfo->DWStartAddr = 0; |
| | | pDeviceInfo->OutDWCount = 0; |
| | | */ |
| | | pKBus->KBusPort = (stPortDef){.nPortHardType = 4, .nPortUseType = 3, .bEnable = 1, .bRunning =1, .StationId = 0, .bMaster = 1, .nMaxStations = nChildCount, |
| | | .pInstance=pKBus , .ReqCommFunc = (CommFuncDef)KBusReqService}; |
| | | |
| | | KMRegisterPort(1,&pKBus->KBusPort); |
| | | return iRet; |
| | | }; |
| | | |
| | | int KBusInitSlave(stKBusDef * pKBus,KBusSendPktFuncDef KBusSendPacket, int nStationId, stDeviceInfo * pDeviceInfo) |
| | | { |
| | | int iRet =0; |
| | | pKBus->MyStat = KBusStatInited; |
| | | pKBus->bMaster = 0; |
| | | pKBus->bSlave = 1; |
| | | pKBus->bRepeater = 0; |
| | | pKBus->nChildCount = 0; |
| | | pKBus->nStationId = nStationId; |
| | | pKBus->pMyDeviceInfo = pDeviceInfo; |
| | | pKBus->KBusEvCBFunc = NULL; |
| | | pKBus->KBusSvCBFunc=NULL; |
| | | pKBus->KBusSendPacket = KBusSendPacket; |
| | | /* |
| | | for (int i=0;i<MAX_CLIENT;i++) |
| | | { |
| | | memset(&pKBus->KBusChnStats[i],0,sizeof(stChnStat)); |
| | | } |
| | | */ |
| | | |
| | | pKBus->KBusPort = (stPortDef){.nPortHardType = 4, .nPortUseType = 3, .bEnable = 1, .bRunning =1, .StationId = nStationId, .bMaster = 0, .pInstance = pKBus}; |
| | | KMRegisterPort(1,&pKBus->KBusPort); |
| | | |
| | | return iRet; |
| | | } |
| | | |
| | | |
| | | int KBusInit(stKBusDef * pKBus,KBusSendPktFuncDef KBusSendPacket, int bMaster, int nChildCount) |
| | | { |
| | | int iRet =0; |
| | | pKBus->MyStat = KBusStatInited; |
| | | if (bMaster ) { |
| | | KBusInitMaster(pKBus,KBusSendPacket,nChildCount); |
| | | }else { |
| | | KBusInitSlave(pKBus,KBusSendPacket,nChildCount,0); |
| | | } |
| | | // memset(pKBus->KBusChnStats,0,sizeof(pKBus->KBusChnStats)); |
| | | return iRet; |
| | | |
| | | } |
| | | |
| | | int KBusSetEvCallBackFunc(stKBusDef * pKBus, KBusEvCBFuncDef CBFunc) |
| | | { |
| | | |
| | | pKBus->KBusEvCBFunc = CBFunc; |
| | | // pKBus->bKBusEvCBFuncSet=1; |
| | | return 0; |
| | | } |
| | | |
| | | //unsigned char tempdata [8] = {11,12,13,14,25,26,27,28}; |
| | | int KBusReqService (stKBusDef * pKBus, int ReqId, int nParam1, int nParam2, void **pData, unsigned short * len1) |
| | | { |
| | | |
| | | switch (ReqId) { |
| | | case ReqStartDiag: |
| | | break; |
| | | case cmdPing: |
| | | p1->DataLen=DataLen; |
| | | memcpy(p1->data,pData,DataLen); |
| | | p1->data[DataLen]=KBusBCC(p1,sizeof(stKBPacket)+DataLen-1); |
| | | p1->data[DataLen+1]=EndSign; |
| | | |
| | | PacketLenth=sizeof(stKBPacket)+DataLen+1; |
| | | case ReqStopDiag: |
| | | break; |
| | | case cmdPingReply: |
| | | p1->DataLen=DataLen; |
| | | memcpy(p1->data,pData,DataLen); |
| | | p1->data[DataLen]=KBusBCC(p1,sizeof(stKBPacket)+DataLen-1); |
| | | p1->data[DataLen+1]=EndSign; |
| | | PacketLenth=sizeof(stKBPacket)+DataLen+1; |
| | | break; |
| | | case cmdRead: |
| | | break; |
| | | case cmdReadReply: |
| | | break; |
| | | case cmdWrite: |
| | | break; |
| | | case cmdWriteReply: |
| | | p1->DataLen=DataLen; |
| | | if (DataLen !=0 ) memcpy(p1->data,pData,DataLen); |
| | | p1->data[DataLen]=KBusBCC(p1,sizeof(stKBPacket)+DataLen-1); |
| | | p1->data[DataLen+1]=EndSign; |
| | | PacketLenth=sizeof(stKBPacket)+DataLen+1; |
| | | break; |
| | | case cmdGetVersion: |
| | | p1->DataLen=DataLen; |
| | | memcpy(p1->data,pData,DataLen); |
| | | p1->data[DataLen]=KBusBCC(p1,sizeof(stKBPacket)+DataLen-1); |
| | | p1->data[DataLen+1]=EndSign; |
| | | PacketLenth=sizeof(stKBPacket)+DataLen+1; |
| | | break; |
| | | case cmdVerInfo: |
| | | p1->DataLen=DataLen; |
| | | memcpy(p1->data,pData,DataLen); |
| | | p1->data[DataLen]=KBusBCC(p1,sizeof(stKBPacket)+DataLen-1); |
| | | p1->data[DataLen+1]=EndSign; |
| | | PacketLenth=sizeof(stKBPacket)+DataLen+1; |
| | | break; |
| | | case cmdExChgData: |
| | | p1->DataLen=DataLen; |
| | | memcpy(p1->data,pData,DataLen); |
| | | p1->data[DataLen]=KBusBCC(p1,sizeof(stKBPacket)+DataLen-1); |
| | | p1->data[DataLen+1]=EndSign; |
| | | PacketLenth=sizeof(stKBPacket)+DataLen+1; |
| | | break; |
| | | case cmdExChgDataReply: |
| | | p1->DataLen=DataLen; |
| | | memcpy(p1->data,pData,DataLen); |
| | | p1->data[DataLen]=KBusBCC(p1,sizeof(stKBPacket)+DataLen-1); |
| | | p1->data[DataLen+1]=EndSign; |
| | | PacketLenth=sizeof(stKBPacket)+DataLen+1; |
| | | break; |
| | | |
| | | case cmdSyncRead: |
| | | p1->DataLen=DataLen; |
| | | memcpy(p1->data,pData,DataLen); |
| | | p1->data[DataLen]=KBusBCC(p1,sizeof(stKBPacket)+DataLen-1); |
| | | p1->data[DataLen+1]=EndSign; |
| | | PacketLenth=sizeof(stKBPacket)+DataLen+1; |
| | | break; |
| | | case cmdSyncWrite: |
| | | p1->DataLen=DataLen; |
| | | memcpy(p1->data,pData,DataLen); |
| | | p1->data[DataLen]=KBusBCC(p1,sizeof(stKBPacket)+DataLen-1); |
| | | p1->data[DataLen+1]=EndSign; |
| | | PacketLenth=sizeof(stKBPacket)+DataLen+1; |
| | | break; |
| | | case cmdSequenRead: |
| | | p1->DataLen=DataLen; |
| | | memcpy(p1->data,pData,DataLen); |
| | | p1->data[DataLen]=KBusBCC(p1,sizeof(stKBPacket)+DataLen-1); |
| | | p1->data[DataLen+1]=EndSign; |
| | | PacketLenth=sizeof(stKBPacket)+DataLen+1; |
| | | case ReqPortChnInfo: |
| | | *pData = &pKBus->KBusChnStats[nParam1]; |
| | | *len1 = sizeof(stChnStat); |
| | | break; |
| | | case ReqPortChildInfo: |
| | | *pData = &pKBus->DeviceInfos[nParam1]; |
| | | *len1 = sizeof(stDeviceInfo); |
| | | |
| | | // *pData = tempdata; |
| | | // *len1 = sizeof(tempdata); |
| | | break; |
| | | case ReqBlinkLED: |
| | | if (pKBus->bReq == 1) return -1; |
| | | if (nParam1 != 0xff && nParam1> pKBus->nChildCount) return -2; |
| | | if (pKBus->bReq != 1 ) { |
| | | pKBus->bReq=1; |
| | | pKBus->nReqSvrId = ReqId; |
| | | pKBus->nReqChildId = nParam1; |
| | | pKBus->nReqParam = nParam2; |
| | | pKBus->nReqReCount = 0; |
| | | } |
| | | break; |
| | | |
| | | case ReqTransBlink: |
| | | if (pKBus->bReq == 1) return -1; |
| | | if (nParam1 != 0xff && nParam1> pKBus->nChildCount) return -2; |
| | | if (pKBus->bReq != 1 ) { |
| | | pKBus->bReq=1; |
| | | pKBus->nReqSvrId = ReqId; |
| | | pKBus->nReqChildId = nParam1; |
| | | pKBus->nReqParam = nParam2; |
| | | pKBus->nReqReCount = 0; |
| | | } |
| | | break; |
| | | |
| | | case ReqTransCfg: |
| | | break; |
| | | case ReqUpdateFirm: |
| | | if (pKBus->bReq == 1) return -1; |
| | | if (nParam1> pKBus->nChildCount) return -2; |
| | | if (pKBus->bReq != 1 ) { |
| | | pKBus->bReq=1; |
| | | pKBus->nReqSvrId = ReqId; |
| | | pKBus->nReqChildId = nParam1; |
| | | pKBus->nReqParam = nParam2; |
| | | pKBus->nReqReCount = 0; |
| | | if (*len1>0) { |
| | | memcpy(pKBus->pReqDatas,*pData,*len1); |
| | | pKBus->nReqDataLen = *len1; |
| | | pKBus->nReqDataOff = 0; |
| | | } |
| | | } |
| | | |
| | | case cmdSyncTime: |
| | | p1->DataLen=DataLen; |
| | | memcpy(p1->data,pData,DataLen); |
| | | p1->data[DataLen]=KBusBCC(p1,sizeof(stKBPacket)+DataLen-1); |
| | | p1->data[DataLen+1]=EndSign; |
| | | PacketLenth=sizeof(stKBPacket)+DataLen+1; |
| | | break; |
| | | |
| | | case ReqTransFirmware: |
| | | break; |
| | | default: |
| | | if (pKBus->bReq == 1) return -1; |
| | | if (nParam1 != 0xff && nParam1> pKBus->nChildCount) return -2; |
| | | if (pKBus->bReq != 1 ) { |
| | | pKBus->bReq=1; |
| | | pKBus->nReqSvrId = ReqId; |
| | | pKBus->nReqChildId = nParam1; |
| | | pKBus->nReqParam = nParam2; |
| | | pKBus->nReqReCount = 0; |
| | | if (*len1>0) { |
| | | memcpy(pKBus->pReqDatas,*pData,*len1); |
| | | pKBus->nReqDataLen = *len1; |
| | | pKBus->nReqDataOff = 0; |
| | | } |
| | | } |
| | | break; |
| | | } |
| | | return 0; |
| | | } |
| | | |
| | | int KBusStart(stKBusDef * pKBus) |
| | | { |
| | | int iRet = 0; |
| | | |
| | | return iRet; |
| | | } |
| | | |
| | | int KBusLoopProcess(stKBusDef * pKBus) |
| | | { |
| | | int iRet = 0; |
| | | if (pKBus->bMaster) |
| | | { |
| | | if (pKBus->nChildCount>0) KBusMasterFunc(&KBus1); |
| | | } |
| | | if (pKBus->bSlave) |
| | | { |
| | | KBusSlaveFunc(&KBus1); |
| | | } |
| | | if (pKBus->bRepeater) |
| | | { |
| | | } |
| | | if (pKBus->RunStat) {pKBus->RunStat--;} |
| | | if (pKBus->ErrStat) {pKBus->ErrStat--;} |
| | | return iRet; |
| | | } |
| | | |
| | | int KBusRepeaterFunc(stKBusDef * pKBus) |
| | | { |
| | | if ((KMem.nRunCount &0x7f) == 88) |
| | | { |
| | | ToggleRunLed(); |
| | | } |
| | | return 0; |
| | | } |
| | | |
| | | int KBusUpdateChildInfo(stKBusDef * pKBus, int nChild, stDeviceInfo * pInfoBlock) |
| | | { |
| | | pKBus->DeviceInfos[nChild] = *pInfoBlock; |
| | | return 0; |
| | | } |
| | | |
| | | int KBusMakeDefaultClildInfo(stKBusDef * pKBus, int nChild) |
| | | { |
| | | // unsigned DefaultInBitCount = 8; |
| | | // unsigned DefaultOutBitCount = 8; |
| | | |
| | | // stDeviceInfo * pDeviceInfo = &pKBus->DeviceInfos[nChild]; |
| | | pKBus->DeviceInfos[nChild] = (stDeviceInfo){ |
| | | .DeviceType=0, |
| | | .DeviceVer=0, |
| | | .InBitCount=8, |
| | | .OutBitCount=8, |
| | | .AIWCount=0, |
| | | .AQWCount=0, |
| | | .DWStartAddr=0, |
| | | .OutDWCount=0 |
| | | }; |
| | | |
| | | return 0; |
| | | } |
| | | |
| | | //int KBusSetChildCfg(int nChn, int nChild, ) |
| | | int KBusAddChildAddrByInfo(stKBusDef * pKBus, int nChild, stDeviceInfo * pDeviceInfo) |
| | | { |
| | | int iRet = 0; |
| | | stClientCfg * pClientCfg = &pKBus->ClientCfg[nChild]; |
| | | |
| | | pClientCfg->Addr = pKBus->nCurPollId; |
| | | pClientCfg->Configed = KBusConfiged; |
| | | pClientCfg->InStartAddrBit = pKBus->CurXBitAddr; |
| | | pClientCfg->OutStartAddrBit = pKBus->CurYBitAddr; |
| | | pClientCfg->AIWStartAddrByte = pKBus->CurAIWAddr; |
| | | pClientCfg->AQWStartAddrByte = pKBus->CurAQWAddr; |
| | | pClientCfg->DIWStartAddrByte = pKBus->CurDIWAddr; |
| | | pClientCfg->DOWStartAddrByte = pKBus->CurDOWAddr; |
| | | |
| | | pKBus->CurXBitAddr += pDeviceInfo->InBitCount; |
| | | pKBus->CurYBitAddr += pDeviceInfo->OutBitCount; |
| | | pKBus->CurAIWAddr += pDeviceInfo->AIWCount; |
| | | pKBus->CurAQWAddr += pDeviceInfo->AQWCount; |
| | | |
| | | return iRet; |
| | | } |
| | | |
| | | |
| | | int KBusSearchChildProc(stKBusDef * pKBus) |
| | | { |
| | | int iRet = 0; |
| | | uint32_t tick1=GetTick(); |
| | | // uint32_t thisuS=GetuS(); |
| | | int nThisPollId = pKBus->nCurPollId; |
| | | if (pKBus->bMasterSent) { |
| | | if (pKBus->bMasterRecved) { |
| | | pKBus->bMasterSent=0; |
| | | pKBus->RetryCount=0; |
| | | nThisPollId++; |
| | | pKBus->nCurPollId = nThisPollId; |
| | | if (nThisPollId > pKBus->nChildCount) |
| | | { |
| | | // all query done, next stage |
| | | pKBus->nCurPollId = 1; |
| | | pKBus->MyStat = KBusStatReady; |
| | | // CallBack |
| | | if (pKBus->KBusEvCBFunc) pKBus->KBusEvCBFunc(pKBus, KBusEvStateChange,0,0); |
| | | } |
| | | } |
| | | |
| | | if (!pKBus->bMasterRecved && tick1- pKBus->SendTimeTick > KBUS_WAIT_TIME_OUT1) |
| | | { |
| | | /* |
| | | // timeOut, |
| | | if (pKBus->RetryCount <3) { |
| | | pKBus->RetryCount++; |
| | | // resent query packet for curPollId; |
| | | pKBus->bMasterSent=0; // no wait any more; |
| | | // pKBus->bMasterSent=1; |
| | | // pKBus->SendTimeTick = tick1; |
| | | } |
| | | if (pKBus->RetryCount >3 ) |
| | | // */ |
| | | { |
| | | // Set Cur Child As Default |
| | | KBusMakeDefaultClildInfo(pKBus,nThisPollId); |
| | | KBusAddChildAddrByInfo(pKBus,nThisPollId,&pKBus->DeviceInfos[nThisPollId]); |
| | | |
| | | // Next Child; |
| | | pKBus->RetryCount=0; |
| | | nThisPollId++; |
| | | pKBus->nCurPollId = nThisPollId; |
| | | if (nThisPollId > pKBus->nChildCount) |
| | | { |
| | | // all query done, next stage |
| | | pKBus->nCurPollId = 1; |
| | | pKBus->MyStat = KBusStatReady; |
| | | // CallBack |
| | | if (pKBus->KBusEvCBFunc) pKBus->KBusEvCBFunc(pKBus, KBusEvStateChange,0,0); |
| | | } |
| | | pKBus->bMasterSent=0; |
| | | } |
| | | |
| | | } |
| | | }else { // ! pKBus->bMasterSent 还没有发送 |
| | | // Sent Query Packet for CurPollId; |
| | | //pKBus->nCurPollId; |
| | | |
| | | unStatus ThisStatus; |
| | | ThisStatus.nSeq = pKBus->nSeq; |
| | | ThisStatus.nErr1 = (pKBus->KBusChnStats[nThisPollId].MStat==0); |
| | | |
| | | int len1=KBusMakePacket((pKBPacket)pKBus->PacketBuf2,0,nThisPollId,cmdQuery,ThisStatus.nStatus,0,NULL); |
| | | // LL_USART_SetBaudRate(USART2,48000000,LL_USART_OVERSAMPLING_8,DefaultUart2Baud); |
| | | pKBus->KBusSendPacket(pKBus->PacketBuf2, len1); |
| | | pKBus->KBusChnStats[nThisPollId].SendPackets++; |
| | | pKBus->KBusChnStats[nThisPollId].SendTimeInterval=pKBus->SendTimeTick-pKBus->KBusChnStats[nThisPollId].LastSentTimeTick; |
| | | pKBus->KBusChnStats[nThisPollId].LastSentTimeTick=pKBus->SendTimeTick; |
| | | // PacketLength = len1; |
| | | pKBus->SendTime=tick1; |
| | | |
| | | pKBus->bMasterRecved=0; |
| | | pKBus->bMasterRecvOK=0; |
| | | |
| | | pKBus->bMasterSent=1; |
| | | pKBus->SendTimeTick = tick1; |
| | | } |
| | | |
| | | |
| | | // pKBus->MyStat = KBusStatReady; |
| | | |
| | | return iRet; |
| | | } |
| | | |
| | | int KBusPacketSendDone(stKBusDef * pKBus) |
| | | { |
| | | switch (pKBus->MyStat){ |
| | | case KBusStatUnInited: |
| | | break; |
| | | case KBusStatInited: |
| | | break; |
| | | case KBusStatConfig: |
| | | break; |
| | | case KBusStatReady: |
| | | break; |
| | | case KBusStatRunning: |
| | | switch(pKBus->nRunStep) { |
| | | case KBusRunStepBroadCastCfg: |
| | | pKBus->nRunStep = KBusRunStepTimeSync; |
| | | break; |
| | | case KBusRunStepTimeSync: |
| | | pKBus->nRunStep = KBusRunStepMultiDataPoll; |
| | | break; |
| | | case KBusRunStepMultiDataPoll: |
| | | pKBus->nRunStep = KBusRunStepUniDataPoll; |
| | | break; |
| | | case KBusRunStepUniDataPoll: |
| | | |
| | | break; |
| | | case KBusRunStepUniDataTranster: |
| | | |
| | | break; |
| | | default: |
| | | break; |
| | | } |
| | | // KBusDataPoll(pKBus); |
| | | break; |
| | | default: |
| | | break; |
| | | } |
| | | return 0; |
| | | } |
| | | |
| | | |
| | | |
| | | int GoStep(stKBusDef * pKBus, enKBusRunStep NextStep) |
| | | { |
| | | pKBus->nRunStep = NextStep; |
| | | pKBus->TimeOutCount=0; |
| | | return 0; |
| | | } |
| | | |
| | | int KBusMasterFunc(stKBusDef * pKBus) |
| | | { |
| | | int len1; |
| | | uint32_t tick1=GetTick(); |
| | | ushort DataLen = 0; |
| | | switch (pKBus->MyStat){ |
| | | case KBusStatUnInited: |
| | | KBusLoadSavedConfig(pKBus); |
| | | pKBus->MyStat = KBusStatInited; |
| | | pKBus->TimeOutCount=0; |
| | | break; |
| | | case KBusStatInited: |
| | | pKBus->TimeOutCount++; |
| | | if (pKBus->TimeOutCount>30){ |
| | | pKBus->MyStat = KBusStatConfig; |
| | | pKBus->TimeOutCount = 0; |
| | | } |
| | | break; |
| | | case KBusStatConfig: |
| | | KBusSearchChildProc(pKBus); |
| | | break; |
| | | case KBusStatReady: |
| | | pKBus->MyStat = KBusStatRunning; |
| | | pKBus->nRunStep = KBusRunStepBroadCastCfg; |
| | | pKBus->TimeOutCount=0; |
| | | break; |
| | | case KBusStatRunning: |
| | | switch(pKBus->nRunStep) { |
| | | case KBusRunStepBroadCastCfg: |
| | | pKBus->TimeOutCount++; |
| | | if (pKBus->TimeOutCount>4){ |
| | | pKBus->nRunStep = KBusRunStepTimeSync; |
| | | pKBus->TimeOutCount = 0; |
| | | } |
| | | break; |
| | | case KBusRunStepTimeSync: |
| | | pKBus->Datas[0]=tick1&0xff; |
| | | pKBus->Datas[1]=(tick1>>8)&0xff; |
| | | pKBus->Datas[2]=(tick1>>16)&0xff; |
| | | pKBus->Datas[3]=(tick1>>24)&0xff; |
| | | len1=KBusMakePacket((pKBPacket)pKBus->PacketBuf2,0,0xff,cmdSyncTime,pKBus->nSeq,4,pKBus->Datas); |
| | | pKBus->KBusSendPacket(pKBus->PacketBuf2, len1); |
| | | |
| | | pKBus->nRunStep = KBusRunStepTimeSyncWait; |
| | | pKBus->TimeOutCount=0; |
| | | break; |
| | | case KBusRunStepTimeSyncWait: |
| | | pKBus->TimeOutCount++; |
| | | if (pKBus->TimeOutCount>2){ |
| | | pKBus->nRunStep = KBusRunStepMultiDataPoll; |
| | | pKBus->TimeOutCount=0; |
| | | } |
| | | break; |
| | | case KBusRunStepMultiDataPoll: |
| | | pKBus->TimeOutCount++; |
| | | if (pKBus->TimeOutCount>1){ |
| | | pKBus->nCurPollId = 1; |
| | | pKBus->nRunStep = KBusRunStepUniDataPoll; |
| | | pKBus->TimeOutCount=0; |
| | | } |
| | | break; |
| | | case KBusRunStepUniDataPoll: |
| | | KBusDataPoll(pKBus); |
| | | break; |
| | | case KBusRunStepUniDataTranster: |
| | | // 看是否有远程请求 |
| | | if (pKBus->bReq &&pKBus->nReqReCount<1) |
| | | { |
| | | pKBus->nReqDataHdr[0]=0; |
| | | pKBus->nReqDataHdr[1]=0; |
| | | pKBus->nReqDataHdr[2]=pKBus->nReqSvrId; |
| | | pKBus->nReqDataHdr[3]=pKBus->nReqParam; |
| | | // [4] Addr |
| | | // [5] Addr |
| | | // [6] nCount |
| | | DataLen = pKBus->nReqDataLen+2; |
| | | len1=KBusMakePacket((pKBPacket)pKBus->PacketBuf2,0,pKBus->nReqChildId,cmdRemoteReq,pKBus->nSeq,DataLen,&pKBus->nReqDataHdr[2]); |
| | | pKBus->KBusSendPacket(pKBus->PacketBuf2, len1); |
| | | pKBus->nReqReCount++; |
| | | }else { |
| | | |
| | | } |
| | | pKBus->nRunStep = KBusRunStepUniDataTransterWait; |
| | | pKBus->TimeOutCount=0; |
| | | break; |
| | | case KBusRunStepUniDataTransterWait: |
| | | pKBus->TimeOutCount++; |
| | | if (pKBus->TimeOutCount>4){ |
| | | if (pKBus->bReq ==1) {pKBus->bReq = 3;} |
| | | pKBus->nRunStep = KBusRunStepBroadCastCfg; |
| | | pKBus->TimeOutCount=0; |
| | | |
| | | } |
| | | break; |
| | | default: |
| | | break; |
| | | } |
| | | break; |
| | | default: |
| | | break; |
| | | } |
| | | |
| | | return PacketLenth; |
| | | return 0; |
| | | } |
| | | |
| | | int KBusCheckPacket(int nChn, pKBPacket p1, int nLen1) |
| | | int KBusDataPoll(stKBusDef * pKBus) |
| | | { |
| | | int iRet = 0; |
| | | uint32_t tick1=GetTick(); |
| | | // uint32_t thisuS=GetuS(); |
| | | int len1=0; |
| | | int nThisPollId = pKBus->nCurPollId; |
| | | |
| | | stChnStat * pChnStat = &pKBus->KBusChnStats[nThisPollId]; |
| | | if (!pKBus->bMasterSent){ |
| | | pKBus->Datas[0]=KBusMem.WLYB[nThisPollId -1 ]; |
| | | for (int i=1; i*8 < pKBus->DeviceInfos[nThisPollId].OutBitCount;i++){ |
| | | pKBus->Datas[0+i]=KBusMem.WLYB[nThisPollId -1 + i]; |
| | | } |
| | | |
| | | // pKBus->Datas[1]=KBusMem.WLYB[nThisPollId ];; |
| | | // pKBus->Datas[2]=KBusMem.WLYB[nThisPollId + 1 ]; //KBusChnStats[nCurPollId].Stat; |
| | | // pKBus->Datas[3]=KBusMem.WLYB[nThisPollId + 2 ]; |
| | | pKBus->Datas[4]=tick1&0xff; |
| | | pKBus->Datas[5]=(tick1>>8)&0xff; |
| | | pKBus->Datas[6]=(tick1>>16)&0xff; |
| | | pKBus->Datas[7]=(tick1>>24)&0xff; |
| | | |
| | | pKBus->SendTimeTick=tick1; |
| | | unStatus ThisStatus; |
| | | ThisStatus.nStatus= pChnStat->MStat; |
| | | ThisStatus.nSeq = pKBus->nSeq; |
| | | //ThisStatus.nErr1 = (pChnStat->MStat==0); |
| | | // ThisStatus.nErr1 = 0; |
| | | len1=KBusMakePacket((pKBPacket)pKBus->PacketBuf2,0,nThisPollId,cmdUniExChgData,ThisStatus.nStatus,8,pKBus->Datas); |
| | | // LL_USART_SetBaudRate(USART2,48000000,LL_USART_OVERSAMPLING_8,DefaultUart2Baud); |
| | | |
| | | pKBus->KBusSendPacket(pKBus->PacketBuf2, len1); |
| | | pChnStat->SendPackets++; |
| | | pChnStat->SendTimeInterval=pKBus->SendTimeTick - pChnStat->LastSentTimeTick; |
| | | pChnStat->LastSentTimeTick=pKBus->SendTimeTick; |
| | | // PacketLength = len1; |
| | | pKBus->SendTime=tick1; |
| | | pKBus->bMasterSent = 1; |
| | | pKBus->bMasterRecved=0; |
| | | pKBus->bMasterRecvOK=0; |
| | | // LL_GPIO_TogglePin(GPIOA,LL_GPIO_PIN_5); |
| | | //ToggleErrLed(); |
| | | // ToggleOut8(); |
| | | }else |
| | | { |
| | | |
| | | if ((pKBus->bMasterRecved && pKBus->bMasterRecvOK && tick1-pKBus->SendTimeTick>1) || tick1-pKBus->SendTimeTick>KBUS_WAIT_TIME_OUT2) |
| | | { |
| | | if (!pKBus->bMasterRecvOK) |
| | | { |
| | | pKBus->TimeOutCount++; |
| | | // Uart2Stat.TimeOutErr++; |
| | | pChnStat->LostPackets++; |
| | | pChnStat->CtnLstPkts++; |
| | | if (!pKBus->bMasterRecved) {pChnStat->TimeOutErr++;} |
| | | if (pChnStat->CtnLstPkts > pChnStat->MaxCtnLstPkts) |
| | | {pChnStat->MaxCtnLstPkts = pChnStat->CtnLstPkts;} |
| | | if (pChnStat->CtnLstPkts>3) |
| | | { |
| | | pChnStat->MStat = 0; |
| | | pKBus->ErrStat=200; |
| | | KBusMem.WLXB[nThisPollId]=0; |
| | | if (pKBus->KBusEvCBFunc) pKBus->KBusEvCBFunc(pKBus, KBusEvStateChange,0,0); |
| | | if (pKBus->KBusEvCBFunc) pKBus->KBusEvCBFunc(pKBus, KBusEvDataUpdate,0,0); |
| | | |
| | | } |
| | | // LL_GPIO_SetOutputPin(GPIOA,LL_GPIO_PIN_7); |
| | | }else |
| | | { |
| | | // pChnStat->CtnLstPkts = 0; |
| | | // pKBus->KBusChnStats[nThisPollId].CtnLstPkts=0; |
| | | pChnStat->MStat=1; |
| | | |
| | | pKBus->RunStat=100; |
| | | } |
| | | if (pKBus->DeviceInfos[nThisPollId].InBitCount >8 || pKBus->DeviceInfos[nThisPollId].OutBitCount > 8) { |
| | | nThisPollId += 2; |
| | | //nThisPollId ++; |
| | | }else { |
| | | nThisPollId ++; |
| | | } |
| | | if (nThisPollId > pKBus->nChildCount) |
| | | { |
| | | // 数据轮询完, 周期间隙,插入其他处理数据. 每次处理的时间间隙, 一问 一答 时间. |
| | | // 分成几种类型, 轮流进行 |
| | | // 时间同步, 查询新子机, 处理带外数据, ,处理额外的事情, 或者跳过. |
| | | pKBus->CircleTime=tick1-pKBus->LastCircleStartTime; |
| | | pKBus->LastCircleStartTime=tick1; |
| | | pKBus->nSeq++; |
| | | GoStep(pKBus,KBusRunStepUniDataTranster); |
| | | //nThisPollId=1; |
| | | }else { |
| | | pKBus->nCurPollId = nThisPollId; |
| | | } |
| | | pKBus->bMasterSent = 0; |
| | | } |
| | | } |
| | | return iRet; |
| | | } |
| | | |
| | | int KBusSlaveFunc(stKBusDef * pKBus) |
| | | { |
| | | // int ThisuS=GetuS(); |
| | | int ThisTick = GetTick(); |
| | | int thisRecvTime=pKBus->RecvTimeTick; |
| | | if (pKBus->nStationId >0) { |
| | | if (pKBus->bSlaveRecved) |
| | | { |
| | | pKBus->RunStat=8000; |
| | | pKBus->bSlaveRecved=0; |
| | | }else if ((ThisTick - thisRecvTime) > KBUS_SLAVE_TIME_OUT) // 30u |
| | | { |
| | | pKBus->ErrStat=7000; |
| | | }else if ( ThisTick > (thisRecvTime + KBUS_SLAVE_TIME_OUT)) // 30u |
| | | { |
| | | pKBus->ErrStat=7100; |
| | | } |
| | | } |
| | | return 0; |
| | | } |
| | | |
| | | int KBusCheckPacket(stKBusDef * pKBus, pKBPacket p1, int nLen1) |
| | | { |
| | | unsigned char * p2 = (unsigned char *)p1; |
| | | pKBPacket p3=p1; |
| | | if ((p2[0] == SYN || p2[0] != StartSign) && nLen1 > 1) |
| | | if ((p2[0] == KB_SYN || p2[0] != KBStartSign) && nLen1 > 1) |
| | | { |
| | | p3=(pKBPacket)(p2+1); |
| | | nLen1--; |
| | | } |
| | | |
| | | if (p3->Sign != StartSign) |
| | | if (p3->Sign != KBStartSign) |
| | | { |
| | | Uart2Stat.NotPacketErr++; |
| | | KBusChnStats[nCurPollId].NotPkgErr++; |
| | | if (KBusDiagnosis) { |
| | | if (KBusSnapPos == 0) { |
| | | // pKBus->NotPacketErr++; |
| | | KMem.WDB[0x40]=pKBus->nCurPollId; |
| | | KMem.WDB[0x41]=nLen1; |
| | | memcpy(&KMem.WDB[0x42],p1,nLen1); |
| | | |
| | | pKBus->KBusChnStats[pKBus->nCurPollId].NotPkgErr++; |
| | | if (pKBus->KBusDiagnosis) { |
| | | if (pKBus->KBusSnapPos == 0) { |
| | | KMem.WDB[0x20]=nLen1; |
| | | memcpy(&KMem.WDB[0x21],p1,nLen1); |
| | | KBusSnapPos++; |
| | | } else if (KBusSnapPos==1) { |
| | | pKBus->KBusSnapPos++; |
| | | } else if (pKBus->KBusSnapPos==1) { |
| | | KMem.WDB[0x40]=nLen1; |
| | | memcpy(&KMem.WDB[0x41],p1,nLen1); |
| | | KBusSnapPos++; |
| | | pKBus->KBusSnapPos++; |
| | | } else { |
| | | KMem.WDB[0x60]=nLen1; |
| | | memcpy(&KMem.WDB[0x61],p1,nLen1); |
| | | KBusSnapPos=0; |
| | | pKBus->KBusSnapPos=0; |
| | | } |
| | | |
| | | } |
| | | return -1; |
| | | } |
| | | int DataLen=p3->DataLen; |
| | | if (DataLen>MaxPacketLength) |
| | | if (DataLen>KBMaxPacketLength) |
| | | { |
| | | Uart2Stat.LengthErr++; |
| | | KBusChnStats[nCurPollId].PkgLenErr++; |
| | | // Uart2Stat.LengthErr++; |
| | | pKBus->KBusChnStats[pKBus->nCurPollId].PkgLenErr++; |
| | | return -1; |
| | | } |
| | | if (nLen1<DataLen+sizeof(stKBPacket)+1) |
| | | { |
| | | //len4=sprintf(str3,"%d < %d + %d \r\n",len2,DataLen,sizeof(stKBPacket)); |
| | | //PutStr(str3,len4); |
| | | KBusChnStats[nCurPollId].PkgLenErr++; |
| | | Uart2Stat.LengthErr++; |
| | | pKBus->KBusChnStats[pKBus->nCurPollId].PkgLenErr++; |
| | | // Uart2Stat.LengthErr++; |
| | | return -3; //not long enough |
| | | } |
| | | // if (p3->data[DataLen+1] != EndSign) |
| | |
| | | unsigned char thisBCC=KBusBCC(p1,sizeof(stKBPacket)+DataLen-1); |
| | | if (thisBCC != p3->data[DataLen]) |
| | | {//BCC Error; |
| | | Uart2Stat.BCCerr++; |
| | | KBusChnStats[nCurPollId].BCCErr++; |
| | | // Uart2Stat.BCCerr++; |
| | | pKBus->KBusChnStats[pKBus->nCurPollId].BCCErr++; |
| | | return -4; |
| | | } |
| | | return 0; |
| | | } |
| | | |
| | | int KBusSlaveCheckPacket(int nChn, pKBPacket p1, int nLen1) |
| | | int KBusSlaveCheckPacket(stKBusDef * pKBus, pKBPacket p1, int nLen1) |
| | | { |
| | | unsigned char * p2 = (unsigned char *)p1; |
| | | pKBPacket p3=p1; |
| | | if ((p2[0] == SYN || p2[0] != StartSign) && nLen1 > 1) |
| | | if ((p2[0] == KB_SYN || p2[0] != KBStartSign) && nLen1 > 1) |
| | | { |
| | | p3=(pKBPacket)(p2+1); |
| | | nLen1--; |
| | | } |
| | | |
| | | if (p3->Sign != StartSign) |
| | | if (p3->Sign != KBStartSign) |
| | | { |
| | | Uart2Stat.NotPacketErr++; |
| | | KBusChnStats[0].ClientNotPktErr++; |
| | | // Uart2Stat.NotPacketErr++; |
| | | pKBus->KBusChnStats[0].ClientNotPktErr++; |
| | | return -1; |
| | | } |
| | | int DataLen=p3->DataLen; |
| | | if (DataLen>MaxPacketLength) |
| | | if (DataLen>KBMaxPacketLength) |
| | | { |
| | | Uart2Stat.LengthErr++; |
| | | KBusChnStats[0].ClientPkgLenErr++; |
| | | // Uart2Stat.LengthErr++; |
| | | pKBus->KBusChnStats[0].ClientPkgLenErr++; |
| | | return -1; |
| | | } |
| | | if (nLen1<DataLen+sizeof(stKBPacket)+1) |
| | | { |
| | | //len4=sprintf(str3,"%d < %d + %d \r\n",len2,DataLen,sizeof(stKBPacket)); |
| | | //PutStr(str3,len4); |
| | | KBusChnStats[0].ClientPkgLenErr++; |
| | | Uart2Stat.LengthErr++; |
| | | pKBus->KBusChnStats[0].ClientPkgLenErr++; |
| | | // Uart2Stat.LengthErr++; |
| | | return -3; //not long enough |
| | | } |
| | | // if (p3->data[DataLen+1] != EndSign) |
| | |
| | | unsigned char thisBCC=KBusBCC(p1,sizeof(stKBPacket)+DataLen-1); |
| | | if (thisBCC != p3->data[DataLen]) |
| | | {//BCC Error; |
| | | Uart2Stat.BCCerr++; |
| | | KBusChnStats[0].ClientBccErr++; |
| | | // Uart2Stat.BCCerr++; |
| | | pKBus->KBusChnStats[0].ClientBccErr++; |
| | | return -4; |
| | | } |
| | | return 0; |
| | | } |
| | | |
| | | int KBusMasterParsePacket(int nChn, pKBPacket p1, int Len1) |
| | | int KBusMasterParsePacket(stKBusDef * pKBus, pKBPacket p1, int Len1) |
| | | { |
| | | unsigned char * p6 = (unsigned char *)p1; |
| | | |
| | | if ((p6[0] == SYN || p6[0] != StartSign) && Len1 > 1) |
| | | if ((p6[0] == KB_SYN || p6[0] != KBStartSign) && Len1 > 1) |
| | | { |
| | | p1=(pKBPacket)(p6+1); |
| | | Len1--; |
| | | } |
| | | |
| | | int DataLen=p1->DataLen; |
| | | KBusChnStats[nCurPollId].RecvPackets++; |
| | | pKBPacket p2=(pKBPacket)PacketBuf2; |
| | | int PacketLen=0; |
| | | pKBus->KBusChnStats[pKBus->nCurPollId].RecvPackets++; |
| | | // pKBPacket p2=(pKBPacket)PacketBuf2; |
| | | // int PacketLen=0; |
| | | //LL_GPIO_TogglePin(GPIOA,LL_GPIO_PIN_6); |
| | | int nCurPollId = pKBus->nCurPollId; |
| | | int ChildId=p1->SrcAddr; |
| | | // int ThisuS = GetuS(); |
| | | int ThisTick = GetTick(); |
| | | unsigned char nIndex; |
| | | switch (p1->nCMD) |
| | | { |
| | | |
| | | case cmdNone: |
| | | break; |
| | | case cmdQueryRply: |
| | | DataLen=sizeof(stDeviceInfo); |
| | | KBusUpdateChildInfo(pKBus,nCurPollId,(stDeviceInfo *)&p1->data[0]); |
| | | pKBus->KBusChnStats[nCurPollId].ClientSendPkts++; |
| | | break; |
| | | case cmdSetCfgRply: |
| | | break; |
| | | case cmdToRunModeRply: |
| | | break; |
| | | case cmdBroadCastCfg: |
| | | break; |
| | | case cmdMuExchgDataRply: |
| | | break; |
| | | case cmdToSafeMode: |
| | | break; |
| | | case cmdReHeartBeat: |
| | | break; |
| | | |
| | | case cmdPing: |
| | | BufferIn[ChildId]=p1->data[0]; |
| | | PacketLen=KBusMakePacket(p2,0,nCurPollId,cmdPingReply,p1->nStatus,DataLen,p1->data); |
| | | SendPacket(nChn, p2, PacketLen); |
| | | break; |
| | | case cmdPingReply: |
| | | KBusDelayuS=ThisuS-KBusSendTimeuS; |
| | | if (KBusDelayuS > KBusMaxDelayuS) KBusMaxDelayuS = KBusDelayuS; |
| | | pKBus->DelayTick = ThisTick - pKBus->SendTimeTick; |
| | | if (pKBus->DelayTick > pKBus->nMaxDelayTick) pKBus->nMaxDelayTick = pKBus->DelayTick; |
| | | |
| | | BufferIn[ChildId]=p1->data[0]; |
| | | KBusMem.WLXB[ChildId]=p1->data[0]; |
| | | |
| | | //RunStat=100; |
| | | KBusChnStats[nCurPollId].CtnLstPkts=0; |
| | | KBusChnStats[nCurPollId].Delay=KBusDelayuS; |
| | | if (KBusDelayuS > KBusChnStats[nCurPollId].MaxDelay) |
| | | KBusChnStats[nCurPollId].MaxDelay=KBusDelayuS; |
| | | pKBus->KBusChnStats[nCurPollId].CtnLstPkts=0; |
| | | pKBus->KBusChnStats[nCurPollId].Delay=pKBus->DelayTick; |
| | | if (pKBus->DelayTick > pKBus->KBusChnStats[nCurPollId].MaxDelay) |
| | | pKBus->KBusChnStats[nCurPollId].MaxDelay=pKBus->DelayTick; |
| | | //PutOutput(outputvalue); |
| | | KBusMasterRecvOK=1; |
| | | pKBus->bMasterRecvOK=1; |
| | | break; |
| | | case cmdRead: |
| | | break; |
| | |
| | | case cmdWrite: |
| | | break; |
| | | case cmdWriteReply: |
| | | KBusMasterRecved=1; |
| | | pKBus->bMasterRecved=1; |
| | | break; |
| | | case cmdGetVersion: |
| | | break; |
| | | case cmdVerInfo: |
| | | break; |
| | | case cmdExChgData: |
| | | BufferIn[0]=p1->data[0]; |
| | | //PutOutput(outputvalue); |
| | | //memcpy(DispBuf,p1->data+2,8); |
| | | p1->data[0]=BufferOut[0]; |
| | | PacketLen=KBusMakePacket(p2,nStationID,0,cmdExChgDataReply,p1->nStatus,DataLen,p1->data); |
| | | SendPacket(nChn, p2, PacketLen); |
| | | case cmdUniExChgData: |
| | | |
| | | break; |
| | | case cmdExChgDataReply: |
| | | KBusDelayuS=ThisuS-KBusSendTimeuS; |
| | | if (KBusDelayuS > KBusMaxDelayuS) KBusMaxDelayuS = KBusDelayuS; |
| | | |
| | | #if (BOARD_TYPE == 14) |
| | | BufferIn[ChildId]=p1->data[0]; |
| | | BufferIn[ChildId + 1] = p1->data[1]; |
| | | BufferIn[ChildId + 2 ] = p1->data[2]; |
| | | |
| | | KMem.WXB[ChildId-1]=BufferIn[ChildId]; |
| | | KMem.WXB[ChildId]=BufferIn[ChildId+1]; |
| | | KMem.WXB[ChildId+1]=BufferIn[ChildId+2]; |
| | | |
| | | if (KMRunStat.WorkMode==0) { |
| | | // KMem.WY[0]= KMem.WX[1]+(KMem.WX[2]<<8) ; |
| | | // PutOutput (KMem.WY[0]); |
| | | pKBus->DelayTick = ThisTick - pKBus->SendTimeTick; |
| | | if (pKBus->DelayTick > pKBus->nMaxDelayTick) pKBus->nMaxDelayTick = pKBus->DelayTick; |
| | | KBusMem.WLXB[ChildId - 1 ]=p1->data[0]; |
| | | for (int i=1; i*8 < pKBus->DeviceInfos[ChildId].InBitCount;i++){ |
| | | KBusMem.WLXB[ChildId - 1 + i]=p1->data[0 + i];; |
| | | } |
| | | #else |
| | | BufferIn[ChildId]=p1->data[0]; |
| | | KMem.WLX[ChildId]=BufferIn[ChildId]; |
| | | if (KMRunStat.WorkMode==0) { |
| | | KMem.WY[0]= KMem.WLX[1]+(KMem.WLX[2]<<8) ; |
| | | PutOutput (KMem.WY[0]); |
| | | } |
| | | #endif |
| | | |
| | | // KBusMem.WLXB[ChildId+0]=p1->data[1]; |
| | | // KBusMem.WLXB[ChildId+1]=p1->data[2]; |
| | | // KBusMem.WLXB[ChildId+2]=p1->data[3];; |
| | | // KBusMem.WLXB[ChildId+3]=p1->data[4]; |
| | | // KBusMem.WLXB[ChildId+4]=p1->data[5]; |
| | | // KBusMem.WLXB[ChildId+5]=p1->data[6]; |
| | | // KBusMem.WLXB[ChildId+6]=p1->data[7]; |
| | | //Call Back |
| | | if (pKBus->KBusEvCBFunc) pKBus->KBusEvCBFunc(pKBus, KBusEvDataUpdate,0,0); |
| | | //RunStat=100; |
| | | KBusChnStats[nCurPollId].CtnLstPkts=0; |
| | | KBusChnStats[nCurPollId].Delay=KBusDelayuS; |
| | | if (KBusDelayuS > KBusChnStats[nCurPollId].MaxDelay) |
| | | KBusChnStats[nCurPollId].MaxDelay=KBusDelayuS; |
| | | pKBus->KBusChnStats[nCurPollId].CtnLstPkts=0; |
| | | pKBus->KBusChnStats[nCurPollId].Delay=pKBus->DelayTick; |
| | | if (pKBus->DelayTick > pKBus->KBusChnStats[nCurPollId].MaxDelay) |
| | | pKBus->KBusChnStats[nCurPollId].MaxDelay=pKBus->DelayTick; |
| | | //PutOutput(outputvalue); |
| | | |
| | | |
| | | nIndex=p1->data[3]; |
| | | KBusChnStats[nCurPollId].ClientDatas[nIndex]=p1->data[4]|(p1->data[5]<<8)|(p1->data[6]<<16)|(p1->data[7]<<24); |
| | | |
| | | KBusMasterRecvOK=1; |
| | | if (DataLen>=14) { |
| | | nIndex=p1->data[9]; |
| | | pKBus->KBusChnStats[nCurPollId].ClientDatas[nIndex]=p1->data[10]|(p1->data[11]<<8)|(p1->data[12]<<16)|(p1->data[13]<<24); |
| | | } |
| | | pKBus->bMasterRecvOK=1; |
| | | |
| | | break; |
| | | |
| | | case cmdRemoteReqReply: |
| | | pKBus->bReq = 2; |
| | | |
| | | break; |
| | | default: |
| | | break; |
| | | } |
| | |
| | | return 0; |
| | | } |
| | | |
| | | unsigned char nClientDataIndex=0; |
| | | int KBusSlaveParsePacket(int nChn, pKBPacket p1, int Len1) |
| | | int KBusSlaveParsePacket(stKBusDef * pKBus, pKBPacket p1, int Len1) |
| | | { |
| | | unsigned char * p3 = (unsigned char *)p1; |
| | | if (p3[0] == SYN && Len1 > 1) |
| | | if (p3[0] == KB_SYN && Len1 > 1) |
| | | { |
| | | p1=(pKBPacket)(p3+1); |
| | | Len1--; |
| | | } |
| | | |
| | | Uart2Stat.OKPacket++; |
| | | int DataLen=p1->DataLen; |
| | | // Uart2Stat.OKPacket++; |
| | | unsigned short Addr; |
| | | unsigned short DataLen=p1->DataLen; |
| | | //int nSrcAddr=p1->SrcAddr; |
| | | int nDstHost=p1->DstHost; |
| | | |
| | | // KBusRecvTimeuS=ThisuS; |
| | | // KBusSlaveRecved=1; |
| | | |
| | | pKBPacket p2=(pKBPacket)PacketBuf2; |
| | | |
| | | pKBPacket p2=(pKBPacket)pKBus->PacketBuf2; |
| | | void * pData = 0; |
| | | int PacketLen=0; |
| | | unsigned char nIndex;// = p1->nStatus & 0x07; |
| | | if (nDstHost!=nStationID && nDstHost != 0xff) |
| | | if (nDstHost!=pKBus->nStationId && nDstHost != 0xff) |
| | | { |
| | | KBusChnStats[0].ClientMisIdPkts++; |
| | | pKBus->KBusChnStats[0].ClientMisIdPkts++; |
| | | return -1; |
| | | } |
| | | if (nDstHost==nStationID || nDstHost==0xff) |
| | | { |
| | | KBusRecvTimeuS=ThisuS; |
| | | KBusSlaveRecved=1; |
| | | // int ThisuS = GetuS(); |
| | | int ThisTick = GetTick(); |
| | | if (nDstHost==0xff){ |
| | | pKBus->RecvTimeTick=ThisTick; |
| | | pKBus->bSlaveRecved=1; |
| | | switch (p1->nCMD) |
| | | { |
| | | case cmdNone: |
| | | break; |
| | | case cmdBroadCastCfg: |
| | | |
| | | break; |
| | | case cmdMuExchgData: |
| | | |
| | | break; |
| | | case cmdToSafeMode: |
| | | |
| | | break; |
| | | case cmdHeartBeat: |
| | | break; |
| | | case cmdSyncRead: |
| | | break; |
| | | case cmdSyncWrite: |
| | | break; |
| | | case cmdSequenRead: |
| | | break; |
| | | case cmdSyncTime: |
| | | pKBus->nSlaveTick=p1->data[0]+(p1->data[1]<<8)+(p1->data[2]<<16)+(p1->data[3]<<24); |
| | | if (pKBus->KBusEvCBFunc) pKBus->KBusEvCBFunc(pKBus, KBusEvTimeSync,0,0); |
| | | break; |
| | | case cmdRemoteReq: //收到Remote请求 |
| | | // KBusSlaveRunRemoteReq(pKBus,p1->data[0],p1->data, DataLen); |
| | | // data[0] -> reqSvr; |
| | | // data[1] -> param; |
| | | switch (p1->data[0]) { |
| | | case ReqBlinkLED: |
| | | case ReqTransBlink: |
| | | KMRunStat.bLEDFlick=p1->data[1]; |
| | | DataLen = 0; |
| | | PacketLen=KBusMakePacket(p2,pKBus->nStationId,0,cmdRemoteReqReply,p1->nStatus,DataLen,p1->data); |
| | | pKBus->KBusSendPacket((uchar *)p2, PacketLen); |
| | | break; |
| | | case ReqUpdateFirm: //37个字节 |
| | | DataLen = 0; |
| | | PacketLen=KBusMakePacket(p2,pKBus->nStationId,0,cmdRemoteReqReply,p1->nStatus,DataLen,p1->data); |
| | | pKBus->KBusSendPacket((uchar *)p2, PacketLen); |
| | | pData = &p1->data[5]; |
| | | Addr = p1->data[2] + (p1->data[3] <<8); |
| | | DataLen = p1->data[4] ; |
| | | KMRunService(p1->data[0],Addr,0,&pData,&DataLen); |
| | | DataLen=0; |
| | | break; |
| | | case ReqUpdateFirmInfo: |
| | | DataLen = 0; |
| | | PacketLen=KBusMakePacket(p2,pKBus->nStationId,0,cmdRemoteReqReply,p1->nStatus,DataLen,p1->data); |
| | | pKBus->KBusSendPacket((uchar *)p2, PacketLen); |
| | | pData = &p1->data[5]; |
| | | Addr = p1->data[2] + (p1->data[3] <<8); |
| | | DataLen = p1->data[4] ; |
| | | KMRunService(p1->data[0],Addr,0,&pData,&DataLen); |
| | | DataLen=0; |
| | | break; |
| | | default: |
| | | pData = &p1->data[5]; |
| | | Addr = p1->data[2] + (p1->data[3] <<8); |
| | | DataLen = p1->data[4] ; |
| | | KMRunService(p1->data[0],p1->data[1],0,&pData,&DataLen); |
| | | DataLen = 0; |
| | | PacketLen=KBusMakePacket(p2,pKBus->nStationId,0,cmdRemoteReqReply,p1->nStatus,DataLen,p1->data); |
| | | pKBus->KBusSendPacket((uchar *)p2, PacketLen); |
| | | DataLen=0; |
| | | |
| | | break; |
| | | } |
| | | break; |
| | | default: |
| | | break; |
| | | } |
| | | |
| | | } |
| | | |
| | | if (nDstHost==pKBus->nStationId) |
| | | { |
| | | pKBus->RecvTimeTick=ThisTick; |
| | | pKBus->bSlaveRecved=1; |
| | | switch (p1->nCMD) |
| | | { |
| | | case cmdNone: |
| | | break; |
| | | case cmdQuery: |
| | | DataLen=sizeof(stDeviceInfo); |
| | | PacketLen=KBusMakePacket(p2,pKBus->nStationId,0,cmdQueryRply,p1->nStatus,DataLen,pKBus->pMyDeviceInfo); |
| | | pKBus->KBusChnStats[0].ClientSendPkts++; |
| | | pKBus->KBusSendPacket((uchar *)p2, PacketLen); |
| | | break; |
| | | case cmdSetCfg: |
| | | break; |
| | | case cmdToRunMode: |
| | | break; |
| | | case cmdBroadCastCfg: |
| | | break; |
| | | case cmdMuExchgData: |
| | | break; |
| | | case cmdToSafeMode: |
| | | break; |
| | | case cmdHeartBeat: |
| | | break; |
| | | |
| | | case cmdPing: |
| | | BufferIn[0]=p1->data[0]; |
| | | KBusMem.WLYB[0]=p1->data[0]; |
| | | //PutOutput(outputvalue); |
| | | //memcpy(DispBuf,p1->data+2,8); |
| | | p1->data[0]=BufferOut[0]; |
| | | KBusRecvTimeuS=ThisuS; |
| | | PacketLen=KBusMakePacket(p2,nStationID,0,cmdPingReply,p1->nStatus,DataLen,p1->data); |
| | | KBusChnStats[0].ClientSendPkts++; |
| | | SendPacket(nChn, p2, PacketLen); |
| | | p1->data[0]=KBusMem.WLXB[0]; |
| | | //pKBus->RecvTimeuS=ThisuS; |
| | | PacketLen=KBusMakePacket(p2,pKBus->nStationId,0,cmdPingReply,p1->nStatus,DataLen,p1->data); |
| | | pKBus->KBusChnStats[0].ClientSendPkts++; |
| | | pKBus->KBusSendPacket((uchar *)p2, PacketLen); |
| | | break; |
| | | case cmdPingReply: |
| | | break; |
| | |
| | | case cmdWrite: |
| | | //memcpy(DispBuf,p1->data,DataLen); |
| | | PacketLen=KBusMakePacket(p2,1,0,cmdWriteReply,p1->nStatus,0,0); |
| | | KBusChnStats[0].ClientSendPkts++; |
| | | SendPacket(nChn, p2, PacketLen); |
| | | pKBus->KBusChnStats[0].ClientSendPkts++; |
| | | pKBus->KBusSendPacket((uchar *)p2, PacketLen); |
| | | break; |
| | | case cmdWriteReply: |
| | | break; |
| | |
| | | break; |
| | | case cmdVerInfo: |
| | | break; |
| | | case cmdExChgData: |
| | | BufferIn[0]=p1->data[0]; |
| | | BufferIn[1]=p1->data[1]; |
| | | // KMem.WLYB[1] = BufferIn[1]; |
| | | |
| | | KMem.WYB[1] = BufferIn[1]; |
| | | nSlaveTick=p1->data[4]+(p1->data[5]<<8);//+(p1->data[6]<<16)+(p1->data[7]<<24); |
| | | #if (BOARD_TYPE == 14) |
| | | // PutOutput(BufferIn[0]); |
| | | //PutOutput(outputvalue); |
| | | //memcpy(DispBuf,p1->data+2,8); |
| | | nIndex=nClientDataIndex; |
| | | // KBusChnStats[0].ClientDatas[7]++; |
| | | // BufferOut[0]=GetInput(); |
| | | // BufferOut[0]=GetInput(); |
| | | #else |
| | | PutOutput(BufferIn[0]); |
| | | //PutOutput(outputvalue); |
| | | //memcpy(DispBuf,p1->data+2,8); |
| | | nIndex=nClientDataIndex; |
| | | // KBusChnStats[0].ClientDatas[7]++; |
| | | // BufferOut[0]=GetInput(); |
| | | BufferOut[0]=GetInput(); |
| | | BufferOut[1]=KMem.WXB[1]; |
| | | #endif |
| | | p1->data[0]=BufferOut[0]; |
| | | p1->data[1]=BufferOut[1]; |
| | | |
| | | p1->data[3]=nIndex; |
| | | p1->data[4]=KBusChnStats[0].ClientDatas[nIndex]; |
| | | p1->data[5]=KBusChnStats[0].ClientDatas[nIndex]>>8; |
| | | p1->data[6]=KBusChnStats[0].ClientDatas[nIndex]>>16; |
| | | p1->data[7]=KBusChnStats[0].ClientDatas[nIndex]>>24; |
| | | nClientDataIndex++; |
| | | if (nClientDataIndex >= 10) { nClientDataIndex=0;} |
| | | case cmdUniExChgData: |
| | | KBusMem.WLYB[0]=p1->data[0]; |
| | | KBusMem.WLYB[1]=p1->data[1]; |
| | | KBusMem.WLYB[2]=p1->data[2]; |
| | | KBusMem.WLYB[3]=p1->data[3]; |
| | | |
| | | // pKBus->nSlaveTick=p1->data[4]+(p1->data[5]<<8);//+(p1->data[6]<<16)+(p1->data[7]<<24); |
| | | |
| | | if (pKBus->KBusEvCBFunc) pKBus->KBusEvCBFunc(pKBus, KBusEvTimeSync,0,0); |
| | | |
| | | if (pKBus->KBusEvCBFunc) pKBus->KBusEvCBFunc(pKBus, KBusEvDataUpdate,0,0); |
| | | |
| | | nIndex=pKBus->nClientDataIndex; |
| | | p1->data[0]=KBusMem.WLXB[0]; |
| | | p1->data[1]=KBusMem.WLXB[1]; |
| | | p1->data[2]=KBusMem.WLXB[2]; |
| | | p1->data[3]=KBusMem.WLXB[3]; |
| | | p1->data[4]=KBusMem.WLXB[4]; |
| | | p1->data[5]=KBusMem.WLXB[5]; |
| | | p1->data[6]=KBusMem.WLXB[6]; |
| | | p1->data[7]=KBusMem.WLXB[7]; |
| | | |
| | | p1->data[9]=nIndex; |
| | | p1->data[10]=pKBus->KBusChnStats[0].ClientDatas[nIndex]; |
| | | p1->data[11]=pKBus->KBusChnStats[0].ClientDatas[nIndex]>>8; |
| | | p1->data[12]=pKBus->KBusChnStats[0].ClientDatas[nIndex]>>16; |
| | | p1->data[13]=pKBus->KBusChnStats[0].ClientDatas[nIndex]>>24; |
| | | pKBus->nClientDataIndex++; |
| | | DataLen = 14; |
| | | if (pKBus->nClientDataIndex >= 10) { pKBus->nClientDataIndex=0;} |
| | | unStatus nStatus; |
| | | nStatus.nStatus = p1->nStatus; |
| | | if (nStatus.nErr1) { KMem.ErrStat=8000;} |
| | | PacketLen=KBusMakePacket(p2,nStationID,0,cmdExChgDataReply,p1->nStatus,DataLen,p1->data); |
| | | KBusChnStats[0].ClientSendPkts++; |
| | | SendPacket(nChn, p2, PacketLen); |
| | | if (nStatus.nErr1) { pKBus->ErrStat=8100;} |
| | | PacketLen=KBusMakePacket(p2,pKBus->nStationId,0,cmdExChgDataReply,p1->nStatus,DataLen,p1->data); |
| | | pKBus->KBusChnStats[0].ClientSendPkts++; |
| | | pKBus->KBusSendPacket((uchar *)p2, PacketLen); |
| | | break; |
| | | case cmdExChgDataReply: |
| | | break; |
| | |
| | | case cmdSequenRead: |
| | | break; |
| | | case cmdSyncTime: |
| | | nSlaveTick=p1->data[0]+(p1->data[1]<<8)+(p1->data[2]<<16)+(p1->data[3]<<24); |
| | | break; |
| | | |
| | | case cmdRemoteReq: //收到Remote请求 |
| | | // KBusSlaveRunRemoteReq(pKBus,p1->data[0],p1->data, DataLen); |
| | | // data[0] -> reqSvr; |
| | | // data[1] -> param; |
| | | switch (p1->data[0]) { |
| | | case ReqBlinkLED: |
| | | case ReqTransBlink: |
| | | KMRunStat.bLEDFlick=p1->data[1]; |
| | | DataLen = 0; |
| | | PacketLen=KBusMakePacket(p2,pKBus->nStationId,0,cmdRemoteReqReply,p1->nStatus,DataLen,p1->data); |
| | | pKBus->KBusSendPacket((uchar *)p2, PacketLen); |
| | | break; |
| | | case ReqUpdateFirm: //37个字节 |
| | | DataLen = 0; |
| | | PacketLen=KBusMakePacket(p2,pKBus->nStationId,0,cmdRemoteReqReply,p1->nStatus,DataLen,p1->data); |
| | | pKBus->KBusSendPacket((uchar *)p2, PacketLen); |
| | | pData = &p1->data[5]; |
| | | Addr = p1->data[2] + (p1->data[3] <<8); |
| | | DataLen = p1->data[4] ; |
| | | KMRunService(p1->data[0],Addr,0,&pData,&DataLen); |
| | | DataLen=0; |
| | | break; |
| | | case ReqUpdateFirmInfo: |
| | | DataLen = 0; |
| | | PacketLen=KBusMakePacket(p2,pKBus->nStationId,0,cmdRemoteReqReply,p1->nStatus,DataLen,p1->data); |
| | | pKBus->KBusSendPacket((uchar *)p2, PacketLen); |
| | | pData = &p1->data[5]; |
| | | Addr = p1->data[2] + (p1->data[3] <<8); |
| | | DataLen = p1->data[4] ; |
| | | KMRunService(p1->data[0],Addr,0,&pData,&DataLen); |
| | | DataLen=0; |
| | | break; |
| | | default: |
| | | pData = &p1->data[5]; |
| | | Addr = p1->data[2] + (p1->data[3] <<8); |
| | | DataLen = p1->data[4] ; |
| | | KMRunService(p1->data[0],p1->data[1],0,&pData,&DataLen); |
| | | DataLen = 0; |
| | | PacketLen=KBusMakePacket(p2,pKBus->nStationId,0,cmdRemoteReqReply,p1->nStatus,DataLen,p1->data); |
| | | pKBus->KBusSendPacket((uchar *)p2, PacketLen); |
| | | DataLen=0; |
| | | |
| | | break; |
| | | } |
| | | break; |
| | | |
| | | default: |
| | | break; |
| | | } |
| | |
| | | return 0; |
| | | } |
| | | |
| | | int KBusParsePacket(int nChn, pKBPacket p1, int Len1) |
| | | int KBusSlaveRunRemoteReq(stKBusDef * pKBus, int nReqSvrId, unsigned char * pData , int Len1) |
| | | { |
| | | ThisuS=GetuS(); |
| | | int PacketLen; |
| | | switch (nReqSvrId) { |
| | | case ReqTransBlink: |
| | | KMRunStat.bLEDFlick=5; |
| | | // PacketLen=KBusMakePacket(pKBus->PacketBuf2,pKBus->nStationId,0,cmdRemoteReq,p1->nStatus,DataLen,p1->data); |
| | | break; |
| | | default: |
| | | break; |
| | | } |
| | | return 0; |
| | | } |
| | | |
| | | int KBusParsePacket(stKBusDef * pKBus, pKBPacket p1, int Len1) |
| | | { |
| | | int ThisuS=GetuS(); |
| | | int Result=0; |
| | | unsigned char * p2 = (unsigned char *)p1; |
| | | if (p2[0] == SYN && Len1 > 1) |
| | | if (p2[0] == KB_SYN && Len1 > 1) |
| | | { |
| | | p1=(pKBPacket)(p2+1); |
| | | Len1--; |
| | | } |
| | | |
| | | if (bKBusMaster) |
| | | if (pKBus->bMaster) |
| | | { |
| | | KBusMasterRecved=1; |
| | | Result=KBusCheckPacket(nChn, p1, Len1); |
| | | pKBus->bMasterRecved=1; |
| | | Result=KBusCheckPacket(pKBus, p1, Len1); |
| | | if (Result != S_OK) |
| | | { |
| | | |
| | | return Result; |
| | | } |
| | | KBusMasterRecvOK=1; |
| | | Result=KBusMasterParsePacket(nChn, p1, Len1); |
| | | pKBus->bMasterRecvOK=1; |
| | | Result=KBusMasterParsePacket(pKBus, p1, Len1); |
| | | return Result; |
| | | } |
| | | if (bKBusSlave) |
| | | if (pKBus->bSlave) |
| | | { |
| | | KBusChnStats[0].ClientRecvPkts++; |
| | | Result=KBusSlaveCheckPacket(nChn, p1, Len1); |
| | | pKBus->KBusChnStats[0].ClientRecvPkts++; |
| | | Result=KBusSlaveCheckPacket(pKBus, p1, Len1); |
| | | if (Result != S_OK) |
| | | { |
| | | return Result; |
| | | } |
| | | KBusChnStats[0].ClientTimeOutErr=KMem.RunStat; |
| | | Result=KBusSlaveParsePacket(nChn, p1, Len1); |
| | | pKBus->KBusChnStats[0].ClientTimeOutErr=pKBus->RunStat; |
| | | Result=KBusSlaveParsePacket(pKBus, p1, Len1); |
| | | return Result; |
| | | } |
| | | //int len1=p1->PacketLen; |
| | |
| | | return S_OK; |
| | | } |
| | | */ |
| | | int KBusRepeaterFunc(int nChn) |
| | | |
| | | |
| | | |
| | | unsigned char KBusBCC(void * pData, int nSize) |
| | | { |
| | | KMem.WY[0]=KMem.WX[0]; |
| | | if ((KMem.nRunCount &0x7f) == 88) |
| | | { |
| | | nCount2++; |
| | | ToggleRunLed(); |
| | | // int len1=sprintf(str1,"%d %d Cfg %02X Input %02X \r\n",nCount,nCount2,EffJumperSW,MyKeyStat1); |
| | | // PutStr(str1,len1); |
| | | } |
| | | return 0; |
| | | } |
| | | |
| | | int KBusMasterFunc(int nChn) |
| | | { |
| | | uint32_t tick1=HAL_GetTick(); |
| | | uint32_t thisuS=GetuS(); |
| | | |
| | | int len1=0; |
| | | |
| | | if ((KBusMasterRecved && KBusMasterRecvOK && thisuS-KBusSendTimeuS>50) || thisuS-KBusSendTimeuS>1000u) |
| | | { |
| | | if (!KBusMasterRecvOK) |
| | | { |
| | | TimeOutCount++; |
| | | Uart2Stat.TimeOutErr++; |
| | | KBusChnStats[nCurPollId].LostPackets++; |
| | | KBusChnStats[nCurPollId].CtnLstPkts++; |
| | | if (!KBusMasterRecved) {KBusChnStats[nCurPollId].TimeOutErr++;} |
| | | if (KBusChnStats[nCurPollId].CtnLstPkts>KBusChnStats[nCurPollId].MaxCtnLstPkts) |
| | | {KBusChnStats[nCurPollId].MaxCtnLstPkts=KBusChnStats[nCurPollId].CtnLstPkts;} |
| | | if (KBusChnStats[nCurPollId].CtnLstPkts>3) |
| | | { |
| | | KBusChnStats[nCurPollId].Stat=0; |
| | | KMem.ErrStat=200; |
| | | #if (BOARD_TYPE == 14) |
| | | BufferIn[nCurPollId]=0; |
| | | KMem.WXB[nCurPollId-1]=BufferIn[nCurPollId]; |
| | | #else |
| | | {BufferIn[nCurPollId]=0; |
| | | KMem.WLX[nCurPollId]=BufferIn[nCurPollId]; |
| | | } |
| | | #endif |
| | | } |
| | | // LL_GPIO_SetOutputPin(GPIOA,LL_GPIO_PIN_7); |
| | | }else |
| | | { |
| | | KBusChnStats[nCurPollId].Stat=1; |
| | | |
| | | KMem.RunStat=100; |
| | | } |
| | | nCurPollId ++; |
| | | if (nCurPollId > nChilds) |
| | | { |
| | | CircleTime=thisuS-LastCircleStartTime; |
| | | LastCircleStartTime=thisuS; |
| | | nSeq++; |
| | | nCurPollId=1; |
| | | } |
| | | #if (BOARD_TYPE == 14) |
| | | if (KMRunStat.WorkMode==0) |
| | | { |
| | | // KMem.WX[0]= GetInput(); |
| | | // KMem.WY[1]=KMem.WX[0]&0xff; |
| | | // KMem.WY[2]=(KMem.WX[0]>>8)&0xff; |
| | | } |
| | | // BufferOut[1]=KMem.WY[1]; |
| | | // BufferOut[2]=KMem.WY[2]; |
| | | #else |
| | | if (KMRunStat.WorkMode==0) |
| | | { |
| | | KMem.WX[0]= GetInput(); |
| | | KMem.WLY[1]=KMem.WX[0]&0xff; |
| | | KMem.WLY[2]=(KMem.WX[0]>>8)&0xff; |
| | | } |
| | | BufferOut[1]=KMem.WLY[1]; |
| | | BufferOut[2]=KMem.WLY[2]; |
| | | #endif |
| | | |
| | | Datas[0]=BufferOut[nCurPollId]; |
| | | Datas[1]=BufferOut[nCurPollId+1];; |
| | | Datas[2]=KBusChnStats[nCurPollId].Stat; |
| | | Datas[3]=0; |
| | | Datas[4]=tick1&0xff; |
| | | Datas[5]=(tick1>>8)&0xff; |
| | | Datas[6]=(tick1>>16)&0xff; |
| | | Datas[7]=(tick1>>24)&0xff; |
| | | |
| | | KBusSendTimeuS=thisuS; |
| | | unStatus nStatus; |
| | | nStatus.nSeq = nSeq; |
| | | nStatus.nErr1 = (KBusChnStats[nCurPollId].Stat==0); |
| | | |
| | | |
| | | len1=KBusMakePacket((pKBPacket)PacketBuf1,0,nCurPollId,cmdExChgData,nStatus.nStatus,8,Datas); |
| | | // LL_USART_SetBaudRate(USART2,48000000,LL_USART_OVERSAMPLING_8,DefaultUart2Baud); |
| | | |
| | | SendPacket(nChn, (pKBPacket)PacketBuf1, len1); |
| | | KBusChnStats[nCurPollId].SendPackets++; |
| | | KBusChnStats[nCurPollId].SendTimeInterval=KBusSendTimeuS-KBusChnStats[nCurPollId].LastSentTimeuS; |
| | | KBusChnStats[nCurPollId].LastSentTimeuS=KBusSendTimeuS; |
| | | // PacketLength = len1; |
| | | SendTime=tick1; |
| | | |
| | | KBusMasterRecved=0; |
| | | KBusMasterRecvOK=0; |
| | | // LL_GPIO_TogglePin(GPIOA,LL_GPIO_PIN_5); |
| | | //ToggleErrLed(); |
| | | // ToggleOut8(); |
| | | |
| | | } |
| | | |
| | | // Clk3=SysTick->VAL; |
| | | // LL_GPIO_TogglePin(GPIOA,LL_GPIO_PIN_4); |
| | | // HAL_Delay(1); |
| | | return 0; |
| | | } |
| | | |
| | | int KBusSlaveFunc(int nChn) |
| | | { |
| | | int ThisuS=GetuS(); |
| | | int thisRecvTime=KBusRecvTimeuS; |
| | | if (nStationID >0) { |
| | | if (KBusSlaveRecved) |
| | | { |
| | | KMem.RunStat=8000; |
| | | KBusSlaveRecved=0; |
| | | }else if ((ThisuS - thisRecvTime) >12000u) |
| | | { |
| | | KMem.ErrStat=8000; |
| | | KMem.SDD[17]=1; |
| | | KMem.SDD[18]=ThisuS; |
| | | KMem.SDD[19]=KBusRecvTimeuS; |
| | | }else if ( ThisuS > (thisRecvTime + 12000u)) |
| | | { |
| | | KMem.ErrStat=8000; |
| | | KMem.SDD[17]=2; |
| | | KMem.SDD[18]=ThisuS; |
| | | KMem.SDD[19]=KBusRecvTimeuS; |
| | | } |
| | | unsigned char k; |
| | | k=0; |
| | | for (int i=0;i<nSize;i++) |
| | | { |
| | | k^=((unsigned char *)pData)[i]; |
| | | } |
| | | return 0; |
| | | return k; |
| | | } |
| | | |
| | | int KBusMakePacket(pKBPacket p1,unsigned char src, uchar dst, uchar nType,unsigned char nStatus, unsigned char DataLen,void * pData ) |
| | | { |
| | | p1->Sign=KBStartSign; |
| | | p1->DstHost=dst; |
| | | p1->SrcAddr=src; |
| | | p1->nCMD=nType; |
| | | p1->nStatus=nStatus; |
| | | int PacketLenth=0; |
| | | switch (nType) |
| | | { |
| | | case cmdNone: |
| | | break; |
| | | case cmdPing: |
| | | p1->DataLen=DataLen; |
| | | memcpy(p1->data,pData,DataLen); |
| | | p1->data[DataLen]=KBusBCC(p1,sizeof(stKBPacket)+DataLen-1); |
| | | p1->data[DataLen+1]=KBEndSign; |
| | | PacketLenth=sizeof(stKBPacket)+DataLen+1; |
| | | break; |
| | | case cmdPingReply: |
| | | p1->DataLen=DataLen; |
| | | memcpy(p1->data,pData,DataLen); |
| | | p1->data[DataLen]=KBusBCC(p1,sizeof(stKBPacket)+DataLen-1); |
| | | p1->data[DataLen+1]=KBEndSign; |
| | | PacketLenth=sizeof(stKBPacket)+DataLen+1; |
| | | break; |
| | | case cmdRead: |
| | | break; |
| | | case cmdReadReply: |
| | | break; |
| | | case cmdWrite: |
| | | break; |
| | | case cmdWriteReply: |
| | | p1->DataLen=DataLen; |
| | | if (DataLen !=0 ) memcpy(p1->data,pData,DataLen); |
| | | p1->data[DataLen]=KBusBCC(p1,sizeof(stKBPacket)+DataLen-1); |
| | | p1->data[DataLen+1]=KBEndSign; |
| | | PacketLenth=sizeof(stKBPacket)+DataLen+1; |
| | | break; |
| | | case cmdGetVersion: |
| | | p1->DataLen=DataLen; |
| | | memcpy(p1->data,pData,DataLen); |
| | | p1->data[DataLen]=KBusBCC(p1,sizeof(stKBPacket)+DataLen-1); |
| | | p1->data[DataLen+1]=KBEndSign; |
| | | PacketLenth=sizeof(stKBPacket)+DataLen+1; |
| | | break; |
| | | case cmdVerInfo: |
| | | p1->DataLen=DataLen; |
| | | memcpy(p1->data,pData,DataLen); |
| | | p1->data[DataLen]=KBusBCC(p1,sizeof(stKBPacket)+DataLen-1); |
| | | p1->data[DataLen+1]=KBEndSign; |
| | | PacketLenth=sizeof(stKBPacket)+DataLen+1; |
| | | break; |
| | | case cmdUniExChgData: |
| | | p1->DataLen=DataLen; |
| | | memcpy(p1->data,pData,DataLen); |
| | | p1->data[DataLen]=KBusBCC(p1,sizeof(stKBPacket)+DataLen-1); |
| | | p1->data[DataLen+1]=KBEndSign; |
| | | PacketLenth=sizeof(stKBPacket)+DataLen+1; |
| | | break; |
| | | case cmdExChgDataReply: |
| | | p1->DataLen=DataLen; |
| | | memcpy(p1->data,pData,DataLen); |
| | | p1->data[DataLen]=KBusBCC(p1,sizeof(stKBPacket)+DataLen-1); |
| | | p1->data[DataLen+1]=KBEndSign; |
| | | PacketLenth=sizeof(stKBPacket)+DataLen+1; |
| | | break; |
| | | |
| | | case cmdSyncRead: |
| | | p1->DataLen=DataLen; |
| | | memcpy(p1->data,pData,DataLen); |
| | | p1->data[DataLen]=KBusBCC(p1,sizeof(stKBPacket)+DataLen-1); |
| | | p1->data[DataLen+1]=KBEndSign; |
| | | PacketLenth=sizeof(stKBPacket)+DataLen+1; |
| | | break; |
| | | case cmdSyncWrite: |
| | | p1->DataLen=DataLen; |
| | | memcpy(p1->data,pData,DataLen); |
| | | p1->data[DataLen]=KBusBCC(p1,sizeof(stKBPacket)+DataLen-1); |
| | | p1->data[DataLen+1]=KBEndSign; |
| | | PacketLenth=sizeof(stKBPacket)+DataLen+1; |
| | | break; |
| | | case cmdSequenRead: |
| | | p1->DataLen=DataLen; |
| | | memcpy(p1->data,pData,DataLen); |
| | | p1->data[DataLen]=KBusBCC(p1,sizeof(stKBPacket)+DataLen-1); |
| | | p1->data[DataLen+1]=KBEndSign; |
| | | PacketLenth=sizeof(stKBPacket)+DataLen+1; |
| | | break; |
| | | |
| | | case cmdSyncTime: |
| | | p1->DataLen=DataLen; |
| | | memcpy(p1->data,pData,DataLen); |
| | | p1->data[DataLen]=KBusBCC(p1,sizeof(stKBPacket)+DataLen-1); |
| | | p1->data[DataLen+1]=KBEndSign; |
| | | PacketLenth=sizeof(stKBPacket)+DataLen+1; |
| | | break; |
| | | |
| | | default: |
| | | p1->DataLen=DataLen; |
| | | memcpy(p1->data,pData,DataLen); |
| | | p1->data[DataLen]=KBusBCC(p1,sizeof(stKBPacket)+DataLen-1); |
| | | p1->data[DataLen+1]=KBEndSign; |
| | | PacketLenth=sizeof(stKBPacket)+DataLen+1; |
| | | break; |
| | | } |
| | | |
| | | return PacketLenth; |
| | | } |
| | | |