📄 can841.c
字号:
can0w(0x100,v);
delay(500);
can0w(0,1);
delay(500);/*important! wait for the card to change protocol */
v=can0r(31);
v |=0x80;
can0w(31,v);
}
else
{
can1w(0,1);
v=can1r(0x100);
can1w(0x100,v);
delay(500);
can1w(0,1);
delay(500);
v=can1r(31);
v |=0x80;
can1w(31,v);
}
if( port ==0)
{
if( gIrq0 == IRQ_POLLING)
{
v=can0r(4);
v &=0xfe;
can0w(4,v);
}
else
{
v=can0r(4);
v |=0x09;
can0w(4,v);/* reset mode and receive irq */
}
}
else
{
if( gIrq1 == IRQ_POLLING)
{
v=can1r(4);
v &=0xfe;
can1w(4,v);
}
else
{
v=can1r(4);
v |=0x09;
can1w(4,v);/* reset mode and receive irq */
}
}
if( port ==0)
{
can0w(6,can.bt0); /* BT0 */
can0w(7,can.bt1); /* BT1 */
temp=can0r(6);
if( temp !=can.bt0)
return(0);
temp=can0r(7);
if( temp !=can.bt1)
return(0);
}
else
{
can1w(6,can.bt0); /* BT0 */
can1w(7,can.bt1); /* BT1 */
temp=can1r(6);
if( temp !=can.bt0)
return(0);
temp=can1r(7);
if( temp !=can.bt1)
return(0);
}
if( port ==0)
{
v = can0r( 0 );
if ( can.ssFilterSetting.dwFilterType == 0 )
{
v |= 0x08;
}
else
{
v &= 0xf7;
}
can0w(0, v);
delay(200);
can0w(16,can.ssFilterSetting.uchAcceptCode0);/* accept code */
can0w(17,can.ssFilterSetting.uchAcceptCode1);/* accept code */
can0w(18,can.ssFilterSetting.uchAcceptCode2);/* accept code */
can0w(19,can.ssFilterSetting.uchAcceptCode3);/* accept code */
can0w(20,can.ssFilterSetting.uchAcceptMask0);/* accept mask */
can0w(21,can.ssFilterSetting.uchAcceptMask1);/* accept mask */
can0w(22,can.ssFilterSetting.uchAcceptMask2);/* accept mask */
can0w(23,can.ssFilterSetting.uchAcceptMask3);/* accept mask */
}
else
{
v = can1r( 0 );
if ( can.ssFilterSetting.dwFilterType == 0 )
{
v |= 0x08;
}
else
{
v &= 0xf7;
}
can1w(0, v);
delay(200);
tag=can1r(0);
can1w(16,can.ssFilterSetting.uchAcceptCode0);/* accept code */
tag=can1r(16);
can1w(17,can.ssFilterSetting.uchAcceptCode1);/* accept code */
tag=can1r(17);
can1w(18,can.ssFilterSetting.uchAcceptCode2);/* accept code */
can1w(19,can.ssFilterSetting.uchAcceptCode3);/* accept code */
can1w(20,can.ssFilterSetting.uchAcceptMask0);/* accept mask */
can1w(21,can.ssFilterSetting.uchAcceptMask1);/* accept mask */
can1w(22,can.ssFilterSetting.uchAcceptMask2);/* accept mask */
can1w(23,can.ssFilterSetting.uchAcceptMask3);/* accept mask */
}
if( port ==0)
{
can0w(8,0xfa);
}
else
{
can1w(8,0xfa);
}
return(1);
}
}
/*--------------------------------------------------------------------------*/
int canNormalRun( BYTE port )
{
BYTE v;
if( port ==0)
{
v=can0r(0);
if( v & 1)
can0w(0,v&0xfe);
}
else
{
v=can1r(0);
if( v & 1)
can1w(0,v&0xfe);
}
if( port ==0)
{
if( gIrq0 == IRQ_POLLING)
{
v=can0r(4);
v &=0xfe;
can0w(4,v);
return 1;
}
else
{
v=can0r(4);
v |=0x09;
can0w(4,v);/* reset mode and receive irq */
delay(500);
return 1;
}
}
else
{
if( gIrq1 == IRQ_POLLING)
{
v=can1r(4);
v &=0xfe;
can1w(4,v);
return 1;
}
else
{
v=can1r(4);
v |=0x09;
can1w(4,v);/* reset mode and receive irq */
delay(500);
return 1;
}
}
return 0;
}
/*--------------------------------------------------------------------------*/
int canSendMsg( BYTE port, MSG_STRUCT msg)
{
BYTE v;
BYTE i;
if( port==0)
{
v=msg.id>>3;
can0w(10,v);
v=msg.id &7;
v<<=5;
if( msg.rtr ==1)
v|=0x10;
v+=msg.dlen;
can0w(11,v);
for(i=0;i<msg.dlen; i++)
{
can0w(12+i,msg.data[i]);
}
can0w(1,1);
while(1)
{
v=can0r(2);
if( v & 0x40)
{
return( 0);
}
if( v &0x08)
return( 1);
}
}
else
{
v=msg.id>>3;
can1w(10,v);
v=msg.id &7;
v<<=5;
if( msg.rtr ==1)
v|=0x10;
v+=msg.dlen;
can1w(11,v);
for(i=0;i<msg.dlen; i++)
{
can1w(12+i,msg.data[i]);
}
can1w(1,1);
while(1)
{
v=can1r(2);
if( v & 0x40)
{
return( 0);
}
if( v &0x08)
return( 1);
}
}
}
/*add by jinzhong*/
int canSendMsgEx( BYTE port, CAN_MSG_T_EX msgex)
{
long v,temp1,temp2;
BYTE i;
if( port==0)
{
temp1=can0r(2);
if(temp1 & 0x04)
{
if( msgex.ff==PELICAN_SFF)
{
temp1=0;
temp1 |=msgex.dlen;
if ( msgex.rtr == 1 )
{
temp1 |= 1<<6;
}
can0w(16,temp1);
temp1 = 0;
temp1 = msgex.id>>3;
can0w(17,temp1);
temp1 = 0;
temp1 = msgex.id & 0x07 ;
temp1 <<= 5;
can0w(18,temp1);
for(i=0;i<msgex.dlen; i++)
{
can0w(19+i,msgex.data[i]);
}
}
else
{
temp1 = 0;
temp1 |= msgex.dlen;
if ( msgex.rtr == 1 )
{
temp1 |= 1<<6;
}
temp1 |= 1<<7;
can0w(16,temp1);
temp1 = msgex.id>>21;
can0w(17,temp1);
temp1 = msgex.id & 0x1fffff ;
temp1 >>= 13;
can0w(18,temp1);
temp1 = msgex.id & 0x1fff ;
temp1 >>= 5;
can0w(19,temp1);
temp1 = msgex.id & 0x1f ;
temp1 <<= 3;
can0w(20,temp1);
for(i=0;i<msgex.dlen; i++)
{
can0w(21+i,msgex.data[i]);
}
}
can0w(1,1);
while(1)
{
temp1=can0r(2);
if( temp1 & 0x40)
{
return( 0);
}
if( temp1 &0x08)
return( 1);
}
}
else return(0);
}
else
{
temp2=can1r(2);
if(temp2 & 0x04)
{
if( msgex.ff==PELICAN_SFF)
{
temp2=0;
temp2 |=msgex.dlen;
if ( msgex.rtr == 1 )
{
temp2 |= 1<<6;
}
can1w(16,temp2);
temp2 = 0;
temp2 = msgex.id>>3;
can1w(17,temp2);
temp2 = 0;
temp2 = msgex.id & 0x07 ;
temp2 <<= 5;
can1w(18,temp2);
for(i=0;i<msgex.dlen; i++)
{
can1w(19+i,msgex.data[i]);
}
}
else
{
temp2 = 0;
temp2 |= msgex.dlen;
if ( msgex.rtr == 1 )
{
temp2 |= 1<<6;
}
temp2 |= 1<<7;
can1w(16,temp2);
temp2 = msgex.id>>21;
can1w(17,temp2);
temp2 = msgex.id & 0x1fffff ;
temp2 >>= 13;
can1w(18,temp2);
temp2 = msgex.id & 0x1fff ;
temp2 >>= 5;
can1w(19,temp2);
temp2 = msgex.id & 0x1f ;
temp2 <<= 3;
can1w(20,temp2);
for(i=0;i<msgex.dlen; i++)
{
can1w(21+i,msgex.data[i]);
}
}
can1w(1,1);
while(1)
{
temp2=can1r(2);
if( temp2 & 0x40)
{
return( 0);
}
if( temp2 &0x08)
return( 1);
}
}
else return(0);
}
}
/*edd added*/
/*--------------------------------------------------------------------------*/
int canReceiveMsg( BYTE port, MSG_STRUCT *msg_ptr, BYTE * IsEmpty)
{
BYTE i;
pMSG_STRUCT pcan_msg;
MSG_STRUCT msg;
ULONG head,tail;
*IsEmpty = 1;
if( port == 0)
{
if( gIrq0 == IRQ_POLLING)
{
if( can0r(2)&1)
{
rBuf0[0]=can0r(20);
rBuf0[1]=can0r(21);
for(i=0; i< (rBuf0[1]&0x0f); i++)
rBuf0[i+2]=can0r(22+i);
/* release receive buffer*/
can0w(1,4);
msg_ptr->id=rBuf0[0];
msg_ptr->id <<=3;
msg_ptr->id |=(rBuf0[1] >>5);
msg_ptr->rtr =(rBuf0[1]>>4)&1;
msg_ptr->dlen =rBuf0[1]&0x0f;
for(i=0;i< msg_ptr->dlen; i++)
msg_ptr->data[i]=rBuf0[2+i];
return(1);
}
else
return(0);
}
else
{
head = READ_FIFO0.head;
tail = READ_FIFO0.tail;
if(head == tail)
return(0);
pcan_msg= (MSG_STRUCT *)&READ_FIFO0.buffer[tail];
READ_FIFO0.tail += CAN_MSG_LEN;
if(READ_FIFO0.tail == RD_FIFO_LEN )
{
READ_FIFO0.tail %= RD_FIFO_LEN;
READ_FIFO0.status = FIFO_OK;
}
if(READ_FIFO0.tail == head )
*IsEmpty = 1;
else
*IsEmpty = 0;
msg = *pcan_msg;
*((MSG_STRUCT *)msg_ptr) = msg;
return(1);
}
}
else if(port == 1)
{
if( gIrq1 == IRQ_POLLING)
{
if( can1r(2)&1)
{
rBuf1[0]=can1r(20);
rBuf1[1]=can1r(21);
for(i=0; i< ( rBuf1[1]&0x0f); i++)
rBuf1[i+2]=can1r(22+i);
can1w(1,4);
msg_ptr->id=rBuf1[0];
msg_ptr->id <<=3;
msg_ptr->id |=(rBuf1[1] >>5);
msg_ptr->rtr =(rBuf1[1]>>4)&1;
msg_ptr->dlen =rBuf1[1]&0x0f;
for(i=0;i< msg_ptr->dlen; i++)
msg_ptr->data[i]=rBuf1[2+i];
return(1);
}
else
return(0);
}
else
{
head = READ_FIFO1.head;
tail = READ_FIFO1.tail;
if(head == tail)
return(0);
pcan_msg= (MSG_STRUCT *)&READ_FIFO1.buffer[tail];
READ_FIFO1.tail += CAN_MSG_LEN;
if(READ_FIFO1.tail == RD_FIFO_LEN )
{
READ_FIFO1.tail %= RD_FIFO_LEN;
READ_FIFO1.status = FIFO_OK;
}
if(READ_FIFO1.tail == head )
*IsEmpty = 1;
else
*IsEmpty = 0;
msg = *pcan_msg;
*((MSG_STRUCT *)msg_ptr) = msg;
return(1);
}
}
else
return( 0);
}
/*--------------------------------------------------------------------------*/
/*--------------------------
---add by jinzhong----------
---------------------------*/
/*--------------------------------------------------------------------------*/
int canReceiveMsgEx( BYTE port, CAN_MSG_T_EX *msg_ptrex, BYTE * IsEmpty)
{
BYTE i;
PCAN_MSG_T_EX pcan_msgex;
CAN_MSG_T_EX msgex;
long head,tail;
long temp1,temp2;
unsigned int tag1;
*IsEmpty = 1;
if( port == 0)
{
if( gIrq0 == IRQ_POLLING)
{
if( can0r(2)&1)
{
temp1=can0r(16);
msg_ptrex->ff = temp1 & 0x80 ;
msg_ptrex->dlen = temp1 & 0x0f ;
msg_ptrex->rtr = ( temp1>> 6) & 1;
if ( msg_ptrex->ff == PELICAN_SFF )
{
temp1 = can0r(17);
msg_ptrex->id = temp1 << 3;
temp1 = can0r(18);
msg_ptrex->id |= temp1 >> 5;
for ( i = 0; i < msg_ptrex->dlen; i++ )
msg_ptrex->data[i] = can0r(19+i);
}
else
{
temp1 = can0r(17);
msg_ptrex->id = temp1 << 21;
temp1 = can0r(18);
msg_ptrex->id |= temp1 << 13;
temp1 = can0r(19);
msg_ptrex->id |= temp1 << 5;
temp1 = can0r(20);
msg_ptrex->id |= temp1 >> 3;
for ( i = 0; i < msg_ptrex->dlen; i++ )
msg_ptrex->data[i] = can0r(21+i);
}
/* release receive buffer*/
can0w(1,4);
return(1);
}
else
return(0);
}
else
{
head = READ_FIFO_EX0.head;
tail = READ_FIFO_EX0.tail;
if(head == tail)
return(0);
pcan_msgex= (CAN_MSG_T_EX *)&READ_FIFO_EX0.buffer[tail];
READ_FIFO_EX0.tail += CAN_MSG_EX_LEN;
if(READ_FIFO_EX0.tail == RD_FIFO_EX_LEN )
{
READ_FIFO_EX0.tail %= RD_FIFO_EX_LEN;
READ_FIFO_EX0.status = FIFO_OK;
}
if(READ_FIFO_EX0.tail == head )
*IsEmpty = 1;
else
*IsEmpty = 0;
msgex = *pcan_msgex;
*((CAN_MSG_T_EX *)msg_ptrex) = msgex;
return(1);
}
}
else if(port == 1)
{
if( gIrq1 == IRQ_POLLING)
{
tag1 = can1r(0);
if(tag1&1)
return 0;
tag1 = can1r(2);
if( can1r(2)&1)
{
temp2=can1r(16);
msg_ptrex->ff = temp2 & 0x80 ;
msg_ptrex->dlen = temp2 & 0x0f ;
msg_ptrex->rtr = ( temp2 >> 6) & 1;
if ( msg_ptrex->ff == PELICAN_SFF )
{
temp2 = can1r(17);
msg_ptrex->id = temp2 << 3;
temp2 = can1r(18);
msg_ptrex->id |= temp2 >> 5;
for ( i = 0; i < msg_ptrex->dlen; i++ )
msg_ptrex->data[i] = can1r(19+i);
}
else
{
temp2 = can1r(17);
msg_ptrex->id = temp2 << 21;
temp2 = can1r(18);
msg_ptrex->id |= temp2 << 13;
temp2 = can1r(19);
msg_ptrex->id |= temp2 << 5;
temp2 = can1r(20);
msg_ptrex->id |= temp2 >> 3;
for ( i = 0; i < msg_ptrex->dlen; i++ )
msg_ptrex->data[i] = can1r(21+i);
}
/* release receive buffer*/
can1w(1,4);
return(1);
}
else
return(0);
}
else
{
head = READ_FIFO_EX1.head;
tail = READ_FIFO_EX1.tail;
if(head == tail)
return(0);
pcan_msgex= (CAN_MSG_T_EX *)&READ_FIFO_EX1.buffer[tail];
READ_FIFO_EX1.tail += CAN_MSG_EX_LEN;
if(READ_FIFO_EX1.tail == RD_FIFO_EX_LEN )
{
READ_FIFO_EX1.tail %= RD_FIFO_EX_LEN;
READ_FIFO_EX1.status = FIFO_OK;
}
if(READ_FIFO_EX1.tail == head )
*IsEmpty = 1;
else
*IsEmpty = 0;
msgex = *pcan_msgex;
*((CAN_MSG_T_EX *)msg_ptrex) = msgex;
return(1);
}
}
else
return( 0);
}
int canSetProtocolType( BYTE port,BYTE protocoltype )
{
BYTE v;
if (port==0)
{
if(protocoltype==CANBUS_PROTOCOL_20A)
{
protocol1=CANBUS_PROTOCOL_20A;
return(1);
}
if(protocoltype==CANBUS_PROTOCOL_20B)
{
protocol1=CANBUS_PROTOCOL_20B;
return(1);
}
else return(0);
}
if (port==1)
{
if(protocoltype==CANBUS_PROTOCOL_20A)
{
protocol2=CANBUS_PROTOCOL_20A;
return(1);
}
if(protocoltype==CANBUS_PROTOCOL_20B)
{
protocol2=CANBUS_PROTOCOL_20B;
return(1);
}
else return(0);
}
return(0);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -