/** APRDw "auto increment address read" word return primitive. Blocking. * * @param[in] ADP = Address Position, each slave ++, slave that has 0 reads. * @param[in] ADO = Address Offset, slave memory address * @param[in] timeout = timeout in us, standard is EC_TIMEOUTRET * @return word data from slave */ uint16 ec_APRDw(uint16 ADP, uint16 ADO, int timeout) { uint16 w; w = 0; ec_APRD(ADP,ADO, sizeof(w), &w, timeout); return w; }
int EcatCmdReq(EcInitCmdDesc *CmdDesc, uint32 *pData, uint16 Slave) { int wkc; uint32 data; memcpy(&data,CmdDesc->data,sizeof(data)); data=htoel(data); uint16 len; len=CmdDesc->DataLength; switch (CmdDesc->ecHead.command){ case EC_CMD_APRD: wkc=ec_APRD(CmdDesc->ecHead.ADP,CmdDesc->ecHead.ADO,len,CmdDesc->data,EC_TIMEOUTSAFE); break; case EC_CMD_APWR: wkc=ec_APWR(CmdDesc->ecHead.ADP,CmdDesc->ecHead.ADO,len,CmdDesc->data,EC_TIMEOUTSAFE); if(((CmdDesc->ecHead.ADO-ECT_REG_FMMU0)>=0)&&((CmdDesc->ecHead.ADO-ECT_REG_FMMU0)<=0x30)) {set_fmmu(CmdDesc,Slave); } if(((CmdDesc->ecHead.ADO-ECT_REG_SM0)>=0)&&((CmdDesc->ecHead.ADO-ECT_REG_SM0)<=0x18)) { set_sm(CmdDesc,Slave); EC_PRINT("SMs of Slave %d updated\n\r", Slave); } break; case EC_CMD_APRW: wkc=ec_ARMW(CmdDesc->ecHead.ADP,CmdDesc->ecHead.ADO,len,CmdDesc->data,EC_TIMEOUTSAFE); break; case EC_CMD_FPRD: wkc=ec_FPRD(CmdDesc->ecHead.ADP,CmdDesc->ecHead.ADO,len,CmdDesc->data,EC_TIMEOUTSAFE); break; case EC_CMD_FPWR: wkc=ec_FPWR(CmdDesc->ecHead.ADP,CmdDesc->ecHead.ADO,len,CmdDesc->data,EC_TIMEOUTSAFE); if(((CmdDesc->ecHead.ADO-ECT_REG_FMMU0)>=0)&&((CmdDesc->ecHead.ADO-ECT_REG_FMMU0)<=0x30)) {set_fmmu(CmdDesc,Slave); EC_PRINT("FMMUs of Slave %d updated\n\r", Slave); } if(((CmdDesc->ecHead.ADO-ECT_REG_SM0)>=0)&&((CmdDesc->ecHead.ADO-ECT_REG_SM0)<=0x18)) {set_sm(CmdDesc,Slave); } break; //case EC_CMD_FPRW: //not implemented in SOEM //break; case EC_CMD_BRD: wkc=ec_BRD(CmdDesc->ecHead.ADP,CmdDesc->ecHead.ADO,len,CmdDesc->data,EC_TIMEOUTSAFE); break; case EC_CMD_BWR: wkc=ec_BWR(CmdDesc->ecHead.ADP,CmdDesc->ecHead.ADO,len,CmdDesc->data,EC_TIMEOUTSAFE); if(CmdDesc->ecHead.ADO==ECT_REG_FMMU0) {set_fmmu(CmdDesc,0); EC_PRINT("FMMUs of ALL Slave updated\n\r"); } if(CmdDesc->ecHead.ADO==ECT_REG_SM0) {set_sm(CmdDesc,0); EC_PRINT("SMs of ALL Slave updated\n\r"); } break; //case EC_CMD_BRW: //not implemented in SOEM // break; case EC_CMD_LRD: wkc=ec_LRD(CmdDesc->ecHead.laddr,len,CmdDesc->data,EC_TIMEOUTSAFE); break; case EC_CMD_LWR: wkc=ec_LWR(CmdDesc->ecHead.laddr,len,CmdDesc->data,EC_TIMEOUTSAFE); break; case EC_CMD_LRW: wkc=ec_LRW(CmdDesc->ecHead.laddr,len,CmdDesc->data,EC_TIMEOUTSAFE); break; case EC_CMD_ARMW: wkc=ec_ARMW(CmdDesc->ecHead.ADP,CmdDesc->ecHead.ADO,len,CmdDesc->data,EC_TIMEOUTSAFE); break; case EC_CMD_FRMW: wkc=ec_FRMW(CmdDesc->ecHead.ADP,CmdDesc->ecHead.ADO,len,CmdDesc->data,EC_TIMEOUTSAFE); break; default: wkc=-1; break; } return wkc; }