📄 can_lib.c
字号:
//******************************************************************************
#include "common.h"
#include "can_lib.h"
#include "can_drv.h"
//------------------------------------------------------------------------------
U8 can_init(U8 mode)
{
if ((Can_bit_timing(mode))==0) return (0);
can_clear_all_mob();
Can_enable();
return (1);
}
//------------------------------------------------------------------------------
st_cmd_t message;
U8 buffer[8];
//-------------------------------------------------------------------------------
U8 can_cmd(st_cmd_t* cmd)
{
U8 mob_handle, cpt;
U32 u32_temp;
if (cmd->cmd == CMD_ABORT)
{
if (cmd->status == MOB_PENDING)
{
// Rx or Tx not yet performed
Can_set_mob(cmd->handle);
Can_mob_abort();
Can_clear_status_mob(); // To be sure !
cmd->handle = 0;
}
cmd->status = STATUS_CLEARED;
}
else
{
mob_handle = can_get_mob_free();
if (mob_handle!= NO_MOB)
{
cmd->status = MOB_PENDING;
cmd->handle = mob_handle;
Can_set_mob(mob_handle);
Can_clear_mob();
switch (cmd->cmd)
{
//------------
case CMD_TX:
if (cmd->ctrl.ide){ Can_set_ext_id(cmd->id.ext);}
else { Can_set_std_id(cmd->id.std);}
for (cpt=0;cpt<cmd->dlc;cpt++) CANMSG = *(cmd->pt_data + cpt);
if (cmd->ctrl.rtr) Can_set_rtr();
else Can_clear_rtr();
Can_set_dlc(cmd->dlc);
Can_config_tx();
break;
//------------
case CMD_TX_DATA:
if (cmd->ctrl.ide){ Can_set_ext_id(cmd->id.ext);}
else { Can_set_std_id(cmd->id.std);}
for (cpt=0;cpt<cmd->dlc;cpt++) CANMSG = *(cmd->pt_data + cpt);
cmd->ctrl.rtr=0; Can_clear_rtr();
Can_set_dlc(cmd->dlc);
Can_config_tx();
break;
//------------
case CMD_TX_REMOTE:
if (cmd->ctrl.ide){ Can_set_ext_id(cmd->id.ext);}
else { Can_set_std_id(cmd->id.std);}
cmd->ctrl.rtr=1; Can_set_rtr();
Can_set_dlc(cmd->dlc);
Can_config_tx();
break;
//------------
case CMD_RX:
u32_temp=0; Can_set_ext_msk(u32_temp);
Can_clear_rtrmsk();
Can_clear_idemsk();
Can_config_rx();
break;
//------------
case CMD_RX_DATA:
u32_temp=0; Can_set_ext_msk(u32_temp);
cmd->ctrl.rtr=0; Can_set_rtrmsk(); Can_clear_rtr();
Can_clear_idemsk();
Can_config_rx();
break;
//------------
case CMD_RX_REMOTE:
u32_temp=0; Can_set_ext_msk(u32_temp);
cmd->ctrl.rtr=1; Can_set_rtrmsk(); Can_set_rtr();
Can_clear_rplv();
Can_clear_idemsk();
Can_config_rx();
break;
//------------
case CMD_RX_MASKED:
if (cmd->ctrl.ide){ Can_set_ext_id(cmd->id.ext);}
else { Can_set_std_id(cmd->id.std);}
u32_temp=~0; Can_set_ext_msk(u32_temp);
Can_clear_rtrmsk();
Can_set_idemsk();
Can_config_rx();
break;
//------------
case CMD_RX_DATA_MASKED:
if (cmd->ctrl.ide){ Can_set_ext_id(cmd->id.ext);}
else { Can_set_std_id(cmd->id.std);}
u32_temp=~0; Can_set_ext_msk(u32_temp);
cmd->ctrl.rtr=0; Can_set_rtrmsk(); Can_clear_rtr();
Can_set_idemsk();
Can_config_rx();
break;
//------------
case CMD_RX_REMOTE_MASKED:
if (cmd->ctrl.ide){ Can_set_ext_id(cmd->id.ext);}
else { Can_set_std_id(cmd->id.std);}
u32_temp=~0; Can_set_ext_msk(u32_temp);
cmd->ctrl.rtr=1; Can_set_rtrmsk(); Can_set_rtr();
Can_clear_rplv();
Can_set_idemsk();
Can_config_rx();
break;
//------------
case CMD_REPLY:
for (cpt=0;cpt<cmd->dlc;cpt++) CANMSG = *(cmd->pt_data + cpt);
u32_temp=0; Can_set_ext_msk(u32_temp);
cmd->ctrl.rtr=1; Can_set_rtrmsk(); Can_set_rtr();
Can_set_rplv();
Can_clear_idemsk();
Can_config_rx();
break;
//------------
case CMD_REPLY_MASKED:
if (cmd->ctrl.ide){ Can_set_ext_id(cmd->id.ext);}
else { Can_set_std_id(cmd->id.std);}
for (cpt=0;cpt<cmd->dlc;cpt++) CANMSG = *(cmd->pt_data + cpt);
u32_temp=~0; Can_set_ext_msk(u32_temp);
cmd->ctrl.rtr=1; Can_set_rtrmsk(); Can_set_rtr();
Can_set_rplv();
Can_set_idemsk();
Can_config_rx();
break;
//------------
default:
// case CMD_NONE or not implemented command
cmd->status = STATUS_CLEARED;
break;
//------------
} // switch (cmd ...
} // if (mob_handle ...
else
{
cmd->status = MOB_NOT_REACHED;
return CAN_CMD_REFUSED;
}
} // else of no CMD_ABORT
return CAN_CMD_ACCEPTED;
}
//------------------------------------------------------------------------------
//------------------------------------------------------------------------------
U8 can_get_status (st_cmd_t* cmd)
{
U8 a_status, rtn_val;
a_status = cmd->status;
if ((a_status==STATUS_CLEARED)||(a_status==MOB_NOT_REACHED)||(a_status==MOB_DISABLE))
{
return CAN_STATUS_ERROR;
}
Can_set_mob(cmd->handle);
a_status = can_get_mob_status();
switch (a_status)
{
case MOB_NOT_COMPLETED:
// cmd->status not updated
rtn_val = CAN_STATUS_NOT_COMPLETED;
break;
//---------------
case MOB_RX_COMPLETED:
case MOB_RX_COMPLETED_DLCW:
cmd->dlc = Can_get_dlc();
can_get_data(cmd->pt_data);
cmd->ctrl.rtr = Can_get_rtr();
if (Can_get_ide()) // if extended frame
{
cmd->ctrl.ide = 1; // extended frame
Can_get_ext_id(cmd->id.ext);
}
else // else standard frame
{
cmd->ctrl.ide = 0;
Can_get_std_id(cmd->id.std);
}
// Status field of descriptor: 0x20 if Rx completed
// Status field of descriptor: 0xA0 if Rx completed with DLCWarning
cmd->status = a_status;
Can_mob_abort(); // Freed the MOB
Can_clear_status_mob(); // and reset MOb status
rtn_val = CAN_STATUS_COMPLETED;
break;
//---------------
case MOB_TX_COMPLETED:
// Status field of descriptor: 0x40 if Tx completed
cmd->status = a_status;
Can_mob_abort(); // Freed the MOB
Can_clear_status_mob(); // and reset MOb status
rtn_val = CAN_STATUS_COMPLETED;
break;
//---------------
default:
// Status field of descriptor: (bin)000b.scfa if MOb error
cmd->status = a_status;
Can_mob_abort(); // Freed the MOB
Can_clear_status_mob(); // and reset MOb status
rtn_val = CAN_STATUS_ERROR;
break;
} // switch (a_status...
return (rtn_val);
}
//ZX加CAN——BUS通信
//extern st_cmd_t message;
//extern U8 buffer[8];
uchar CAN_SHOU(uchar *p)
{
U8 i, u8_temp;
U8 led_out = 0;
// --- Rx Command
//==================================
message.pt_data = &buffer[0];
for(i=0; i<8; i++) buffer[i]=0; // --- Init Rx data
message.cmd = CMD_RX;//_DATA_MASKED;//REMOTE_MASKED;//_DATA_MASKED;//CMD_RX_DATA;// // --- Rx Command
//========================
message.id.ext = 0x7e0;
message.ctrl.ide = 1;
//========================
while(can_cmd(&message) != CAN_CMD_ACCEPTED); // --- Enable Rx
while(1)
{ // --- Wait for Rx completed
u8_temp = can_get_status(&message);
if (u8_temp != CAN_STATUS_NOT_COMPLETED) break; // Out of while
}
// if (u8_temp == CAN_STATUS_ERROR) break; // Out of the function
for(i=0;i<8;i++)
{
*p = buffer[i];
p++;
}
if(message.dlc >8)
*p = 8;
else
*p = message.dlc;
if(u8_temp == CAN_STATUS_ERROR)
return 1;
else
return 0;
}
//==========================================================
uchar CAN_FA(uchar gs,uchar *p)
{
U8 i, u8_temp;
U8 led_out = 0;
// --- Tx Command
//===========================
message.pt_data = &buffer[0];
for(i=0; i<8; i++)
{
buffer[i]=*p;
p++;
}
//=============================
message.id.ext = 0x7e8;
message.ctrl.ide = 1;
//==============================
message.dlc = gs;
message.cmd = CMD_TX;//_REMOTE;//CMD_TX_DATA;
while(can_cmd(&message) != CAN_CMD_ACCEPTED); // --- Enable Tx
while(1) // --- Wait for Tx completed
{
u8_temp = can_get_status(&message);
if (u8_temp != CAN_STATUS_NOT_COMPLETED) break; // Out of while
}
//zx if (u8_temp == CAN_STATUS_ERROR) break; // ---- Exit if CAN error(s)
if(u8_temp == CAN_STATUS_ERROR)
return 1;
else
return 0;
}
//==========================================================
void CAN_INIT(void)
{
CLKPR = 0x80; CLKPR = 0x00;
CAN_PORT_DIR &= ~(1<<CAN_INPUT_PIN );
CAN_PORT_DIR &= ~(1<<CAN_OUTPUT_PIN);
CAN_PORT_OUT |= (1<<CAN_INPUT_PIN );
CAN_PORT_OUT |= (1<<CAN_OUTPUT_PIN);
DDRB = 0XFF;
PORTB = 0X00;
Can_reset();
can_init((U16)CAN_BAUDRATE);
CANTCON = CANBT1;
}
//============================================================
uchar CAN_TEST_SHOU(uchar *p,U32 *p1)
{
U8 i, u8_temp;
U8 led_out = 0;
// --- Rx Command
//==================================
message.pt_data = &buffer[0];
for(i=0; i<8; i++) buffer[i]=0; // --- Init Rx data
message.cmd = CMD_RX;//_DATA_MASKED;//REMOTE_MASKED;//_DATA_MASKED;//CMD_RX_DATA;// // --- Rx Command
//========================
message.id.ext = 0x7e0;
message.ctrl.ide = 1;
//========================
while(can_cmd(&message) != CAN_CMD_ACCEPTED); // --- Enable Rx
while(1)
{ // --- Wait for Rx completed
u8_temp = can_get_status(&message);
if (u8_temp != CAN_STATUS_NOT_COMPLETED) break; // Out of while
}
// if (u8_temp == CAN_STATUS_ERROR) break; // Out of the function
*p1 = message.id.ext;
for(i=0;i<8;i++)
{
*p = buffer[i];
p++;
}
if(message.dlc >8)
*p = 8;
else
*p = message.dlc;
if(u8_temp == CAN_STATUS_ERROR)
return 1;
else
return 0;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -