原文地址:http://blog.csdn.net/huangxianxinalice/article/details/9973951
- /
- /**
- \param abort SDO接近的结果
- \param command SDO的命令索引
- \param completeAccess 指示是否完成接近是需要的
- \param dataSize 响应对象数据的大小
- \param objLength 对象的完成的大小
- \param pSdoRes 邮箱缓存的指针
- \brief 这个函数被调用当SDO响应应该被发送
- *////
- void SdoRes(UINT8 abort, UINT8 command, UINT8 completeAccess, UINT16 dataSize, UINT32 objLength, TINITSDOMBX MBXMEM *pSdoRes)
- {
- /* 当上传响应,toggle bit 应该被覆盖 */
- if ((command != SDOSERVICE_UPLOADSEGMENTREQ) && (command != SDOSERVICE_DOWNLOADSEGMENTREQ))
- {
- pSdoRes->SdoHeader.Sdo[SDOHEADER_COMMANDOFFSET] = 0;
- }
- if ( abort == 0 )
- {
- /* SDO-Download or SDO-Upload 成功, 产生SDO和CoE的数据包头 */
- pSdoRes->CoeHeader &= ~COEHEADER_COESERVICEMASK;
- pSdoRes->CoeHeader |= ((UINT16)COESERVICE_SDORESPONSE) << COEHEADER_COESERVICESHIFT;
- if ( command == SDOSERVICE_INITIATEUPLOADREQ )
- {
- // HBu 06.02.06: Complete Access Bit in the SDO-Upload-Response too */
- if ( (objLength <= 4) && (objLength > 0) )
- {
- /* 快速上传响应 */
- pSdoRes->MbxHeader.Length = EXPEDITED_FRAME_SIZE;
- pSdoRes->SdoHeader.Sdo[SDOHEADER_COMMANDOFFSET] |= SDOHEADER_SIZEINDICATOR |
- SDOHEADER_TRANSFERTYPE |
- completeAccess |
- ((MAX_EXPEDITED_DATA - ((UINT8)objLength)) << SDOHEADERSHIFT_DATASETSIZE) |
- SDOSERVICE_INITIATEUPLOADRES;
- }
- else
- {
- /* 普通和分段上传响应 */
- #if SEGMENTED_SDO_SUPPORTED
- /*ECATCHANGE_START(V5.01) SDO3*/
- if (((dataSize < MBX_HEADER_SIZE + UPLOAD_NORM_RES_SIZE)) || (objLength > (UINT32)(dataSize - MBX_HEADER_SIZE - UPLOAD_NORM_RES_SIZE)) )
- /*ECATCHANGE_END(V5.01) SDO3*/
- {
- pSdoRes->MbxHeader.Length = SWAPWORD(UPLOAD_NORM_RES_SIZE+dataSize);
- }
- else
- #endif
- {
- pSdoRes->MbxHeader.Length = SWAPWORD(UPLOAD_NORM_RES_SIZE+((UINT16)objLength));
- }
- ((TINITSDOUPLOADNORMRESMBX MBXMEM *) pSdoRes)->CompleteSize[0] = SWAPWORD((UINT16)objLength);
- ((TINITSDOUPLOADNORMRESMBX MBXMEM *) pSdoRes)->CompleteSize[1] = SWAPWORD((UINT16)(objLength>>16));
- pSdoRes->SdoHeader.Sdo[SDOHEADER_COMMANDOFFSET] |= SDOHEADER_SIZEINDICATOR |
- completeAccess |
- SDOSERVICE_INITIATEUPLOADRES;
- }
- }
- /* 对于分段响应,命令是错误的在响应当中 */
- else if ( command == SDOSERVICE_DOWNLOADSEGMENTREQ )
- {
- /* Download segmented response */
- pSdoRes->MbxHeader.Length = DOWNLOAD_NORM_RES_SIZE;
- pSdoRes->SdoHeader.Sdo[SDOHEADER_COMMANDOFFSET] |= SDOSERVICE_DOWNLOADSEGMENTRES;
- }
- else if ( command != SDOSERVICE_UPLOADSEGMENTREQ )
- {
- /* Download response */
- pSdoRes->MbxHeader.Length = DOWNLOAD_NORM_RES_SIZE;
- pSdoRes->SdoHeader.Sdo[SDOHEADER_COMMANDOFFSET] |= SDOSERVICE_INITIATEDOWNLOADRES;
- }
- }
- else
- {
- /* 产生SDO-Abort-产生 */
- pSdoRes->MbxHeader.Length = ABORT_NORM_RES_SIZE;
- pSdoRes->CoeHeader &= ~COEHEADER_COESERVICEMASK;
- pSdoRes->CoeHeader |= ((UINT16)COESERVICE_SDOREQUEST) << COEHEADER_COESERVICESHIFT;
- pSdoRes->SdoHeader.Sdo[SDOHEADER_COMMANDOFFSET] = SDOSERVICE_ABORTTRANSFER;
- ((TABORTSDOTRANSFERREQMBX MBXMEM *) pSdoRes)->AbortCode = SWAPDWORD(cAbortCode[abort]);
- }
- // HBu 02.05.06: 如果CoE响应,不应该被发送,因为发送邮箱是满的,它应该被存储
- if (MBX_MailboxSendReq((TMBX MBXMEM *) pSdoRes, COE_SERVICE) != 0)
- {
- /* 我们存储CoE邮箱服务应该晚一点发送它,当邮箱被读
- pCoeSendStored = (TMBX MBXMEM *) pSdoRes;
- }
- }