⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 mepos.c

📁 epos串口驱动
💻 C
字号:
#include "up_down.h"

#if Epos_Ctr_Way==0
BOOL MEpos_Write(MEpos* epos,INT16U Index,INT8U SubIndex,INT32S param)
{	
	epos->buf.ID = 0x600+epos->NODE_ID;
	epos->buf.Buf[0]= 0x22;
	epos->buf.Buf[1]= Index&0xFF;
	epos->buf.Buf[2]= (Index&0xFF00)>>8;
	epos->buf.Buf[3]= SubIndex;
	epos->buf.Buf[4]= param&0xFF;
	epos->buf.Buf[5]= (param&0xFF00)>>8;
	epos->buf.Buf[6]= (param&0xFF0000)>>16;
	epos->buf.Buf[7]= (param&0xFF000000)>>24;
	epos->buf.DataLen = 8;
	epos->buf.IsExtend=0;
	epos->buf.IsRemote=0;
	return(Write(epos->CAN_Handles, &(epos->buf), CANTxCMD_NOR));	 	
}

INT32S MEpos_Read(MEpos* epos,INT16U Index,INT8U SubIndex)
{   
    INT32S tmp;
    epos->buf.ID=0x600+epos->NODE_ID;
    epos->buf.Buf[0]=0x40;
    epos->buf.Buf[1]= Index&0xFF;
	epos->buf.Buf[2]= (Index&0xFF00)>>8;
	epos->buf.Buf[3]= SubIndex;
	epos->buf.Buf[4]=0x00;
	epos->buf.Buf[5]=0x00;
	epos->buf.Buf[6]=0x00;
	epos->buf.Buf[7]=0x00;
	epos->buf.DataLen = 8;
	epos->buf.IsExtend=0;
	epos->buf.IsRemote=0;
	Write(epos->CAN_Handles, &(epos->buf), CANTxCMD_NOR);
	Read(epos->CAN_Handles,&(epos->buf));
	tmp=((INT32S)epos->buf.Buf[4])+(((INT32S)epos->buf.Buf[5])<<8)+(((INT32S)epos->buf.Buf[6])<<16)+(((INT32S)epos->buf.Buf[7])<<24);
	return tmp;
}
#endif

#if Epos_Ctr_Way==1
void MEpos_ComInit(MEpos* epos)
{
    char temp,i;
    while(1)
    {
      temp=0x00;
      dwrite(epos->u0fd,&temp,1);
      i=dread(epos->u0fd,&temp,1);
      if(i==1)break;
    }   
}


BOOL MEpos_Write(MEpos* epos,INT16U Index,INT8U SubIndex,INT32S param)
{	
    char data[8],i;
    INT16U buf[6];
    INT16U crc;
    diocontrol(epos->u0fd, UART0_CLR_FIFO, (void *)0);
    data[0]=0x11;
    dwrite(epos->u0fd,data,1);
    for(i=0;i<3;i++)
    { 
      dread(epos->u0fd,data,1);      
      if(data[0]!=0x4F)
       {
        data[0]=0x00;
        dwrite(epos->u0fd,data,1);
        data[0]=0x11;
        dwrite(epos->u0fd,data,1); 
        }
     else break;
    }
    if(i==3)return FALSE;
    data[0]=0x03;
    dwrite(epos->u0fd,data,1);
    data[0]=(INT8U)Index;
    data[1]=(INT8U)(Index>>8);
    data[2]=SubIndex;
    data[3]=epos->NODE_ID;
    data[4]=param&0xFF;
    data[5]=(param&0xFF00)>>8;
    data[6]=(param&0xFF0000)>>16;
    data[7]=(param&0xFF000000)>>24;    
    dwrite(epos->u0fd,data,8);
    buf[0]=0x1100+0x0003;
    buf[1]=Index;
    buf[2]=(((INT16U)epos->NODE_ID)<<8)+(INT16U)SubIndex;
    buf[3]=(INT16U)param;
    buf[4]=(INT16U)(param>>16);
    buf[5]=0x0000;
    crc=CalcFieldCRC(buf,6);
    data[0]=crc&0xFF;
    data[1]=(crc&0xFF00)>>8;
    dwrite(epos->u0fd,data,2);
    dread(epos->u0fd,data,1);
    if(data[0]==0x4F)return TRUE;
    else return FALSE;		
}

INT32S MEpos_Read(MEpos* epos,INT16U Index,INT8U SubIndex)
{   
    char temp;
    INT32S param;
    char data[8];
    INT16U buf[4];
    INT16U crc;
    diocontrol(epos->u0fd,UART0_CLR_FIFO,(void *)0);
    temp=0x10;
    dwrite(epos->u0fd,&temp,1);
    temp=0x01;
    data[0]=Index&0xFF;
    data[1]=(Index&0xFF00)>>8;
    data[2]=SubIndex;
    data[3]=epos->NODE_ID;
    dwrite(epos->u0fd,&temp,1);
    dwrite(epos->u0fd,data,4);
    buf[0]=0x1000+0x0001;
    buf[1]=Index;
    buf[2]=(((INT16U)epos->NODE_ID)<<8)+(INT16U)SubIndex;
    buf[3]=0x0000;
    crc=CalcFieldCRC(buf,4);
    data[0]=crc&0xFF;
    data[1]=crc&0xFF00;
    dwrite(epos->u0fd,data,2);
    dread(epos->u0fd,&temp,1);
    if(temp!=0x00)return FALSE;
    else {temp=0x4F;dwrite(epos->u0fd,&temp,1);}  
    dread(epos->u0fd,&temp,1);  
    dread(epos->u0fd,data,8);
    param=((INT32U)data[4])+(((INT32U)data[5])<<8)+(((INT32U)data[6])<<16)+(((INT32U)data[7])<<24);
    dread(epos->u0fd,data,2);
    temp=0x4F;
    dwrite(epos->u0fd,&temp,1);
    return param;
}

