📄 mepos.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 + -