原文地址http://blog.csdn.net/huangxianxinalice/article/details/9936181
- /
- /**
- \brief 这个函数是在背后调用的,它不影响ECAT_Application在同步模式
- *////
- void COE_Main(void)
- {
- #if SDO_RES_INTERFACE
- /* ECATCHANGE_START(V5.01) SDO6*/
- UINT8 abort = 0;
- if(pSdoPendFunc != NULL)
- {
- abort = pSdoPendFunc(u16StoreIndex,u8StoreSubindex,u32StoreDataSize,pStoreData,bStoreCompleteAccess);
- if(abort != ABORTIDX_WORKING)
- {
- switch(u8PendingSdo)
- {
- #if SEGMENTED_SDO_SUPPORTED
- case SDO_PENDING_SEG_WRITE:
- if(pSdoSegData)
- {
- /* 分配的缓存将被释放 */
- FREEMEM( (UINT16 VARMEM *) pSdoSegData );
- pSdoSegData = NULL;
- }
- #endif
- case SDO_PENDING_WRITE:
- /*发送SDO的下载响应*/
- SDOS_SdoRes(abort, 0, NULL);
- break;
- case SDO_PENDING_SEG_READ:
- case SDO_PENDING_READ:
- /* 发送SDO的上传响应 */
- SDOS_SdoRes(abort, u32StoreDataSize, pStoreData);
- break;
- }
- u8PendingSdo = 0;
- u16StoreIndex = 0;
- u8StoreSubindex = 0;
- u32StoreDataSize = 0;
- pStoreData = NULL;
- bStoreCompleteAccess = 0;
- pSdoPendFunc = NULL;
- }
- }
- /* ECATCHANGE_END(V5.01) SDO6*/
- #endif
- }
- /** @} */
- #endif //#if COE_SUPPORTED
- /
- /**
- \param abort SDO的接入结果
- \param objLength 对象的总长度
- \param pData 指向邮箱缓存的指针
- \brief 这个函数被调用当SDO响应应该被发送的时候
- *////
- void SDOS_SdoRes(UINT8 abort, UINT32 objLength, UINT16 MBXMEM *pData)
- {
- UINT16 dataSize = 0;
- if (bSdoInWork)
- {
- /* SDO-Response is expected */
- UINT8 command = pSdoResStored->SdoHeader.Sdo[SDOHEADER_COMMANDOFFSET] & SDOHEADER_COMMAND;
- UINT8 completeAccess = pSdoResStored->SdoHeader.Sdo[SDOHEADER_COMMANDOFFSET] & SDOHEADER_COMPLETEACCESS;
- if ( command == SDOSERVICE_INITIATEUPLOADREQ )
- {
- #if SEGMENTED_SDO_SUPPORTED
- /* dataSize contains the available size in one mailbox */
- dataSize = u16SendMbxSize - MBX_HEADER_SIZE - UPLOAD_NORM_RES_SIZE;
- if ( dataSize < objLength )
- {
- /* Segmented Upload, the variables for the segmented transfer should be initialized */
- bSdoSegFollows = TRUE;
- bSdoSegLastToggle = 1;
- #if COMPLETE_ACCESS_SUPPORTED
- bSdoSegAccess = completeAccess;
- #endif
- nSdoSegCompleteSize = objLength;
- nSdoSegService = SDOSERVICE_UPLOADSEGMENTREQ;
- pSdoSegData = (UINT16 VARMEM *) pData;
- /* the first segment shall be copied */
- MBXMEMCPY(((TINITSDOUPLOADNORMRESMBX MBXMEM *) pSdoResStored)->Data, pData, dataSize);
- /* ECATCHANGE_START(V5.01) SDO6*/
- nSdoSegBytesToHandle = dataSize;
- /* ECATCHANGE_END(V5.01) SDO6*/
- }
- else
- #endif
- if ( (objLength <= 4) && (objLength > 0) )
- {
- /* Expedited response */
- if ( pData != ((TINITSDOUPLOADEXPRESMBX MBXMEM *) pSdoResStored)->Data )
- {
- /* the data is not in the response buffer yet, it shall be copied */
- MBXMEMCPY(((TINITSDOUPLOADEXPRESMBX MBXMEM *) pSdoResStored)->Data, pData, objLength);
- }
- }
- else
- {
- /* Normal response */
- if ( pData != ((TINITSDOUPLOADNORMRESMBX MBXMEM *) pSdoResStored)->Data )
- {
- /* the data is not in the response buffer yet, it shall be copied */
- MBXMEMCPY(((TINITSDOUPLOADNORMRESMBX MBXMEM *) pSdoResStored)->Data, pData, objLength);
- }
- }
- }
- /* SDO access is finished, send the response */
- bSdoInWork = FALSE;
- SdoRes(abort, command, completeAccess, dataSize, objLength, pSdoResStored);
- }
- }
- #endif // SDO_RES_INTERFACE