Пример #1
0
int exec_cmd(EcInitCmdDesc *CmdDesc, uint16 slave)
{int wkc,cnt = 0; 
char i; 
 uint32 data=0;
 
 uint16 retry,estat;
 
   retry=CmdDesc->retries;
      if (CmdDesc->ecHead.ADO==0x502||CmdDesc->ecHead.ADO==0x508)
	    {
		  
		  ec_eeprom2master(slave);
		 
         if (ec_eeprom_waitnotbusyAP(CmdDesc->ecHead.ADP, &estat, EC_TIMEOUTEEP))
	        {
		     if (estat & EC_ESTAT_EMASK) /* error bits are set */
		        {
			     estat = htoes(EC_ECMD_NOP); /* clear error bits */
			     wkc=ec_APWR(CmdDesc->ecHead.ADP, ECT_REG_EEPCTL, sizeof(estat), &estat, EC_TIMEOUTRET);
		        }
		
		    do
			wkc=EcatCmdReq(CmdDesc, &data, slave);
			while ((wkc <= 0) && (cnt++ < retry));
	        }
     
	    }
       EC_PRINT("Command: %s\n",CmdDesc->cmt);
 	 else 
	    {
		 do
		 {
Пример #2
0
  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;
	} 
/** APWRw "auto increment address write" word primitive. Blocking.
 *
 * @param[in] ADP			= Address Position, each slave ++, slave that has 0 writes.
 * @param[in] ADO			= Address Offset, slave memory address
 * @param[in] data			= word data to write to slave.
 * @param[in] timeout		= timeout in us, standard is EC_TIMEOUTRET
 * @return Workcounter or EC_NOFRAME
 */
int ec_APWRw(uint16 ADP, uint16 ADO, uint16 data, int timeout)
{
    return ec_APWR(ADP,ADO, sizeof(data), &data, timeout);
}