INT16U CalcFieldCRC(INT16U* pDataArray,INT16U numberOfWords) 
{
    INT16U shifter, c;
    INT16U carry;
    INT16U CRC=0;       
     //Calculate pDataArray Word by Word
    while(numberOfWords--)
    {
         shifter=0x8000;
         c=*pDataArray++;
         do
          {
            carry=CRC&0x8000; 
            CRC<<=1;
            if(c&shifter)CRC++;
            if(carry) CRC^=0x1021;
            shifter>>=1;
          } while(shifter);
    }
    return CRC;
}
 
    
#endif

INT32S MEpos_GetPosition(MEpos* epos)
{
	return(MEpos_Read(epos,0x6064,0x00));
}
	
	
    

void MEpos_Init(MEpos* epos,INT8U interface,INT8U NODE_ID)   //interface为接口,可为CAN_CH1,CAN_CH2,COM
{   
    epos->isInit = FALSE;
	#if Epos_Ctr_Way==0
	if(interface!=COM)epos->CAN_Handles=CAN_Create(interface,10,BTR_1000K,NULL);
	if(epos->CAN_Handles==NULL)return;
	#endif
	#if Epos_Ctr_Way==1
	epos->Epos_COM_Mode.datab = 8;                // 8 位字长
    epos->Epos_COM_Mode.stopb = 1;                // 1 位停止位
    epos->Epos_COM_Mode.parity = 0;               // 无奇偶校验
    epos->u0fd = dopen("UART0",O_RDWR,OCCUPY);  // 以独占方式打开串口0
    if(epos->u0fd <0)                           // Open成功,句柄将大于0
    {
      epos->derr=getlasterr(epos->u0fd);                // 查看错误状态
      while(1)
      {
       OSTimeDly(OS_TICKS_PER_SEC);                       // 错误处理
      }
    }
    diocontrol(epos->u0fd,UART0_SET_BR,(void *)38400);           // 设置波特率为38400
    diocontrol(epos->u0fd,UART0_SET_MODE,(void *)(&(epos->Epos_COM_Mode)));// 设置UART 模式
    diocontrol(epos->u0fd,UART0_SET_TIMEROUT,(void *)15);         // 设置接收超时因子, 参数 =0 则关闭超时
    diocontrol(epos->u0fd,UART0_CLR_FIFO,(void *)0);             // 清空接收软FIFO
    MEpos_ComInit(epos);
    #endif
	epos->NODE_ID = NODE_ID;
	epos->isInit = TRUE;
	epos->CurMode= 0x00;	
	SetDefIRQAddr((void*)IntEnty);
	MEpos_ParamInit(epos);
    MEpos_RunPPM(epos,M_MAX_SPEED,M_INIT_POSITION,1);
}


void MEpos_ParamInit(MEpos* epos)
{
    MEpos_Write(epos,0x6065,0x00,M_MAX_F_ERR);
	OSTimeDly(2);
	MEpos_Write(epos,0x607F,0x00,M_MAX_P_V);
	OSTimeDly(2);
	MEpos_Write(epos,0x6083,0x00,M_MAX_ACC);
	OSTimeDly(2);
	MEpos_Write(epos,0x6084,0x00,M_MAX_ACC);
	OSTimeDly(2);
    MEpos_Write(epos,0x6085,0x00,M_QDEC);
	OSTimeDly(2);
	MEpos_Write(epos,0x607D,0x02,M_MAX_POSITION);
	OSTimeDly(2);
	MEpos_Write(epos,0x607D,0x01,M_MIN_POSITION);
	OSTimeDly(2);
}



void MEpos_RunPPM(MEpos* epos,INT32S speed,INT32S position,INT8U way)
{	
    if(epos->CurMode!=PPMODE)
    {
    MEpos_Write(epos,0x6060,0x00,0x01);
    OSTimeDly(2);
	MEpos_Write(epos,0x6065,0x00,M_MAX_F_ERR);
	OSTimeDly(2);
	MEpos_Write(epos,0x6040,0x00,0x06);
	OSTimeDly(2);
	MEpos_Write(epos,0x6040,0x00,0x0f);
	OSTimeDly(2);
	epos->CurMode=PPMODE;
	}
	MEpos_Write(epos,0x6081,0x00,speed);
	OSTimeDly(2);
	MEpos_Write(epos,0x607A,0x00,position);
	OSTimeDly(2);
	if(way==0)
	{
	   MEpos_Write(epos,0x6040,0x00,0x001f);
	   OSTimeDly(2);
	}
	else
	{
	   MEpos_Write(epos,0x6040,0x00,0x005f);
	   OSTimeDly(2);
    }
}

void MEpos_RunPM(MEpos* epos,INT32S position)
{	
    if(epos->CurMode!=PMODE)
    {
    MEpos_Write(epos,0x6060,0x00,0xFF);
    OSTimeDly(2);
    MEpos_Write(epos,0x6065,0x00,2147483640);
    OSTimeDly(2);
	MEpos_Write(epos,0x6040,0x00,0x06);
	OSTimeDly(2);
	MEpos_Write(epos,0x6040,0x00,0x0f);
	OSTimeDly(2);
	epos->CurMode=PMODE;
	}
	MEpos_Write(epos,0x2062,0x00,position);
	OSTimeDly(2);
}

void MEpos_Stop(MEpos* epos)
{
	MEpos_Write(epos,0x6040,0x00,0x10f);
	OSTimeDly(2);
}


⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -